More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,937 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 14363261 | 844 days ago | IN | 0 ETH | 0.00123393 | ||||
Redeem | 14283936 | 857 days ago | IN | 0 ETH | 0.00204696 | ||||
Deposit | 14279583 | 857 days ago | IN | 0 ETH | 0.00192003 | ||||
Redeem | 14153186 | 877 days ago | IN | 0 ETH | 0.00400208 | ||||
Redeem | 14113999 | 883 days ago | IN | 0 ETH | 0.01842555 | ||||
Redeem | 14023748 | 897 days ago | IN | 0 ETH | 0.00675596 | ||||
Redeem | 14015012 | 898 days ago | IN | 0 ETH | 0.00871091 | ||||
Redeem | 13945645 | 909 days ago | IN | 0 ETH | 0.00721883 | ||||
Redeem | 13918755 | 913 days ago | IN | 0 ETH | 0.00399777 | ||||
Redeem | 13908852 | 915 days ago | IN | 0 ETH | 0.00718755 | ||||
Redeem | 13906718 | 915 days ago | IN | 0 ETH | 0.00616557 | ||||
Redeem | 13888815 | 918 days ago | IN | 0 ETH | 0.00664189 | ||||
Redeem | 13886981 | 918 days ago | IN | 0 ETH | 0.00260387 | ||||
Redeem | 13886381 | 918 days ago | IN | 0 ETH | 0.00325166 | ||||
Redeem | 13886161 | 918 days ago | IN | 0 ETH | 0.00377183 | ||||
Redeem | 13870578 | 920 days ago | IN | 0 ETH | 0.00418647 | ||||
Redeem | 13869642 | 921 days ago | IN | 0 ETH | 0.02498792 | ||||
Redeem | 13850557 | 924 days ago | IN | 0 ETH | 0.00511671 | ||||
Redeem | 13849019 | 924 days ago | IN | 0 ETH | 0.00370054 | ||||
Redeem | 13846732 | 924 days ago | IN | 0 ETH | 0.00336984 | ||||
Redeem | 13841579 | 925 days ago | IN | 0 ETH | 0.00249739 | ||||
Redeem | 13833371 | 926 days ago | IN | 0 ETH | 0.00210707 | ||||
Redeem | 13830725 | 927 days ago | IN | 0 ETH | 0.00399887 | ||||
Redeem | 13826798 | 927 days ago | IN | 0 ETH | 0.00598905 | ||||
Redeem | 13823454 | 928 days ago | IN | 0 ETH | 0.01897931 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OlympusBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-04 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipPushed( address(0), _owner ); } function policy() public view override returns (address) { return _owner; } modifier onlyPolicy() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceManagement() public virtual override onlyPolicy() { emit OwnershipPushed( _owner, address(0) ); _owner = address(0); } function pushManagement( address newOwner_ ) public virtual override onlyPolicy() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed( _owner, newOwner_ ); _newOwner = newOwner_; } function pullManagement() public virtual override { require( msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled( _owner, _newOwner ); _owner = _newOwner; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } 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"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } 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"); } 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, 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); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address( this ), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } 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)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { 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)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { 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"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); function mintRewards( address _recipient, uint _amount ) external; } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; } contract OlympusBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; /* ======== EVENTS ======== */ event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint payout, uint remaining ); event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable OHM; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints OHM when receives principle address public immutable DAO; // receives profit share from bond AggregatorV3Interface internal priceFeed; address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping( address => Bond ) public bondInfo; // stores bond information for depositors uint public totalDebt; // total value of outstanding bonds; used for pricing uint public lastDecay; // reference block for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint controlVariable; // scaling variable for price uint vestingTerm; // in blocks uint minimumPrice; // vs principle value. 4 decimals (1500 = 0.15) uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt } // Info for bond holder struct Bond { uint payout; // OHM remaining to be paid uint vesting; // Blocks left to vest uint lastBlock; // Last interaction uint pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _OHM, address _principle, address _treasury, address _DAO, address _feed ) { require( _OHM != address(0) ); OHM = _OHM; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; require( _feed != address(0) ); priceFeed = AggregatorV3Interface( _feed ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint _controlVariable, uint _vestingTerm, uint _minimumPrice, uint _maxPayout, uint _maxDebt, uint _initialDebt ) external onlyPolicy() { require( currentDebt() == 0, "Debt must be 0 for initialization" ); terms = Terms ({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, maxDebt: _maxDebt }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, DEBT } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() { if ( _parameter == PARAMETER.VESTING ) { // 0 require( _input >= 10000, "Vesting must be longer than 36 hours" ); terms.vestingTerm = _input; } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 1000, "Payout cannot be above 1 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment ( bool _addition, uint _increment, uint _target, uint _buffer ) external onlyPolicy() { require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external returns ( uint ) { require( _depositor != address(0), "Invalid address" ); decayDebt(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 OHM ( underflow protection ) require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage /** asset carries risk and is not minted against asset transfered to treasury and rewards minted as payout */ IERC20( principle ).safeTransferFrom( msg.sender, treasury, _amount ); ITreasury( treasury ).mintRewards( address(this), payout ); // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { Bond memory info = bondInfo[ _recipient ]; uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining) if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ), lastBlock: block.number, pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( OHM ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( OHM ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( OHM ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer ); if( adjustment.rate != 0 && block.number >= blockCanAdjust ) { uint initial = terms.controlVariable; if ( adjustment.add ) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if ( terms.controlVariable >= adjustment.target ) { adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable.sub( adjustment.rate ); if ( terms.controlVariable <= adjustment.target ) { adjustment.rate = 0; } } adjustment.lastBlock = block.number; emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = block.number; } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( OHM ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e14 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).div( 1e5 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).div( 1e5 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice get asset price from chainlink */ function assetPrice() public view returns (int) { ( , int price, , , ) = priceFeed.latestRoundData(); return price; } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { price_ = bondPrice().mul( uint( assetPrice() ) ).mul( 1e6 ); } /** * @notice calculate current ratio of debt to OHM supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( OHM ).totalSupply(); debtRatio_ = FixedPoint.fraction( currentDebt().mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** * @notice debt ratio in same terms as reserve bonds * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { return debtRatio().mul( uint( assetPrice() ) ).div( 1e8 ); // ETH feed is 8 decimals } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns ( uint ) { return totalDebt.sub( debtDecay() ); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns ( uint decay_ ) { uint blocksSinceLast = block.number.sub( lastDecay ); decay_ = totalDebt.mul( blocksSinceLast ).div( terms.vestingTerm ); if ( decay_ > totalDebt ) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) { Bond memory bond = bondInfo[ _depositor ]; uint blocksSinceLast = block.number.sub( bond.lastBlock ); uint vesting = bond.vesting; if ( vesting > 0 ) { percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of OHM available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = bondInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or OHM) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != OHM ); require( _token != principle ); IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) ); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_OHM","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_feed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OHM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OlympusBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620027be380380620027be833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000b557600080fd5b6001600160601b0319606086901b166080526001600160a01b038416620000db57600080fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200010157600080fd5b6001600160601b0319606084901b1660c0526001600160a01b0382166200012757600080fd5b6001600160601b0319606083901b1660e0526001600160a01b0381166200014d57600080fd5b600280546001600160a01b039092166001600160a01b03199092169190911790555050505060805160601c60a05160601c60c05160601c60e05160601c6125c9620001f56000398061132552806113f0525080610d2a5280610f98528061112c528061117852508061057a5280610fc7528061110952806113ae525080611349528061136f52806114cd528061172052806118a5528061198c5280611a9e52506125c96000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80637b2617271161011a578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610550578063e0176de814610558578063e392a26214610560578063f5c2ab5b14610568578063fc7b9c181461057057610206565b8063cea55f57146104df578063d24378eb146104e7578063d4d863ce146104ef578063d50256251461051d57610206565b806398fabd3a116100e957806398fabd3a1461045d578063a6c41fec14610465578063b4abccba1461046d578063cd1234b31461049357610206565b80637b261727146103e0578063844b5c7c1461041b5780638dbdbe6d14610423578063904b3ece1461045557610206565b8063451ee4a11161019d5780635a96ac0a1161016c5780635a96ac0a146103a357806361d027b3146103ab578063759076e5146103b357806377b81895146103bb5780637927ebf8146103c357610206565b8063451ee4a11461031a57806346f68ee91461034f5780634cf088d914610375578063507930ec1461037d57610206565b80631a3d0068116101d95780631a3d0068146102795780631e321a0f146102aa5780631feed31f146102d05780632f3f470a146102fe57610206565b8063016a42841461020b57806301b88ee81461022f5780630505c8c914610267578063089208d81461026f575b600080fd5b610213610578565b604080516001600160a01b039092168252519081900360200190f35b6102556004803603602081101561024557600080fd5b50356001600160a01b031661059c565b60408051918252519081900360200190f35b6102136105f5565b610277610605565b005b6102776004803603608081101561028f57600080fd5b5080351515906020810135906040810135906060013561069c565b610277600480360360408110156102c057600080fd5b5060ff8135169060200135610794565b610255600480360360408110156102e657600080fd5b506001600160a01b03813516906020013515156108d3565b610306610ac8565b604080519115158252519081900360200190f35b610322610ad8565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102776004803603602081101561036557600080fd5b50356001600160a01b0316610af0565b610213610bdd565b6102556004803603602081101561039357600080fd5b50356001600160a01b0316610bec565b610277610c7e565b610213610d28565b610255610d4c565b610213610d67565b610255600480360360208110156103d957600080fd5b5035610d76565b610277600480360360c08110156103f657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135610d9b565b610255610e74565b6102556004803603606081101561043957600080fd5b50803590602081013590604001356001600160a01b0316610e96565b610255611306565b610213611323565b610213611347565b6103066004803603602081101561048357600080fd5b50356001600160a01b031661136b565b6104b9600480360360208110156104a957600080fd5b50356001600160a01b03166114a1565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102556114c8565b610255611580565b6102776004803603604081101561050557600080fd5b506001600160a01b0381351690602001351515611606565b6105256116c9565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102556116db565b61025561170c565b6102556117a9565b6102556117ee565b6102556117f4565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806105a883610bec565b6001600160a01b0384166000908152600f602052604090205490915061271082106105d5578092506105ee565b6105eb6127106105e583856117fa565b9061185a565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610652576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146106e9576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b6005546106ff906103e8906105e59060196117fa565b831115610749576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b60008260028111156107ef57fe5b1415610840576127108110156108365760405162461bcd60e51b81526004018080602001828103825260248152602001806125466024913960400191505060405180910390fd5b60068190556108cf565b600182600281111561084e57fe5b14156108b5576103e88111156108ab576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b60088190556108cf565b60028260028111156108c357fe5b14156108cf5760098190555b5050565b60006108dd612418565b506001600160a01b0383166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301919091526003015460608201529061093085610bec565b905061271081106109c0576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a26109b78585846000015161189c565b92505050610ac2565b81516000906109d790612710906105e590856117fa565b905060405180608001604052806109fb838660000151611b9f90919063ffffffff16565b8152602001610a25610a1a866040015143611b9f90919063ffffffff16565b602087015190611b9f565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610abc86868361189c565b93505050505b92915050565b600454600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610b3d576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b6001600160a01b038116610b825760405162461bcd60e51b81526004018080602001828103825260268152602001806124536026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b6000610bf6612418565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610c4c904390611b9f565b60208301519091508015610c7157610c6a816105e5846127106117fa565b9350610c76565b600093505b505050919050565b6001546001600160a01b03163314610cc75760405162461bcd60e51b81526004018080602001828103825260228152602001806124796022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610d62610d596117a9565b60105490611b9f565b905090565b6004546001600160a01b031681565b6000610ac2655af3107a40006105e5610d9685610d916116db565b611be1565b611d58565b6000546001600160a01b03163314610de8576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b610df0610d4c565b15610e2c5760405162461bcd60e51b81526004018080602001828103825260218152602001806124c16021913960400191505060405180910390fd5b6040805160a081018252878152602081018790529081018590526060810184905260800182905260059590955560069390935560079190915560085560095560105543601155565b6000610d62620f4240610e90610e88611580565b610e906116db565b906117fa565b60006001600160a01b038216610ee5576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b610eed611d70565b6009546010541115610f3d576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000610f47610e74565b90506000610f53611d84565b905080851015610f945760405162461bcd60e51b81526004018080602001828103825260238152602001806125236023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561102b57600080fd5b505afa15801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b50519050600061106482610d76565b9050629896808110156110af576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6110b761170c565b8111156110fc576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6111516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f00000000000000000000000000000000000000000000000000000000000000008b611dbe565b604080516335106f4960e11b81523060048201526024810183905290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691636a20de9291604480830192600092919082900301818387803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b50506010546111e59250905083611e1e565b601055604080516080810182526001600160a01b0388166000908152600f602052919091205481906112179084611e1e565b81526006805460208084019190915243604080850182905260609485018a90526001600160a01b038c166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554859161127c91611e1e565b604080518b8152905184917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a46112ba6114c8565b6112c2611d84565b6112ca610e74565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a46112fb611e78565b979650505050505050565b6000610d626305f5e1006105e561131b611580565b610e906114c8565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156113ac57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156113eb57600080fd5b6114997f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d602081101561148657600080fd5b50516001600160a01b0385169190611f58565b506001919050565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561152457600080fd5b505afa158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b5051905061157a670de0b6b3a76400006105e5610d96611574633b9aca00610e90610d4c565b85611be1565b91505090565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d60a08110156115fb57600080fd5b506020015191505090565b6000546001600160a01b03163314611653576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b6001600160a01b03821661166657600080fd5b801561169b5760048054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b0384161790556108cf565b6004805460ff60a01b19169055600380546001600160a01b0384166001600160a01b03199091161790555050565b60055460065460075460085460095485565b60006116f8620186a06105e56116ef6114c8565b600554906117fa565b600754909150811015610602575060075490565b6000610d62620186a06105e56005600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177757600080fd5b505afa15801561178b573d6000803e3d6000fd5b505050506040513d60208110156117a157600080fd5b5051906117fa565b6000806117c160115443611b9f90919063ffffffff16565b6006546010549192506117d8916105e590846117fa565b91506010548211156117ea5760105491505b5090565b60115481565b60105481565b60008261180957506000610ac2565b8282028284828161181657fe5b04146118535760405162461bcd60e51b81526004018080602001828103825260218152602001806124e26021913960400191505060405180910390fd5b9392505050565b600061185383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611faf565b60008261194c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561191a57600080fd5b505af115801561192e573d6000803e3d6000fd5b505050506040513d602081101561194457600080fd5b50611b989050565b600454600160a01b900460ff1615611a7257600480546040805163095ea7b360e01b81526001600160a01b039283169381019390935260248301859052517f00000000000000000000000000000000000000000000000000000000000000009091169163095ea7b39160448083019260209291908290030181600087803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b505050506040513d6020811015611a0057600080fd5b50506004805460408051637acb775760e01b81529283018590526001600160a01b0387811660248501529051911691637acb775791604480830192600092919082900301818387803b158015611a5557600080fd5b505af1158015611a69573d6000803e3d6000fd5b50505050611b98565b6003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050506040513d6020811015611b1357600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b505050506040513d6020811015611b9557600080fd5b50505b5092915050565b600061185383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612051565b611be9612440565b60008211611c285760405162461bcd60e51b815260040180806020018281038252602681526020018061249b6026913960400191505060405180910390fd5b82611c425750604080516020810190915260008152610ac2565b71ffffffffffffffffffffffffffffffffffff8311611ce957600082607085901b81611c6a57fe5b0490506001600160e01b03811115611cc9576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610ac2565b6000611cfa84600160701b856120ab565b90506001600160e01b03811115611cc9576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b611d7b610d596117a9565b60105543601155565b6000611d98620186a06105e56116ef6114c8565b600754909150811015611dae5750600754610602565b6007541561060257600060075590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611e18908590612140565b50505050565b600082820183811015611853576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e54600091611e8b9190611e1e565b600b5490915015801590611e9f5750804310155b15611f5557600554600a5460ff1615611ed957600b54600554611ec191611e1e565b6005819055600c5411611ed4576000600b555b611efb565b600b54600554611ee891611b9f565b6005819055600c5410611efb576000600b555b43600e55600554600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611faa908490612140565b505050565b6000818361203b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612000578181015183820152602001611fe8565b50505050905090810190601f16801561202d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161204757fe5b0495945050505050565b600081848411156120a35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612000578181015183820152602001611fe8565b505050900390565b60008060006120ba86866121f1565b91509150600084806120c857fe5b8688099050828111156120dc576001820391505b8083039250848210612135576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6112fb83838761221e565b6060612195826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661228e9092919063ffffffff16565b805190915015611faa578080602001905160208110156121b457600080fd5b5051611faa5760405162461bcd60e51b815260040180806020018281038252602a81526020018061256a602a913960400191505060405180910390fd5b6000808060001984860990508385029250828103915082811015612216576001820391505b509250929050565b6000818103821680838161222e57fe5b04925080858161223a57fe5b04945080816000038161224957fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b606061229d84846000856122a5565b949350505050565b60606122b085612412565b612301576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123405780518252601f199092019160209182019101612321565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146123a2576040519150601f19603f3d011682016040523d82523d6000602084013e6123a7565b606091505b509150915081156123bb57915061229d9050565b8051156123cb5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612000578181015183820152602001611fe8565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212206a7c4f78cdd8e0d8c4ac4124a8d5f2775184e571f558616dabf5ad061c5978dc64736f6c63430007050033000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c80637b2617271161011a578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610550578063e0176de814610558578063e392a26214610560578063f5c2ab5b14610568578063fc7b9c181461057057610206565b8063cea55f57146104df578063d24378eb146104e7578063d4d863ce146104ef578063d50256251461051d57610206565b806398fabd3a116100e957806398fabd3a1461045d578063a6c41fec14610465578063b4abccba1461046d578063cd1234b31461049357610206565b80637b261727146103e0578063844b5c7c1461041b5780638dbdbe6d14610423578063904b3ece1461045557610206565b8063451ee4a11161019d5780635a96ac0a1161016c5780635a96ac0a146103a357806361d027b3146103ab578063759076e5146103b357806377b81895146103bb5780637927ebf8146103c357610206565b8063451ee4a11461031a57806346f68ee91461034f5780634cf088d914610375578063507930ec1461037d57610206565b80631a3d0068116101d95780631a3d0068146102795780631e321a0f146102aa5780631feed31f146102d05780632f3f470a146102fe57610206565b8063016a42841461020b57806301b88ee81461022f5780630505c8c914610267578063089208d81461026f575b600080fd5b610213610578565b604080516001600160a01b039092168252519081900360200190f35b6102556004803603602081101561024557600080fd5b50356001600160a01b031661059c565b60408051918252519081900360200190f35b6102136105f5565b610277610605565b005b6102776004803603608081101561028f57600080fd5b5080351515906020810135906040810135906060013561069c565b610277600480360360408110156102c057600080fd5b5060ff8135169060200135610794565b610255600480360360408110156102e657600080fd5b506001600160a01b03813516906020013515156108d3565b610306610ac8565b604080519115158252519081900360200190f35b610322610ad8565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102776004803603602081101561036557600080fd5b50356001600160a01b0316610af0565b610213610bdd565b6102556004803603602081101561039357600080fd5b50356001600160a01b0316610bec565b610277610c7e565b610213610d28565b610255610d4c565b610213610d67565b610255600480360360208110156103d957600080fd5b5035610d76565b610277600480360360c08110156103f657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135610d9b565b610255610e74565b6102556004803603606081101561043957600080fd5b50803590602081013590604001356001600160a01b0316610e96565b610255611306565b610213611323565b610213611347565b6103066004803603602081101561048357600080fd5b50356001600160a01b031661136b565b6104b9600480360360208110156104a957600080fd5b50356001600160a01b03166114a1565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102556114c8565b610255611580565b6102776004803603604081101561050557600080fd5b506001600160a01b0381351690602001351515611606565b6105256116c9565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102556116db565b61025561170c565b6102556117a9565b6102556117ee565b6102556117f4565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000806105a883610bec565b6001600160a01b0384166000908152600f602052604090205490915061271082106105d5578092506105ee565b6105eb6127106105e583856117fa565b9061185a565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610652576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146106e9576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b6005546106ff906103e8906105e59060196117fa565b831115610749576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b60008260028111156107ef57fe5b1415610840576127108110156108365760405162461bcd60e51b81526004018080602001828103825260248152602001806125466024913960400191505060405180910390fd5b60068190556108cf565b600182600281111561084e57fe5b14156108b5576103e88111156108ab576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b60088190556108cf565b60028260028111156108c357fe5b14156108cf5760098190555b5050565b60006108dd612418565b506001600160a01b0383166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301919091526003015460608201529061093085610bec565b905061271081106109c0576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a26109b78585846000015161189c565b92505050610ac2565b81516000906109d790612710906105e590856117fa565b905060405180608001604052806109fb838660000151611b9f90919063ffffffff16565b8152602001610a25610a1a866040015143611b9f90919063ffffffff16565b602087015190611b9f565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610abc86868361189c565b93505050505b92915050565b600454600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610b3d576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b6001600160a01b038116610b825760405162461bcd60e51b81526004018080602001828103825260268152602001806124536026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031681565b6000610bf6612418565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610c4c904390611b9f565b60208301519091508015610c7157610c6a816105e5846127106117fa565b9350610c76565b600093505b505050919050565b6001546001600160a01b03163314610cc75760405162461bcd60e51b81526004018080602001828103825260228152602001806124796022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e881565b6000610d62610d596117a9565b60105490611b9f565b905090565b6004546001600160a01b031681565b6000610ac2655af3107a40006105e5610d9685610d916116db565b611be1565b611d58565b6000546001600160a01b03163314610de8576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b610df0610d4c565b15610e2c5760405162461bcd60e51b81526004018080602001828103825260218152602001806124c16021913960400191505060405180910390fd5b6040805160a081018252878152602081018790529081018590526060810184905260800182905260059590955560069390935560079190915560085560095560105543601155565b6000610d62620f4240610e90610e88611580565b610e906116db565b906117fa565b60006001600160a01b038216610ee5576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b610eed611d70565b6009546010541115610f3d576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000610f47610e74565b90506000610f53611d84565b905080851015610f945760405162461bcd60e51b81526004018080602001828103825260238152602001806125236023913960400191505060405180910390fd5b60007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e86001600160a01b0316631eec5a9a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561102b57600080fd5b505afa15801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b50519050600061106482610d76565b9050629896808110156110af576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6110b761170c565b8111156110fc576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6111516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216337f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e88b611dbe565b604080516335106f4960e11b81523060048201526024810183905290516001600160a01b037f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e81691636a20de9291604480830192600092919082900301818387803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b50506010546111e59250905083611e1e565b601055604080516080810182526001600160a01b0388166000908152600f602052919091205481906112179084611e1e565b81526006805460208084019190915243604080850182905260609485018a90526001600160a01b038c166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554859161127c91611e1e565b604080518b8152905184917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a46112ba6114c8565b6112c2611d84565b6112ca610e74565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a46112fb611e78565b979650505050505050565b6000610d626305f5e1006105e561131b611580565b610e906114c8565b7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b81565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89981565b60007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b0316826001600160a01b031614156113ac57600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316826001600160a01b031614156113eb57600080fd5b6114997f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d602081101561148657600080fd5b50516001600160a01b0385169190611f58565b506001919050565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561152457600080fd5b505afa158015611538573d6000803e3d6000fd5b505050506040513d602081101561154e57600080fd5b5051905061157a670de0b6b3a76400006105e5610d96611574633b9aca00610e90610d4c565b85611be1565b91505090565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156115d157600080fd5b505afa1580156115e5573d6000803e3d6000fd5b505050506040513d60a08110156115fb57600080fd5b506020015191505090565b6000546001600160a01b03163314611653576040805162461bcd60e51b81526020600482018190526024820152600080516020612503833981519152604482015290519081900360640190fd5b6001600160a01b03821661166657600080fd5b801561169b5760048054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b0384161790556108cf565b6004805460ff60a01b19169055600380546001600160a01b0384166001600160a01b03199091161790555050565b60055460065460075460085460095485565b60006116f8620186a06105e56116ef6114c8565b600554906117fa565b600754909150811015610602575060075490565b6000610d62620186a06105e56005600301547f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177757600080fd5b505afa15801561178b573d6000803e3d6000fd5b505050506040513d60208110156117a157600080fd5b5051906117fa565b6000806117c160115443611b9f90919063ffffffff16565b6006546010549192506117d8916105e590846117fa565b91506010548211156117ea5760105491505b5090565b60115481565b60105481565b60008261180957506000610ac2565b8282028284828161181657fe5b04146118535760405162461bcd60e51b81526004018080602001828103825260218152602001806124e26021913960400191505060405180910390fd5b9392505050565b600061185383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611faf565b60008261194c577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561191a57600080fd5b505af115801561192e573d6000803e3d6000fd5b505050506040513d602081101561194457600080fd5b50611b989050565b600454600160a01b900460ff1615611a7257600480546040805163095ea7b360e01b81526001600160a01b039283169381019390935260248301859052517f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8999091169163095ea7b39160448083019260209291908290030181600087803b1580156119d657600080fd5b505af11580156119ea573d6000803e3d6000fd5b505050506040513d6020811015611a0057600080fd5b50506004805460408051637acb775760e01b81529283018590526001600160a01b0387811660248501529051911691637acb775791604480830192600092919082900301818387803b158015611a5557600080fd5b505af1158015611a69573d6000803e3d6000fd5b50505050611b98565b6003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8999092169163095ea7b3916044808201926020929091908290030181600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050506040513d6020811015611b1357600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611b6b57600080fd5b505af1158015611b7f573d6000803e3d6000fd5b505050506040513d6020811015611b9557600080fd5b50505b5092915050565b600061185383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612051565b611be9612440565b60008211611c285760405162461bcd60e51b815260040180806020018281038252602681526020018061249b6026913960400191505060405180910390fd5b82611c425750604080516020810190915260008152610ac2565b71ffffffffffffffffffffffffffffffffffff8311611ce957600082607085901b81611c6a57fe5b0490506001600160e01b03811115611cc9576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610ac2565b6000611cfa84600160701b856120ab565b90506001600160e01b03811115611cc9576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b611d7b610d596117a9565b60105543601155565b6000611d98620186a06105e56116ef6114c8565b600754909150811015611dae5750600754610602565b6007541561060257600060075590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611e18908590612140565b50505050565b600082820183811015611853576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e54600091611e8b9190611e1e565b600b5490915015801590611e9f5750804310155b15611f5557600554600a5460ff1615611ed957600b54600554611ec191611e1e565b6005819055600c5411611ed4576000600b555b611efb565b600b54600554611ee891611b9f565b6005819055600c5410611efb576000600b555b43600e55600554600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611faa908490612140565b505050565b6000818361203b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612000578181015183820152602001611fe8565b50505050905090810190601f16801561202d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161204757fe5b0495945050505050565b600081848411156120a35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612000578181015183820152602001611fe8565b505050900390565b60008060006120ba86866121f1565b91509150600084806120c857fe5b8688099050828111156120dc576001820391505b8083039250848210612135576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6112fb83838761221e565b6060612195826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661228e9092919063ffffffff16565b805190915015611faa578080602001905160208110156121b457600080fd5b5051611faa5760405162461bcd60e51b815260040180806020018281038252602a81526020018061256a602a913960400191505060405180910390fd5b6000808060001984860990508385029250828103915082811015612216576001820391505b509250929050565b6000818103821680838161222e57fe5b04925080858161223a57fe5b04945080816000038161224957fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b606061229d84846000856122a5565b949350505050565b60606122b085612412565b612301576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123405780518252601f199092019160209182019101612321565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146123a2576040519150601f19603f3d011682016040523d82523d6000602084013e6123a7565b606091505b509150915081156123bb57915061229d9050565b8051156123cb5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612000578181015183820152602001611fe8565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212206a7c4f78cdd8e0d8c4ac4124a8d5f2775184e571f558616dabf5ad061c5978dc64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
-----Decoded View---------------
Arg [0] : _OHM (address): 0x383518188C0C6d7730D91b2c03a03C837814a899
Arg [1] : _principle (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _treasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [3] : _DAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [4] : _feed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [4] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode Sourcemap
22031:16221:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22746:34;;;:::i;:::-;;;;-1:-1:-1;;;;;22746:34:0;;;;;;;;;;;;;;37397:400;;;;;;;;;;;;;;;;-1:-1:-1;37397:400:0;-1:-1:-1;;;;;37397:400:0;;:::i;:::-;;;;;;;;;;;;;;;;693:89;;;:::i;918:158::-;;;:::i;:::-;;27044:466;;;;;;;;;;;;;;;;-1:-1:-1;27044:466:0;;;;;;;;;;;;;;;;;;;:::i;26298:550::-;;;;;;;;;;;;;;;;-1:-1:-1;26298:550:0;;;;;;;;;:::i;30219:1206::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30219:1206:0;;;;;;;;;;:::i;23145:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;23230:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;-1:-1:-1;1084:260:0;-1:-1:-1;;;;;1084:260:0;;:::i;23014:22::-;;;:::i;36798:427::-;;;;;;;;;;;;;;;;-1:-1:-1;36798:427:0;-1:-1:-1;;;;;36798:427:0;;:::i;1356:221::-;;;:::i;22816:33::-;;;:::i;36141:106::-;;;:::i;23067:28::-;;;:::i;33953:161::-;;;;;;;;;;;;;;;;-1:-1:-1;33953:161:0;;:::i;25439:618::-;;;;;;;;;;;;;;;;-1:-1:-1;25439:618:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35235:140::-;;;:::i;28190:1878::-;;;;;;;;;;;;;;;;-1:-1:-1;28190:1878:0;;;;;;;;;;;-1:-1:-1;;;;;28190:1878:0;;:::i;35876:166::-;;;:::i;22893:28::-;;;:::i;22676:::-;;;:::i;37981:268::-;;;;;;;;;;;;;;;;-1:-1:-1;37981:268:0;-1:-1:-1;;;;;37981:268:0;;:::i;23296:42::-;;;;;;;;;;;;;;;;-1:-1:-1;23296:42:0;-1:-1:-1;;;;;23296:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35499:270;;;:::i;34990:140::-;;;:::i;27643:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27643:318:0;;;;;;;;;;:::i;23175:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34219:243;;;:::i;33684:140::-;;;:::i;36349:286::-;;;:::i;23471:21::-;;;:::i;23389:::-;;;:::i;22746:34::-;;;:::o;37397:400::-;37469:19;37502:18;37523:30;37541:10;37523:16;:30::i;:::-;-1:-1:-1;;;;;37578:22:0;;37564:11;37578:22;;;:8;:22;;;;;:29;37502:51;;-1:-1:-1;37642:5:0;37625:22;;37620:170;;37682:6;37665:23;;37620:170;;;37738:40;37771:5;37738:27;:6;37750:13;37738:10;:27::i;:::-;:31;;:40::i;:::-;37721:57;;37620:170;37397:400;;;;;:::o;693:89::-;741:7;768:6;-1:-1:-1;;;;;768:6:0;693:89;;:::o;918:158::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;1034:1:::1;1018:6:::0;;1001:37:::1;::::0;-1:-1:-1;;;;;1018:6:0;;::::1;::::0;1001:37:::1;::::0;1034:1;;1001:37:::1;1066:1;1049:19:::0;;-1:-1:-1;;;;;;1049:19:0::1;::::0;;918:158::o;27044:466::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;27231:5:::1;:21:::0;:43:::1;::::0;27268:4:::1;::::0;27231:31:::1;::::0;27258:2:::1;27231:25;:31::i;:43::-;27217:10;:57;;27208:91;;;::::0;;-1:-1:-1;;;27208:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27208:91:0;;;;;;;;;;;;;::::1;;27325:177;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;27478:12:::1;27325:177:::0;;;;;;;27312:10:::1;:190:::0;;-1:-1:-1;;27312:190:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;27044:466::o;26298:550::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;26410:17:::1;26396:10;:31;;;;;;;;;26391:450;;;26469:5;26459:6;:15;;26450:66;;;;-1:-1:-1::0;;;26450:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26531:17:::0;:26;;;26391:450:::1;;;26594:16;26580:10;:30;;;;;;;;;26575:266;;;26652:4;26642:6;:14;;26633:61;;;::::0;;-1:-1:-1;;;26633:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26709:15:::0;:24;;;26575:266:::1;;;26770:14;26756:10;:28;;;;;;;;;26751:90;;;26807:13:::0;:22;;;26751:90:::1;26298:550:::0;;:::o;30219:1206::-;30289:4;30315:16;;:::i;:::-;-1:-1:-1;;;;;;30334:22:0;;;;;;:8;:22;;;;;;;;30315:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30388:30;30344:10;30388:16;:30::i;:::-;30367:51;;30513:5;30496:13;:22;30491:927;;-1:-1:-1;;;;;30562:22:0;;;;;;:8;:22;;;;;;;;30555:29;;;;;;;;;;;;;;;;;;;;30650:11;;30624:42;;;;;;;;;;;;;;;;;;;;;;;;;30706:46;30719:10;30731:6;30739:4;:11;;;30706;:46::i;:::-;30699:53;;;;;;30491:927;30885:11;;30871;;30885:45;;30923:5;;30885:32;;30902:13;30885:15;:32::i;:45::-;30871:59;;31015:241;;;;;;;;31047:25;31064:6;31047:4;:11;;;:15;;:25;;;;:::i;:::-;31015:241;;;;31100:54;31118:34;31136:4;:14;;;31118:12;:16;;:34;;;;:::i;:::-;31100:12;;;;;:16;:54::i;:::-;31015:241;;31184:12;31015:241;;;;;;;;31226:14;;;;;31015:241;;;;;-1:-1:-1;;;;;30990:22:0;;-1:-1:-1;30990:22:0;;;:8;:22;;;;;:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31278:65;;;;;;;;;;;;;;;;;;;;;;;;;31365:41;31378:10;31390:6;31398;31365:11;:41::i;:::-;31358:48;;;;;30219:1206;;;;;:::o;23145:21::-;;;-1:-1:-1;;;23145:21:0;;;;;:::o;23230:24::-;;;;;;;;;;;;;;;;;:::o;1084:260::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1186:23:0;::::1;1177:75;;;;-1:-1:-1::0;;;1177:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:6;::::0;;1268:36:::1;::::0;-1:-1:-1;;;;;1268:36:0;;::::1;::::0;1285:6;::::1;::::0;1268:36:::1;::::0;::::1;1315:9;:21:::0;;-1:-1:-1;;;;;;1315:21:0::1;-1:-1:-1::0;;;;;1315:21:0;;;::::1;::::0;;;::::1;::::0;;1084:260::o;23014:22::-;;;-1:-1:-1;;;;;23014:22:0;;:::o;36798:427::-;36868:19;36901:16;;:::i;:::-;-1:-1:-1;;;;;;36920:22:0;;;;;;:8;:22;;;;;;;;36901:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36920:22;36976:34;;:12;;:16;:34::i;:::-;37036:12;;;;36953:57;;-1:-1:-1;37066:11:0;;37061:157;;37112:43;37146:7;37112:28;:15;37133:5;37112:19;:28::i;:43::-;37095:60;;37061:157;;;37205:1;37188:18;;37061:157;36798:427;;;;;;:::o;1356:221::-;1440:9;;-1:-1:-1;;;;;1440:9:0;1426:10;:23;1417:71;;;;-1:-1:-1;;;1417:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:9;;;1521:6;;1504:36;;-1:-1:-1;;;;;1529:9:0;;;;1521:6;;;;1504:36;;;1560:9;;;1551:18;;-1:-1:-1;;;;;;1551:18:0;-1:-1:-1;;;;;1560:9:0;;;1551:18;;;;;;1356:221::o;22816:33::-;;;:::o;36141:106::-;36186:4;36211:28;36226:11;:9;:11::i;:::-;36211:9;;;:13;:28::i;:::-;36204:35;;36141:106;:::o;23067:28::-;;;-1:-1:-1;;;;;23067:28:0;;:::o;33953:161::-;34009:4;34034:72;34100:4;34034:60;:42;34055:6;34063:11;:9;:11::i;:::-;34034:19;:42::i;:::-;:58;:60::i;25439:618::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;25686:13:::1;:11;:13::i;:::-;:18:::0;25677:66:::1;;;;-1:-1:-1::0;;;25677:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25762:217;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;25754:5:::1;:225:::0;;;;;;;;;;;;;;;;;;25990:9:::1;:24:::0;26037:12:::1;26025:9;:24:::0;25439:618::o;35235:140::-;35283:11;35317:50;35362:3;35317:39;35340:12;:10;:12::i;:::-;35317:11;:9;:11::i;:::-;:15;;:39::i;28190:1878::-;28312:4;-1:-1:-1;;;;;28339:24:0;;28330:54;;;;;-1:-1:-1;;;28330:54:0;;;;;;;;;;;;-1:-1:-1;;;28330:54:0;;;;;;;;;;;;;;;28397:11;:9;:11::i;:::-;28441:13;;28428:9;;:26;;28419:61;;;;;-1:-1:-1;;;28419:61:0;;;;;;;;;;;;-1:-1:-1;;;28419:61:0;;;;;;;;;;;;;;;28501:15;28519:16;:14;:16::i;:::-;28501:34;;28569:16;28588:12;:10;:12::i;:::-;28569:31;;28635:11;28622:9;:24;;28613:74;;;;-1:-1:-1;;;28613:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28723:10;28747:8;-1:-1:-1;;;;;28736:29:0;;28767:9;28778:7;28736:51;;;;;;;;;;;;;-1:-1:-1;;;;;28736:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28736:51:0;;-1:-1:-1;28798:11:0;28812:18;28736:51;28812:9;:18::i;:::-;28798:32;;28894:8;28884:6;:18;;28875:47;;;;;-1:-1:-1;;;28875:47:0;;;;;;;;;;;;-1:-1:-1;;;28875:47:0;;;;;;;;;;;;;;;28999:11;:9;:11::i;:::-;28989:6;:21;;28980:49;;;;;-1:-1:-1;;;28980:49:0;;;;;;;;;;;;-1:-1:-1;;;28980:49:0;;;;;;;;;;;;;;;29245:69;-1:-1:-1;;;;;29253:9:0;29245:36;29283:10;29295:8;29305:7;29245:36;:69::i;:::-;29325:58;;;-1:-1:-1;;;29325:58:0;;29368:4;29325:58;;;;;;;;;;;;-1:-1:-1;;;;;29336:8:0;29325:33;;;;:58;;;;;-1:-1:-1;;29325:58:0;;;;;;;-1:-1:-1;29325:33:0;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29452:9:0;;:22;;-1:-1:-1;29452:9:0;-1:-1:-1;29467:5:0;29452:13;:22::i;:::-;29440:9;:34;29566:199;;;;;;;;-1:-1:-1;;;;;29595:22:0;;-1:-1:-1;29595:22:0;;;:8;:22;;;;;;:29;29566:199;;29595:43;;29630:6;29595:33;:43::i;:::-;29566:199;;29662:17;;;29566:199;;;;;;;;29705:12;29566:199;;;;;;;;;;;;;;-1:-1:-1;;;;;29541:22:0;;-1:-1:-1;29541:22:0;;;:8;:22;;;;;:224;;;;;;;;29662:17;29541:224;;;;;;;;;;;;;;;;;;;;;;;29870:17;29743:10;;29852:37;;:16;:37::i;:::-;29822:81;;;;;;;;29844:6;;29822:81;;;;;;;;;;29969:11;:9;:11::i;:::-;29955:12;:10;:12::i;:::-;29937:16;:14;:16::i;:::-;29919:63;;;;;;;29995:8;:6;:8::i;:::-;30053:6;28190:1878;-1:-1:-1;;;;;;;28190:1878:0:o;35876:166::-;35933:4;35958:50;36003:3;35958:39;35981:12;:10;:12::i;:::-;35958:11;:9;:11::i;22893:28::-;;;:::o;22676:::-;;;:::o;37981:268::-;38044:4;38081:3;-1:-1:-1;;;;;38071:13:0;:6;-1:-1:-1;;;;;38071:13:0;;;38062:24;;;;;;38116:9;-1:-1:-1;;;;;38106:19:0;:6;-1:-1:-1;;;;;38106:19:0;;;38097:30;;;;;;38138:81;38169:3;38182:6;-1:-1:-1;;;;;38174:26:0;;38210:4;38174:43;;;;;;;;;;;;;-1:-1:-1;;;;;38174:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38174:43:0;-1:-1:-1;;;;;38138:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;38237:4:0;37981:268;;;:::o;23296:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35499:270::-;35542:15;35574:11;35596:3;-1:-1:-1;;;;;35588:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35588:27:0;;-1:-1:-1;35639:122:0;35755:4;35639:110;:92;35674:24;35693:3;35674:13;:11;:13::i;:24::-;35714:6;35639:19;:92::i;:122::-;35626:135;;35499:270;;:::o;34990:140::-;35033:3;35053:9;35072;;;;;;;;;-1:-1:-1;;;;;35072:9:0;-1:-1:-1;;;;;35072:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35072:27:0;;;;-1:-1:-1;;34990:140:0;:::o;27643:318::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27739:22:0;::::1;27730:33;;;::::0;::::1;;27779:7;27774:180;;;27804:9;:16:::0;;-1:-1:-1;;;;;;;27804:16:0;;::::1;;-1:-1:-1::0;;;;;;27835:24:0::1;-1:-1:-1::0;;;;;27835:24:0;::::1;;::::0;;27774:180:::1;;;27892:9;:17:::0;;-1:-1:-1;;;;27892:17:0::1;::::0;;27924:7:::1;:18:::0;;-1:-1:-1;;;;;27924:18:0;::::1;-1:-1:-1::0;;;;;;27924:18:0;;::::1;;::::0;;27643:318;;:::o;23175:18::-;;;;;;;;;;;;:::o;34219:243::-;34262:11;34304:51;34350:3;34304:40;34331:11;:9;:11::i;:::-;34304:5;:21;;:25;:40::i;:51::-;34380:18;;34295:60;;-1:-1:-1;34371:27:0;;34366:89;;;-1:-1:-1;34425:18:0;;34219:243;:::o;33684:140::-;33727:4;33752:64;33808:6;33752:50;33785:5;:15;;;33760:3;-1:-1:-1;;;;;33752:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33752:27:0;;:31;:50::i;36349:286::-;36392:11;36417:20;36440:29;36458:9;;36440:12;:16;;:29;;;;:::i;:::-;36527:17;;36489:9;;36417:52;;-1:-1:-1;36489:57:0;;:32;;36417:52;36489:13;:32::i;:57::-;36480:66;;36571:9;;36562:6;:18;36557:71;;;36607:9;;36598:18;;36557:71;36349:286;;:::o;23471:21::-;;;;:::o;23389:::-;;;;:::o;2143:250::-;2201:7;2225:6;2221:47;;-1:-1:-1;2255:1:0;2248:8;;2221:47;2292:5;;;2296:1;2292;:5;:1;2316:5;;;;;:10;2308:56;;;;-1:-1:-1;;;2308:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2384:1;2143:250;-1:-1:-1;;;2143:250:0:o;2401:132::-;2459:7;2486:39;2490:1;2493;2486:39;;;;;;;;;;;;;;;;;:3;:39::i;31655:690::-;31744:4;31768:6;31762:551;;31834:3;-1:-1:-1;;;;;31826:22:0;;31850:10;31862:7;31826:45;;;;;;;;;;;;;-1:-1:-1;;;;;31826:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31762:551:0;;-1:-1:-1;31762:551:0;;31950:9;;-1:-1:-1;;;31950:9:0;;;;31945:357;;;32034:13;;;32011:47;;;-1:-1:-1;;;32011:47:0;;-1:-1:-1;;;;;32034:13:0;;;32011:47;;;;;;;;;;;;;;32019:3;32011:21;;;;;;:47;;;;;;;;;;;;;;-1:-1:-1;32011:21:0;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32093:13:0;;;32077:60;;;-1:-1:-1;;;32077:60:0;;;;;;;;-1:-1:-1;;;;;32077:60:0;;;;;;;;;32093:13;;;32077:37;;:60;;;;;32093:13;;32077:60;;;;;;;32093:13;;32077:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31945:357;;;32201:7;;32178:41;;;-1:-1:-1;;;32178:41:0;;-1:-1:-1;;;;;32201:7:0;;;32178:41;;;;;;;;;;;;32186:3;32178:21;;;;;;:41;;;;;;;;;;;;;;;-1:-1:-1;32178:21:0;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32248:7:0;;32238:48;;;-1:-1:-1;;;32238:48:0;;;;;;;;-1:-1:-1;;;;;32238:48:0;;;;;;;;;32248:7;;;;;32238:25;;:48;;;;;32178:41;;32238:48;;;;;;;32248:7;;32238:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31945:357:0;-1:-1:-1;32330:7:0;31655:690;-1:-1:-1;;31655:690:0:o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;19956:719::-;20037:16;;:::i;:::-;20088:1;20074:11;:15;20066:66;;;;-1:-1:-1;;;20066:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20147:14;20143:50;;-1:-1:-1;20170:23:0;;;;;;;;;-1:-1:-1;20170:23:0;;20163:30;;20143:50;20210:24;;;20206:462;;20251:14;20296:11;19382:3;20269:23;;;20296:11;20268:39;;;;;;-1:-1:-1;;;;;;20330:21:0;;;20322:64;;;;;-1:-1:-1;;;20322:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20408:26;;;;;;;;20426:6;-1:-1:-1;;;;;20408:26:0;;;;20401:33;;;;;20206:462;20467:14;20484:45;20500:9;-1:-1:-1;;;20517:11:0;20484:15;:45::i;:::-;20467:62;-1:-1:-1;;;;;;20552:21:0;;;20544:64;;;;;-1:-1:-1;;;20544:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19811:137;19913:7;19924:16;-1:-1:-1;;;;;19908:13:0;;;:32;;19811:137::o;33415:124::-;33468:28;33483:11;:9;:11::i;33468:28::-;33456:9;:40;33519:12;33507:9;:24;33415:124::o;34589:327::-;34630:11;34664:51;34710:3;34664:40;34691:11;:9;:11::i;34664:51::-;34740:18;;34655:60;;-1:-1:-1;34731:27:0;;34726:183;;;-1:-1:-1;34785:18:0;;34726:183;;;34834:18;;:23;34829:80;;34896:1;34875:18;:22;34589:327;:::o;16493:205::-;16621:68;;;-1:-1:-1;;;;;16621:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16621:68:0;-1:-1:-1;;;16621:68:0;;;16594:96;;16614:5;;16594:19;:96::i;:::-;16493:205;;;;:::o;1610:181::-;1668:7;1700:5;;;1724:6;;;;1716:46;;;;;-1:-1:-1;;;1716:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32437:917;32523:17;;32497:20;;32475:19;;32497:45;;:20;:24;:45::i;:::-;32557:15;;32475:67;;-1:-1:-1;32557:20:0;;;;:54;;;32597:14;32581:12;:30;;32557:54;32553:794;;;32644:5;:21;32685:10;:14;;;32680:494;;;32772:15;;32745:5;:21;:44;;:25;:44::i;:::-;32721:5;:68;;;32838:17;;-1:-1:-1;32808:112:0;;32899:1;32881:15;:19;32808:112;32680:494;;;33011:15;;32984:5;:21;:44;;:25;:44::i;:::-;32960:5;:68;;;33077:17;;-1:-1:-1;33047:112:0;;33138:1;33120:15;:19;33047:112;33211:12;33188:20;:35;33279:5;:21;33302:15;;33188:10;33319:14;33243:92;;;;;;;;;;;;;;;;;;;;33319:14;;33243:92;;;;;;;;;;;;;;;;32553:794;;32437:917;:::o;16308:177::-;16418:58;;;-1:-1:-1;;;;;16418:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16418:58:0;-1:-1:-1;;;16418:58:0;;;16391:86;;16411:5;;16391:19;:86::i;:::-;16308:177;;;:::o;2541:189::-;2627:7;2662:12;2655:5;2647:28;;;;-1:-1:-1;;;2647:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:9;2702:1;2698;:5;;;;;;;2541:189;-1:-1:-1;;;;;2541:189:0:o;1943:192::-;2029:7;2065:12;2057:6;;;;2049:29;;;;-1:-1:-1;;;2049:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2101:5:0;;;1943:192::o;18856:347::-;18962:7;18983:9;18994;19007:13;19015:1;19018;19007:7;:13::i;:::-;18982:38;;;;19031:10;19057:1;19044:15;;;;;19054:1;19051;19044:15;19031:28;;19079:1;19074:2;:6;19070:18;;;19087:1;19082:6;;;;19070:18;19104:2;19099:7;;;;19129:1;19125;:5;19117:44;;;;;-1:-1:-1;;;19117:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19179:16;19187:1;19190;19193;19179:7;:16::i;17697:420::-;17780:23;17806:69;17834:4;17806:69;;;;;;;;;;;;;;;;;17814:5;-1:-1:-1;;;;;17806:27:0;;;:69;;;;;:::i;:::-;17890:17;;17780:95;;-1:-1:-1;17890:21:0;17886:224;;18032:10;18021:30;;;;;;;;;;;;;;;-1:-1:-1;18021:30:0;18013:85;;;;-1:-1:-1;;;18013:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18148:210;18209:9;;;-1:-1:-1;;18265:1:0;18262;18255:25;18242:38;;18299:1;18295;:5;18291:9;;18320:1;18315:2;:6;18311:10;;18341:1;18336:2;:6;18332:18;;;18349:1;18344:6;;;;18332:18;18148:210;;;;;;:::o;18366:482::-;18472:7;18511:2;;;18507:6;;;18512:1;18507:6;18524:9;;;;;;;18549:4;18544:9;;;;;;;;;18584:4;18576;18575:5;;18574:14;;;;;18633:1;:9;;;18662:5;;;18658:9;;18653:14;18687:5;;;18683:9;;18678:14;18712:5;;;18708:9;;18703:14;18737:5;;;18733:9;;18728:14;18762:5;;;18758:9;;18753:14;18787:5;;;18783:9;;18778:14;18812:5;;;18808:9;;18803:14;;;18574;;18591:1;18574:18;18569:24;;;;18564:29;;;;18835:5;;18366:482;-1:-1:-1;;18366:482:0:o;4242:196::-;4345:12;4377:53;4400:6;4408:4;4414:1;4417:12;4377:22;:53::i;:::-;4370:60;4242:196;-1:-1:-1;;;;4242:196:0:o;5218:979::-;5348:12;5381:18;5392:6;5381:10;:18::i;:::-;5373:60;;;;;-1:-1:-1;;;5373:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5507:12;5521:23;5548:6;-1:-1:-1;;;;;5548:11:0;5568:8;5579:4;5548:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5548:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5506:78;;;;5599:7;5595:595;;;5630:10;-1:-1:-1;5623:17:0;;-1:-1:-1;5623:17:0;5595:595;5744:17;;:21;5740:439;;6007:10;6001:17;6068:15;6055:10;6051:2;6047:19;6040:44;5955:148;6143:20;;-1:-1:-1;;;6143:20:0;;;;;;;;;;;;;;;;;6150:12;;6143:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3415:233;3593:20;3632:8;;;3415:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6a7c4f78cdd8e0d8c4ac4124a8d5f2775184e571f558616dabf5ad061c5978dc
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $69.6 | 124.1453 | $8,640.51 |
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.