More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 9,796 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 14609467 | 863 days ago | IN | 0 ETH | 0.0039927 | ||||
Redeem | 14023482 | 954 days ago | IN | 0 ETH | 0.0106235 | ||||
Redeem | 13942664 | 966 days ago | IN | 0 ETH | 0.00560369 | ||||
Redeem | 13908918 | 972 days ago | IN | 0 ETH | 0.00687244 | ||||
Redeem | 13877251 | 977 days ago | IN | 0 ETH | 0.00287822 | ||||
Redeem | 13858413 | 980 days ago | IN | 0 ETH | 0.00534651 | ||||
Redeem | 13856234 | 980 days ago | IN | 0 ETH | 0.01851731 | ||||
Redeem | 13852656 | 980 days ago | IN | 0 ETH | 0.00330467 | ||||
Redeem | 13848469 | 981 days ago | IN | 0 ETH | 0.00285478 | ||||
Redeem | 13847207 | 981 days ago | IN | 0 ETH | 0.00293505 | ||||
Redeem | 13845318 | 982 days ago | IN | 0 ETH | 0.00536065 | ||||
Redeem | 13838607 | 983 days ago | IN | 0 ETH | 0.00210307 | ||||
Redeem | 13838606 | 983 days ago | IN | 0 ETH | 0.00380568 | ||||
Redeem | 13830512 | 984 days ago | IN | 0 ETH | 0.00306107 | ||||
Redeem | 13830252 | 984 days ago | IN | 0 ETH | 0.0036398 | ||||
Redeem | 13830062 | 984 days ago | IN | 0 ETH | 0.01787566 | ||||
Redeem | 13829779 | 984 days ago | IN | 0 ETH | 0.00418442 | ||||
Redeem | 13826767 | 984 days ago | IN | 0 ETH | 0.0051725 | ||||
Redeem | 13824859 | 985 days ago | IN | 0 ETH | 0.00308873 | ||||
Redeem | 13823829 | 985 days ago | IN | 0 ETH | 0.00485608 | ||||
Redeem | 13823174 | 985 days ago | IN | 0 ETH | 0.0167448 | ||||
Redeem | 13822625 | 985 days ago | IN | 0 ETH | 0.00331769 | ||||
Redeem | 13820812 | 985 days ago | IN | 0 ETH | 0.00333293 | ||||
Redeem | 13820707 | 985 days ago | IN | 0 ETH | 0.00450029 | ||||
Redeem | 13820668 | 985 days ago | IN | 0 ETH | 0.00466992 |
Loading...
Loading
Contract Name:
OlympusBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-18 */ /** *Submitted for verification at Etherscan.io on 2021-06-16 */ // 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 ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } 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 bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens 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 uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) 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 _bondCalculator ) { require( _OHM != address(0) ); OHM = _OHM; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint _controlVariable, uint _vestingTerm, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _initialDebt ) external onlyPolicy() { require( terms.controlVariable == 0, "Bonds must be initialized from 0" ); terms = Terms ({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, 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.FEE ) { // 2 require( _input <= 10000, "DAO fee cannot exceed payout" ); terms.fee = _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 // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) OHM */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to dao IERC20( OHM ).safeTransfer( DAO, fee ); } // 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( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); 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() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @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 for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { if ( isLiquidityBond ) { return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 ); } else { return debtRatio(); } } /** * @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":"_bondCalculator","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":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"fee","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
6101406040523480156200001257600080fd5b5060405162002c3e38038062002c3e833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000b557600080fd5b6001600160601b0319606086901b166080526001600160a01b038416620000db57600080fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200010157600080fd5b6001600160601b0319606084901b1660c0526001600160a01b0382166200012757600080fd5b6001600160601b0319606092831b811660e0529181901b909116610120526001600160a01b0316151560f81b6101005250505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c612a106200022e60003980610f5852806116dd5280611924525080610f2a52806116ac5280611aff52508061155252806117a65280611871525080610dc052806111c152806113c452806114a652508061059b5280610f87528061102e52806111f0528061136b52806113955280611475528061170c528061182f52508061153052806117ca52806117f052806119725280611b745280611cf95280611dde5280611ef35250612a106000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610571578063e0176de814610579578063e392a26214610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063cea55f57146104f8578063d4d863ce14610500578063d50256251461052e578063d79690601461056957610211565b806398fabd3a116100f457806398fabd3a1461046e578063a6c41fec14610476578063b4abccba1461047e578063c5332b7c146104a4578063cd1234b3146104ac57610211565b80637927ebf81461040f578063844b5c7c1461042c5780638dbdbe6d14610434578063904b3ece1461046657610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146103ae57806361d027b3146103b657806371535008146103be578063759076e5146103ff57806377b818951461040757610211565b8063451ee4a11461032557806346f68ee91461035a5780634cf088d914610380578063507930ec1461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b61032d610b6e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037057600080fd5b50356001600160a01b0316610b86565b61021e610c73565b6102606004803603602081101561039e57600080fd5b50356001600160a01b0316610c82565b610282610d14565b61021e610dbe565b610282600480360360e08110156103d457600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610de2565b610260610ed6565b61021e610ef1565b6102606004803603602081101561042557600080fd5b5035610f00565b610260610f26565b6102606004803603606081101561044a57600080fd5b50803590602081013590604001356001600160a01b03166110bf565b6102606116a8565b61021e6117a4565b61021e6117c8565b6103116004803603602081101561049457600080fd5b50356001600160a01b03166117ec565b61021e611922565b6104d2600480360360208110156104c257600080fd5b50356001600160a01b0316611946565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61026061196d565b6102826004803603604081101561051657600080fd5b506001600160a01b0381351690602001351515611a25565b610536611ae8565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611afd565b610260611b21565b610260611b60565b610260611bfd565b610260611c42565b610260611c48565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806105c983610c82565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c4e565b90611cae565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c4e565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576127108110156108575760405162461bcd60e51b815260040180806020018281038252602481526020018061298d6024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b6000610973612880565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610c82565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611cf0565b92505050610b58565b8151600090610a6d90612710906106069085611c4e565b90506040518060800160405280610a91838660000151611ff490919063ffffffff16565b8152602001610abb610ab0866040015143611ff490919063ffffffff16565b602087015190611ff4565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611cf0565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610bd3576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b6001600160a01b038116610c185760405162461bcd60e51b81526004018080602001828103825260268152602001806128bb6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610c8c612880565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610ce2904390611ff4565b60208301519091508015610d0757610d008161060684612710611c4e565b9350610d0c565b600093505b505050919050565b6001546001600160a01b03163314610d5d5760405162461bcd60e51b81526004018080602001828103825260228152602001806128e16022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610e2f576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b60045415610e84576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610eec610ee3611bfd565b60105490611ff4565b905090565b6003546001600160a01b031681565b6000610b58662386f26fc10000610606610f2185610f1c611b21565b612036565b6121ad565b60007f0000000000000000000000000000000000000000000000000000000000000000156110245761101d60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fe357600080fd5b505afa158015610ff7573d6000803e3d6000fd5b505050506040513d602081101561100d57600080fd5b5051611017611b21565b90611c4e565b9050610623565b610eec60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d60208110156110af57600080fd5b505160ff16600a0a611017611b21565b60006001600160a01b03821661110e576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6111166121c5565b6009546010541115611166576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000611170610f26565b9050600061117c6121d9565b9050808510156111bd5760405162461bcd60e51b815260040180806020018281038252602381526020018061296a6023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d602081101561127e57600080fd5b50519050600061128d82610f00565b9050629896808110156112d8576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6112e0611b60565b811115611325576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611344612710610606600480015485611c4e90919063ffffffff16565b9050600061135c826113568686611ff4565b90611ff4565b90506113936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308d61221b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561142a57600080fd5b505af115801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b50508115611577576115776001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008461227b565b60105461158490856122d2565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906115b690866122d2565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554879161161b916122d2565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a461165961196d565b6116616121d9565b611669610f26565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a461169a61232c565b509098975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561179c5761101d633b9aca006106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561176857600080fd5b505afa15801561177c573d6000803e3d6000fd5b505050506040513d602081101561179257600080fd5b505161101761196d565b61101d61196d565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561182d57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561186c57600080fd5b61191a7f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118dd57600080fd5b505afa1580156118f1573d6000803e3d6000fd5b505050506040513d602081101561190757600080fd5b50516001600160a01b038516919061227b565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c957600080fd5b505afa1580156119dd573d6000803e3d6000fd5b505050506040513d60208110156119f357600080fd5b50519050611a1f670de0b6b3a7640000610606610f21611a19633b9aca00611017610ed6565b85612036565b91505090565b6000546001600160a01b03163314611a72576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b6001600160a01b038216611a8557600080fd5b8015611aba5760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b4c62989680610606633b9aca00611b46611b3d61196d565b60045490611c4e565b906122d2565b600654909150811015610623575060065490565b6000610eec620186a06106066004600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b505190611c4e565b600080611c1560115443611ff490919063ffffffff16565b600554601054919250611c2c916106069084611c4e565b9150601054821115611c3e5760105491505b5090565b60115481565b60105481565b600082611c5d57506000610b58565b82820282848281611c6a57fe5b0414611ca75760405162461bcd60e51b81526004018080602001828103825260218152602001806129296021913960400191505060405180910390fd5b9392505050565b6000611ca783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061240c565b600082611da0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d6e57600080fd5b505af1158015611d82573d6000803e3d6000fd5b505050506040513d6020811015611d9857600080fd5b50611fed9050565b600354600160a01b900460ff1615611ec7576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d6020811015611e5357600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611eaa57600080fd5b505af1158015611ebe573d6000803e3d6000fd5b50505050611fed565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611fc057600080fd5b505af1158015611fd4573d6000803e3d6000fd5b505050506040513d6020811015611fea57600080fd5b50505b5092915050565b6000611ca783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ae565b61203e6128a8565b6000821161207d5760405162461bcd60e51b81526004018080602001828103825260268152602001806129036026913960400191505060405180910390fd5b826120975750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161213e57600082607085901b816120bf57fe5b0490506001600160e01b0381111561211e576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061214f84600160701b85612508565b90506001600160e01b0381111561211e576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b6121d0610ee3611bfd565b60105543601155565b60006121f562989680610606633b9aca00611b46611b3d61196d565b60065490915081101561220b5750600654610623565b6006541561062357600060065590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122759085906125a8565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526122cd9084906125a8565b505050565b600082820183811015611ca7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e5460009161233f91906122d2565b600b54909150158015906123535750804310155b1561240957600454600a5460ff161561238d57600b54600454612375916122d2565b6004819055600c5411612388576000600b555b6123af565b600b5460045461239c91611ff4565b6004819055600c54106123af576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081836124985760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561245d578181015183820152602001612445565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124a457fe5b0495945050505050565b600081848411156125005760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561245d578181015183820152602001612445565b505050900390565b60008060006125178686612659565b915091506000848061252557fe5b868809905082811115612539576001820391505b8083039250848210612592576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b61259d838387612686565b979650505050505050565b60606125fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126f69092919063ffffffff16565b8051909150156122cd5780806020019051602081101561261c57600080fd5b50516122cd5760405162461bcd60e51b815260040180806020018281038252602a8152602001806129b1602a913960400191505060405180910390fd5b600080806000198486099050838502925082810391508281101561267e576001820391505b509250929050565b6000818103821680838161269657fe5b0492508085816126a257fe5b0494508081600003816126b157fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b6060612705848460008561270d565b949350505050565b60606127188561287a565b612769576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081156128235791506127059050565b8051156128335780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561245d578181015183820152602001612445565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c1e2cba270c7715a32e8ac05dd8ecdf31b6a53ad357aa0cff8b292f07a6af86a64736f6c63430007050033000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8990000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610571578063e0176de814610579578063e392a26214610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063cea55f57146104f8578063d4d863ce14610500578063d50256251461052e578063d79690601461056957610211565b806398fabd3a116100f457806398fabd3a1461046e578063a6c41fec14610476578063b4abccba1461047e578063c5332b7c146104a4578063cd1234b3146104ac57610211565b80637927ebf81461040f578063844b5c7c1461042c5780638dbdbe6d14610434578063904b3ece1461046657610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146103ae57806361d027b3146103b657806371535008146103be578063759076e5146103ff57806377b818951461040757610211565b8063451ee4a11461032557806346f68ee91461035a5780634cf088d914610380578063507930ec1461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b61032d610b6e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037057600080fd5b50356001600160a01b0316610b86565b61021e610c73565b6102606004803603602081101561039e57600080fd5b50356001600160a01b0316610c82565b610282610d14565b61021e610dbe565b610282600480360360e08110156103d457600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610de2565b610260610ed6565b61021e610ef1565b6102606004803603602081101561042557600080fd5b5035610f00565b610260610f26565b6102606004803603606081101561044a57600080fd5b50803590602081013590604001356001600160a01b03166110bf565b6102606116a8565b61021e6117a4565b61021e6117c8565b6103116004803603602081101561049457600080fd5b50356001600160a01b03166117ec565b61021e611922565b6104d2600480360360208110156104c257600080fd5b50356001600160a01b0316611946565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61026061196d565b6102826004803603604081101561051657600080fd5b506001600160a01b0381351690602001351515611a25565b610536611ae8565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611afd565b610260611b21565b610260611b60565b610260611bfd565b610260611c42565b610260611c48565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b6000806105c983610c82565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c4e565b90611cae565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c4e565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576127108110156108575760405162461bcd60e51b815260040180806020018281038252602481526020018061298d6024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b6000610973612880565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610c82565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611cf0565b92505050610b58565b8151600090610a6d90612710906106069085611c4e565b90506040518060800160405280610a91838660000151611ff490919063ffffffff16565b8152602001610abb610ab0866040015143611ff490919063ffffffff16565b602087015190611ff4565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611cf0565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610bd3576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b6001600160a01b038116610c185760405162461bcd60e51b81526004018080602001828103825260268152602001806128bb6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610c8c612880565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610ce2904390611ff4565b60208301519091508015610d0757610d008161060684612710611c4e565b9350610d0c565b600093505b505050919050565b6001546001600160a01b03163314610d5d5760405162461bcd60e51b81526004018080602001828103825260228152602001806128e16022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e881565b6000546001600160a01b03163314610e2f576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b60045415610e84576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610eec610ee3611bfd565b60105490611ff4565b905090565b6003546001600160a01b031681565b6000610b58662386f26fc10000610606610f2185610f1c611b21565b612036565b6121ad565b60007f0000000000000000000000000000000000000000000000000000000000000000156110245761101d60646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fe357600080fd5b505afa158015610ff7573d6000803e3d6000fd5b505050506040513d602081101561100d57600080fd5b5051611017611b21565b90611c4e565b9050610623565b610eec60646106067f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d60208110156110af57600080fd5b505160ff16600a0a611017611b21565b60006001600160a01b03821661110e576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6111166121c5565b6009546010541115611166576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000611170610f26565b9050600061117c6121d9565b9050808510156111bd5760405162461bcd60e51b815260040180806020018281038252602381526020018061296a6023913960400191505060405180910390fd5b60007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e86001600160a01b0316631eec5a9a7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561125457600080fd5b505afa158015611268573d6000803e3d6000fd5b505050506040513d602081101561127e57600080fd5b50519050600061128d82610f00565b9050629896808110156112d8576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6112e0611b60565b811115611325576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611344612710610606600480015485611c4e90919063ffffffff16565b9050600061135c826113568686611ff4565b90611ff4565b90506113936001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1633308d61221b565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b031663095ea7b37f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e88c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561142a57600080fd5b505af115801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f811660248301526044820184905291517f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e89092169163bc157ac1916064808201926020929091908290030181600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b50508115611577576115776001600160a01b037f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899167f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b8461227b565b60105461158490856122d2565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906115b690866122d2565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554879161161b916122d2565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a461165961196d565b6116616121d9565b611669610f26565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a461169a61232c565b509098975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561179c5761101d633b9aca006106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561176857600080fd5b505afa15801561177c573d6000803e3d6000fd5b505050506040513d602081101561179257600080fd5b505161101761196d565b61101d61196d565b7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b81565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89981565b60007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b0316826001600160a01b0316141561182d57600080fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316826001600160a01b0316141561186c57600080fd5b61191a7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118dd57600080fd5b505afa1580156118f1573d6000803e3d6000fd5b505050506040513d602081101561190757600080fd5b50516001600160a01b038516919061227b565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c957600080fd5b505afa1580156119dd573d6000803e3d6000fd5b505050506040513d60208110156119f357600080fd5b50519050611a1f670de0b6b3a7640000610606610f21611a19633b9aca00611017610ed6565b85612036565b91505090565b6000546001600160a01b03163314611a72576040805162461bcd60e51b8152602060048201819052602482015260008051602061294a833981519152604482015290519081900360640190fd5b6001600160a01b038216611a8557600080fd5b8015611aba5760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b4c62989680610606633b9aca00611b46611b3d61196d565b60045490611c4e565b906122d2565b600654909150811015610623575060065490565b6000610eec620186a06106066004600301547f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bcb57600080fd5b505afa158015611bdf573d6000803e3d6000fd5b505050506040513d6020811015611bf557600080fd5b505190611c4e565b600080611c1560115443611ff490919063ffffffff16565b600554601054919250611c2c916106069084611c4e565b9150601054821115611c3e5760105491505b5090565b60115481565b60105481565b600082611c5d57506000610b58565b82820282848281611c6a57fe5b0414611ca75760405162461bcd60e51b81526004018080602001828103825260218152602001806129296021913960400191505060405180910390fd5b9392505050565b6000611ca783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061240c565b600082611da0577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8996001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d6e57600080fd5b505af1158015611d82573d6000803e3d6000fd5b505050506040513d6020811015611d9857600080fd5b50611fed9050565b600354600160a01b900460ff1615611ec7576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8999092169163095ea7b3916044808201926020929091908290030181600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b505050506040513d6020811015611e5357600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611eaa57600080fd5b505af1158015611ebe573d6000803e3d6000fd5b50505050611fed565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8999092169163095ea7b3916044808201926020929091908290030181600087803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b505050506040513d6020811015611f6857600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611fc057600080fd5b505af1158015611fd4573d6000803e3d6000fd5b505050506040513d6020811015611fea57600080fd5b50505b5092915050565b6000611ca783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ae565b61203e6128a8565b6000821161207d5760405162461bcd60e51b81526004018080602001828103825260268152602001806129036026913960400191505060405180910390fd5b826120975750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161213e57600082607085901b816120bf57fe5b0490506001600160e01b0381111561211e576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061214f84600160701b85612508565b90506001600160e01b0381111561211e576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b6121d0610ee3611bfd565b60105543601155565b60006121f562989680610606633b9aca00611b46611b3d61196d565b60065490915081101561220b5750600654610623565b6006541561062357600060065590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122759085906125a8565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526122cd9084906125a8565b505050565b600082820183811015611ca7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e5460009161233f91906122d2565b600b54909150158015906123535750804310155b1561240957600454600a5460ff161561238d57600b54600454612375916122d2565b6004819055600c5411612388576000600b555b6123af565b600b5460045461239c91611ff4565b6004819055600c54106123af576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081836124985760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561245d578181015183820152602001612445565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124a457fe5b0495945050505050565b600081848411156125005760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561245d578181015183820152602001612445565b505050900390565b60008060006125178686612659565b915091506000848061252557fe5b868809905082811115612539576001820391505b8083039250848210612592576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b61259d838387612686565b979650505050505050565b60606125fd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126f69092919063ffffffff16565b8051909150156122cd5780806020019051602081101561261c57600080fd5b50516122cd5760405162461bcd60e51b815260040180806020018281038252602a8152602001806129b1602a913960400191505060405180910390fd5b600080806000198486099050838502925082810391508281101561267e576001820391505b509250929050565b6000818103821680838161269657fe5b0492508085816126a257fe5b0494508081600003816126b157fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b6060612705848460008561270d565b949350505050565b60606127188561287a565b612769576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127a85780518252601f199092019160209182019101612789565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461280a576040519150601f19603f3d011682016040523d82523d6000602084013e61280f565b606091505b509150915081156128235791506127059050565b8051156128335780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561245d578181015183820152602001612445565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c1e2cba270c7715a32e8ac05dd8ecdf31b6a53ad357aa0cff8b292f07a6af86a64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a8990000000000000000000000006b175474e89094c44da98b954eedeac495271d0f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _OHM (address): 0x383518188C0C6d7730D91b2c03a03C837814a899
Arg [1] : _principle (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [2] : _treasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [3] : _DAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [4] : _bondCalculator (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899
Arg [1] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [2] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21367:17257:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22082:34;;;:::i;:::-;;;;-1:-1:-1;;;;;22082:34:0;;;;;;;;;;;;;;37769:400;;;;;;;;;;;;;;;;-1:-1:-1;37769:400:0;-1:-1:-1;;;;;37769:400:0;;:::i;:::-;;;;;;;;;;;;;;;;764:89;;;:::i;989:158::-;;;:::i;:::-;;26909:466;;;;;;;;;;;;;;;;-1:-1:-1;26909:466:0;;;;;;;;;;;;;;;;;;;:::i;25999:714::-;;;;;;;;;;;;;;;;-1:-1:-1;25999:714:0;;;;;;;;;:::i;30455:1206::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30455:1206:0;;;;;;;;;;:::i;22612:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;22697:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1155:260;;;;;;;;;;;;;;;;-1:-1:-1;1155:260:0;-1:-1:-1;;;;;1155:260:0;;:::i;22481:22::-;;;:::i;37170:427::-;;;;;;;;;;;;;;;;-1:-1:-1;37170:427:0;-1:-1:-1;;;;;37170:427:0;;:::i;1427:221::-;;;:::i;22152:33::-;;;:::i;25084:669::-;;;;;;;;;;;;;;;;-1:-1:-1;25084:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36513:106::-;;;:::i;22534:28::-;;;:::i;34189:161::-;;;;;;;;;;;;;;;;-1:-1:-1;34189:161:0;;:::i;35293:331::-;;;:::i;28055:2249::-;;;;;;;;;;;;;;;;-1:-1:-1;28055:2249:0;;;;;;;;;;;-1:-1:-1;;;;;28055:2249:0;;:::i;36139:275::-;;;:::i;22229:28::-;;;:::i;22012:::-;;;:::i;38353:268::-;;;;;;;;;;;;;;;;-1:-1:-1;38353:268:0;-1:-1:-1;;;;;38353:268:0;;:::i;22400:39::-;;;:::i;22763:42::-;;;;;;;;;;;;;;;;-1:-1:-1;22763:42:0;-1:-1:-1;;;;;22763:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35748:270;;;:::i;27508:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27508:318:0;;;;;;;;;;:::i;22642:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22301:37;;;:::i;34455:261::-;;;:::i;33920:140::-;;;:::i;36721:286::-;;;:::i;22938:21::-;;;:::i;22856:::-;;;:::i;22082:34::-;;;:::o;37769:400::-;37841:19;37874:18;37895:30;37913:10;37895:16;:30::i;:::-;-1:-1:-1;;;;;37950:22:0;;37936:11;37950:22;;;:8;:22;;;;;:29;37874:51;;-1:-1:-1;38014:5:0;37997:22;;37992:170;;38054:6;38037:23;;37992:170;;;38110:40;38143:5;38110:27;:6;38122:13;38110:10;:27::i;:::-;:31;;:40::i;:::-;38093:57;;37992:170;37769:400;;;;;:::o;764:89::-;812:7;839:6;-1:-1:-1;;;;;839:6:0;764:89;;:::o;989:158::-;903:6;;-1:-1:-1;;;;;903:6:0;913:10;903:20;894:67;;;;;-1:-1:-1;;;894:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;894:67:0;;;;;;;;;;;;;;;1105:1:::1;1089:6:::0;;1072:37:::1;::::0;-1:-1:-1;;;;;1089:6:0;;::::1;::::0;1072:37:::1;::::0;1105:1;;1072:37:::1;1137:1;1120:19:::0;;-1:-1:-1;;;;;;1120:19:0::1;::::0;;989:158::o;26909:466::-;903:6;;-1:-1:-1;;;;;903:6:0;913:10;903:20;894:67;;;;;-1:-1:-1;;;894:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;894:67:0;;;;;;;;;;;;;;;27096:5:::1;:21:::0;:43:::1;::::0;27133:4:::1;::::0;27096:31:::1;::::0;27123:2:::1;27096:25;:31::i;:43::-;27082:10;:57;;27073:91;;;::::0;;-1:-1:-1;;;27073:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27073:91:0;;;;;;;;;;;;;::::1;;27190:177;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;27343:12:::1;27190:177:::0;;;;;;;27177:10:::1;:190:::0;;-1:-1:-1;;27177:190:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;26909:466::o;25999:714::-;903:6;;-1:-1:-1;;;;;903:6:0;913:10;903:20;894:67;;;;;-1:-1:-1;;;894:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;894:67:0;;;;;;;;;;;;;;;26111:17:::1;26097:10;:31;;;;;;;;;26092:614;;;26170:5;26160:6;:15;;26151:66;;;;-1:-1:-1::0;;;26151:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26232:17:::0;:26;;;26092:614:::1;;;26295:16;26281:10;:30;;;;;;;;;26276:430;;;26353:4;26343:6;:14;;26334:61;;;::::0;;-1:-1:-1;;;26334:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26410:15:::0;:24;;;26276:430:::1;;;26471:13;26457:10;:27;;;;;;;;;26452:254;;;26526:5;26516:6;:15;;26507:58;;;::::0;;-1:-1:-1;;;26507:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26580:9:::0;:18;;;26452:254:::1;;;26635:14;26621:10;:28;;;;;;;;;26616:90;;;26672:13:::0;:22;;;26616:90:::1;25999:714:::0;;:::o;30455:1206::-;30525:4;30551:16;;:::i;:::-;-1:-1:-1;;;;;;30570:22:0;;;;;;:8;:22;;;;;;;;30551:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30624:30;30580:10;30624:16;:30::i;:::-;30603:51;;30749:5;30732:13;:22;30727:927;;-1:-1:-1;;;;;30798:22:0;;;;;;:8;:22;;;;;;;;30791:29;;;;;;;;;;;;;;;;;;;;30886:11;;30860:42;;;;;;;;;;;;;;;;;;;;;;;;;30942:46;30955:10;30967:6;30975:4;:11;;;30942;:46::i;:::-;30935:53;;;;;;30727:927;31121:11;;31107;;31121:45;;31159:5;;31121:32;;31138:13;31121:15;:32::i;:45::-;31107:59;;31251:241;;;;;;;;31283:25;31300:6;31283:4;:11;;;:15;;:25;;;;:::i;:::-;31251:241;;;;31336:54;31354:34;31372:4;:14;;;31354:12;:16;;:34;;;;:::i;:::-;31336:12;;;;;:16;:54::i;:::-;31251:241;;31420:12;31251:241;;;;;;;;31462:14;;;;;31251:241;;;;;-1:-1:-1;;;;;31226:22:0;;-1:-1:-1;31226:22:0;;;:8;:22;;;;;:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31514:65;;;;;;;;;;;;;;;;;;;;;;;;;31601:41;31614:10;31626:6;31634;31601:11;:41::i;:::-;31594:48;;;;;30455:1206;;;;;:::o;22612:21::-;;;-1:-1:-1;;;22612:21:0;;;;;:::o;22697:24::-;;;;;;;;;;;;;;;;;:::o;1155:260::-;903:6;;-1:-1:-1;;;;;903:6:0;913:10;903:20;894:67;;;;;-1:-1:-1;;;894:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;894:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1257:23:0;::::1;1248:75;;;;-1:-1:-1::0;;;1248:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1356:6;::::0;;1339:36:::1;::::0;-1:-1:-1;;;;;1339:36:0;;::::1;::::0;1356:6;::::1;::::0;1339:36:::1;::::0;::::1;1386:9;:21:::0;;-1:-1:-1;;;;;;1386:21:0::1;-1:-1:-1::0;;;;;1386:21:0;;;::::1;::::0;;;::::1;::::0;;1155:260::o;22481:22::-;;;-1:-1:-1;;;;;22481:22:0;;:::o;37170:427::-;37240:19;37273:16;;:::i;:::-;-1:-1:-1;;;;;;37292:22:0;;;;;;:8;:22;;;;;;;;37273:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37292:22;37348:34;;:12;;:16;:34::i;:::-;37408:12;;;;37325:57;;-1:-1:-1;37438:11:0;;37433:157;;37484:43;37518:7;37484:28;:15;37505:5;37484:19;:28::i;:43::-;37467:60;;37433:157;;;37577:1;37560:18;;37433:157;37170:427;;;;;;:::o;1427:221::-;1511:9;;-1:-1:-1;;;;;1511:9:0;1497:10;:23;1488:71;;;;-1:-1:-1;;;1488:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1600:9;;;1592:6;;1575:36;;-1:-1:-1;;;;;1600:9:0;;;;1592:6;;;;1575:36;;;1631:9;;;1622:18;;-1:-1:-1;;;;;;1622:18:0;-1:-1:-1;;;;;1631:9:0;;;1622:18;;;;;;1427:221::o;22152:33::-;;;:::o;25084:669::-;903:6;;-1:-1:-1;;;;;903:6:0;913:10;903:20;894:67;;;;;-1:-1:-1;;;894:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;894:67:0;;;;;;;;;;;;;;;25351:5:::1;:21:::0;:26;25342:73:::1;;;::::0;;-1:-1:-1;;;25342:73:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25434:241;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;25426:5:::1;:249:::0;;;;;;;;;;;;;;;;;;;;25686:9:::1;:24:::0;25733:12:::1;25721:9;:24:::0;25084:669::o;36513:106::-;36558:4;36583:28;36598:11;:9;:11::i;:::-;36583:9;;;:13;:28::i;:::-;36576:35;;36513:106;:::o;22534:28::-;;;-1:-1:-1;;;;;22534:28:0;;:::o;34189:161::-;34245:4;34270:72;34336:4;34270:60;:42;34291:6;34299:11;:9;:11::i;:::-;34270:19;:42::i;:::-;:58;:60::i;35293:331::-;35341:11;35370:15;35366:251;;;35412:85;35492:3;35412:74;35446:14;-1:-1:-1;;;;;35429:42:0;;35473:9;35429:55;;;;;;;;;;;;;-1:-1:-1;;;;;35429:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35429:55:0;35412:11;:9;:11::i;:::-;:15;;:74::i;:85::-;35403:94;;35366:251;;;35539:66;35600:3;35539:55;35570:9;-1:-1:-1;;;;;35562:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35562:30:0;35556:36;;:2;:36;35539:11;:9;:11::i;28055:2249::-;28177:4;-1:-1:-1;;;;;28204:24:0;;28195:54;;;;;-1:-1:-1;;;28195:54:0;;;;;;;;;;;;-1:-1:-1;;;28195:54:0;;;;;;;;;;;;;;;28262:11;:9;:11::i;:::-;28306:13;;28293:9;;:26;;28284:61;;;;;-1:-1:-1;;;28284:61:0;;;;;;;;;;;;-1:-1:-1;;;28284:61:0;;;;;;;;;;;;;;;28366:15;28384:16;:14;:16::i;:::-;28366:34;;28434:16;28453:12;:10;:12::i;:::-;28434:31;;28500:11;28487:9;:24;;28478:74;;;;-1:-1:-1;;;28478:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28588:10;28612:8;-1:-1:-1;;;;;28601:29:0;;28632:9;28643:7;28601:51;;;;;;;;;;;;;-1:-1:-1;;;;;28601:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28601:51:0;;-1:-1:-1;28663:11:0;28677:18;28601:51;28677:9;:18::i;:::-;28663:32;;28759:8;28749:6;:18;;28740:47;;;;;-1:-1:-1;;;28740:47:0;;;;;;;;;;;;-1:-1:-1;;;28740:47:0;;;;;;;;;;;;;;;28864:11;:9;:11::i;:::-;28854:6;:21;;28845:49;;;;;-1:-1:-1;;;28845:49:0;;;;;;;;;;;;-1:-1:-1;;;28845:49:0;;;;;;;;;;;;;;;28990:8;29001:36;29030:5;29001:23;29013:5;:9;;;29001:6;:10;;:23;;;;:::i;:36::-;28990:47;-1:-1:-1;29048:11:0;29062:30;28990:47;29062:19;:5;29073:6;29062:9;:19::i;:::-;:23;;:30::i;:::-;29048:44;-1:-1:-1;29273:74:0;-1:-1:-1;;;;;29281:9:0;29273:36;29311:10;29331:4;29338:7;29273:36;:74::i;:::-;29366:9;-1:-1:-1;;;;;29358:27:0;;29396:8;29408:7;29358:59;;;;;;;;;;;;;-1:-1:-1;;;;;29358:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29428:59:0;;;-1:-1:-1;;;29428:59:0;;;;;;;;-1:-1:-1;;;;;29468:9:0;29428:59;;;;;;;;;;;;;;29439:8;29428:29;;;;;;:59;;;;;29358;;29428;;;;;;;;-1:-1:-1;29428:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29513:8:0;;29508:112;;29569:38;-1:-1:-1;;;;;29577:3:0;29569:26;29597:3;29602;29569:26;:38::i;:::-;29688:9;;:22;;29703:5;29688:13;:22::i;:::-;29676:9;:34;29802:199;;;;;;;;-1:-1:-1;;;;;29831:22:0;;-1:-1:-1;29831:22:0;;;:8;:22;;;;;;:29;29802:199;;29831:43;;29866:6;29831:33;:43::i;:::-;29802:199;;29898:17;;;29802:199;;;;;;;;29941:12;29802:199;;;;;;;;;;;;;;-1:-1:-1;;;;;29777:22:0;;-1:-1:-1;29777:22:0;;;:8;:22;;;;;:224;;;;;;;;29898:17;29777:224;;;;;;;;;;;;;;;;;;;;;;;30106:17;29979:10;;30088:37;;:16;:37::i;:::-;30058:81;;;;;;;;30080:6;;30058:81;;;;;;;;;;30205:11;:9;:11::i;:::-;30191:12;:10;:12::i;:::-;30173:16;:14;:16::i;:::-;30155:63;;;;;;;30231:8;:6;:8::i;:::-;-1:-1:-1;30289:6:0;;28055:2249;-1:-1:-1;;;;;;;;28055:2249:0:o;36139:275::-;36196:4;36219:15;36214:193;;;36259:85;36339:3;36259:74;36293:14;-1:-1:-1;;;;;36276:42:0;;36320:9;36276:55;;;;;;;;;;;;;-1:-1:-1;;;;;36276:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36276:55:0;36259:11;:9;:11::i;36214:193::-;36384:11;:9;:11::i;22229:28::-;;;:::o;22012:::-;;;:::o;38353:268::-;38416:4;38453:3;-1:-1:-1;;;;;38443:13:0;:6;-1:-1:-1;;;;;38443:13:0;;;38434:24;;;;;;38488:9;-1:-1:-1;;;;;38478:19:0;:6;-1:-1:-1;;;;;38478:19:0;;;38469:30;;;;;;38510:81;38541:3;38554:6;-1:-1:-1;;;;;38546:26:0;;38582:4;38546:43;;;;;;;;;;;;;-1:-1:-1;;;;;38546:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38546:43:0;-1:-1:-1;;;;;38510:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;38609:4:0;38353:268;;;:::o;22400:39::-;;;:::o;22763:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35748:270::-;35791:15;35823:11;35845:3;-1:-1:-1;;;;;35837:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35837:27:0;;-1:-1:-1;35888:122:0;36004:4;35888:110;:92;35923:24;35942:3;35923:13;:11;:13::i;:24::-;35963:6;35888:19;:92::i;:122::-;35875:135;;35748:270;;:::o;27508:318::-;903:6;;-1:-1:-1;;;;;903:6:0;913:10;903:20;894:67;;;;;-1:-1:-1;;;894:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;894:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27604:22:0;::::1;27595:33;;;::::0;::::1;;27644:7;27639:180;;;27669:9;:16:::0;;-1:-1:-1;;;;;;;27669:16:0;;::::1;;-1:-1:-1::0;;;;;;27700:24:0::1;-1:-1:-1::0;;;;;27700:24:0;::::1;;::::0;;27639:180:::1;;;27757:9;:17:::0;;-1:-1:-1;;;;27757:17:0::1;::::0;;27789:7:::1;:18:::0;;-1:-1:-1;;;;;27789:18:0;::::1;-1:-1:-1::0;;;;;;27789:18:0;;::::1;;::::0;;27508:318;;:::o;22642:18::-;;;;;;;;;;;;;;:::o;22301:37::-;;;:::o;34455:261::-;34498:11;34540:69;34604:3;34540:58;34586:10;34540:40;34567:11;:9;:11::i;:::-;34540:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;34634:18;;34531:78;;-1:-1:-1;34625:27:0;;34620:89;;;-1:-1:-1;34679:18:0;;34455:261;:::o;33920:140::-;33963:4;33988:64;34044:6;33988:50;34021:5;:15;;;33996:3;-1:-1:-1;;;;;33988:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33988:27:0;;:31;:50::i;36721:286::-;36764:11;36789:20;36812:29;36830:9;;36812:12;:16;;:29;;;;:::i;:::-;36899:17;;36861:9;;36789:52;;-1:-1:-1;36861:57:0;;:32;;36789:52;36861:13;:32::i;:57::-;36852:66;;36943:9;;36934:6;:18;36929:71;;;36979:9;;36970:18;;36929:71;36721:286;;:::o;22938:21::-;;;;:::o;22856:::-;;;;:::o;2214:250::-;2272:7;2296:6;2292:47;;-1:-1:-1;2326:1:0;2319:8;;2292:47;2363:5;;;2367:1;2363;:5;:1;2387:5;;;;;:10;2379:56;;;;-1:-1:-1;;;2379:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:1;2214:250;-1:-1:-1;;;2214:250:0:o;2472:132::-;2530:7;2557:39;2561:1;2564;2557:39;;;;;;;;;;;;;;;;;:3;:39::i;31891:690::-;31980:4;32004:6;31998:551;;32070:3;-1:-1:-1;;;;;32062:22:0;;32086:10;32098:7;32062:45;;;;;;;;;;;;;-1:-1:-1;;;;;32062:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31998:551:0;;-1:-1:-1;31998:551:0;;32186:9;;-1:-1:-1;;;32186:9:0;;;;32181:357;;;32270:13;;32247:47;;;-1:-1:-1;;;32247:47:0;;-1:-1:-1;;;;;32270:13:0;;;32247:47;;;;;;;;;;;;32255:3;32247:21;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;32247:21:0;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32329:13:0;;32313:60;;;-1:-1:-1;;;32313:60:0;;;;;;;;-1:-1:-1;;;;;32313:60:0;;;;;;;;;32329:13;;;;;32313:37;;:60;;;;;32329:13;;32313:60;;;;;;;32329:13;;32313:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32181:357;;;32437:7;;32414:41;;;-1:-1:-1;;;32414:41:0;;-1:-1:-1;;;;;32437:7:0;;;32414:41;;;;;;;;;;;;32422:3;32414:21;;;;;;:41;;;;;;;;;;;;;;;-1:-1:-1;32414:21:0;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32484:7:0;;32474:48;;;-1:-1:-1;;;32474:48:0;;;;;;;;-1:-1:-1;;;;;32474:48:0;;;;;;;;;32484:7;;;;;32474:25;;:48;;;;;32414:41;;32474:48;;;;;;;32484:7;;32474:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32181:357:0;-1:-1:-1;32566:7:0;31891:690;-1:-1:-1;;31891:690:0:o;1870:136::-;1928:7;1955:43;1959:1;1962;1955:43;;;;;;;;;;;;;;;;;:3;:43::i;20027:719::-;20108:16;;:::i;:::-;20159:1;20145:11;:15;20137:66;;;;-1:-1:-1;;;20137:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20218:14;20214:50;;-1:-1:-1;20241:23:0;;;;;;;;;-1:-1:-1;20241:23:0;;20234:30;;20214:50;20281:24;;;20277:462;;20322:14;20367:11;19453:3;20340:23;;;20367:11;20339:39;;;;;;-1:-1:-1;;;;;;20401:21:0;;;20393:64;;;;;-1:-1:-1;;;20393:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20479:26;;;;;;;;20497:6;-1:-1:-1;;;;;20479:26:0;;;;20472:33;;;;;20277:462;20538:14;20555:45;20571:9;-1:-1:-1;;;20588:11:0;20555:15;:45::i;:::-;20538:62;-1:-1:-1;;;;;;20623:21:0;;;20615:64;;;;;-1:-1:-1;;;20615:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19882:137;19984:7;19995:16;-1:-1:-1;;;;;19979:13:0;;;:32;;19882:137::o;33651:124::-;33704:28;33719:11;:9;:11::i;33704:28::-;33692:9;:40;33755:12;33743:9;:24;33651:124::o;34843:345::-;34884:11;34918:69;34982:3;34918:58;34964:10;34918:40;34945:11;:9;:11::i;34918:69::-;35012:18;;34909:78;;-1:-1:-1;35003:27:0;;34998:183;;;-1:-1:-1;35057:18:0;;34998:183;;;35106:18;;:23;35101:80;;35168:1;35147:18;:22;34843:345;:::o;16564:205::-;16692:68;;;-1:-1:-1;;;;;16692:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16692:68:0;-1:-1:-1;;;16692:68:0;;;16665:96;;16685:5;;16665:19;:96::i;:::-;16564:205;;;;:::o;16379:177::-;16489:58;;;-1:-1:-1;;;;;16489:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16489:58:0;-1:-1:-1;;;16489:58:0;;;16462:86;;16482:5;;16462:19;:86::i;:::-;16379:177;;;:::o;1681:181::-;1739:7;1771:5;;;1795:6;;;;1787:46;;;;;-1:-1:-1;;;1787:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32673:917;32759:17;;32733:20;;32711:19;;32733:45;;:20;:24;:45::i;:::-;32793:15;;32711:67;;-1:-1:-1;32793:20:0;;;;:54;;;32833:14;32817:12;:30;;32793:54;32789:794;;;32880:5;:21;32921:10;:14;;;32916:494;;;33008:15;;32981:5;:21;:44;;:25;:44::i;:::-;32957:5;:68;;;33074:17;;-1:-1:-1;33044:112:0;;33135:1;33117:15;:19;33044:112;32916:494;;;33247:15;;33220:5;:21;:44;;:25;:44::i;:::-;33196:5;:68;;;33313:17;;-1:-1:-1;33283:112:0;;33374:1;33356:15;:19;33283:112;33447:12;33424:20;:35;:20;33515:21;33538:15;;33424:10;33555:14;33479:92;;;;;;;;;;;;;;;;;;;;33555:14;;33479:92;;;;;;;;;;;;;;;;32789:794;;32673:917;:::o;2612:189::-;2698:7;2733:12;2726:5;2718:28;;;;-1:-1:-1;;;2718:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2757:9;2773:1;2769;:5;;;;;;;2612:189;-1:-1:-1;;;;;2612:189:0:o;2014:192::-;2100:7;2136:12;2128:6;;;;2120:29;;;;-1:-1:-1;;;2120:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2172:5:0;;;2014:192::o;18927:347::-;19033:7;19054:9;19065;19078:13;19086:1;19089;19078:7;:13::i;:::-;19053:38;;;;19102:10;19128:1;19115:15;;;;;19125:1;19122;19115:15;19102:28;;19150:1;19145:2;:6;19141:18;;;19158:1;19153:6;;;;19141:18;19175:2;19170:7;;;;19200:1;19196;:5;19188:44;;;;;-1:-1:-1;;;19188:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19250:16;19258:1;19261;19264;19250:7;:16::i;:::-;19243:23;18927:347;-1:-1:-1;;;;;;;18927:347:0:o;17768:420::-;17851:23;17877:69;17905:4;17877:69;;;;;;;;;;;;;;;;;17885:5;-1:-1:-1;;;;;17877:27:0;;;:69;;;;;:::i;:::-;17961:17;;17851:95;;-1:-1:-1;17961:21:0;17957:224;;18103:10;18092:30;;;;;;;;;;;;;;;-1:-1:-1;18092:30:0;18084:85;;;;-1:-1:-1;;;18084:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18219:210;18280:9;;;-1:-1:-1;;18336:1:0;18333;18326:25;18313:38;;18370:1;18366;:5;18362:9;;18391:1;18386:2;:6;18382:10;;18412:1;18407:2;:6;18403:18;;;18420:1;18415:6;;;;18403:18;18219:210;;;;;;:::o;18437:482::-;18543:7;18582:2;;;18578:6;;;18583:1;18578:6;18595:9;;;;;;;18620:4;18615:9;;;;;;;;;18655:4;18647;18646:5;;18645:14;;;;;18704:1;:9;;;18733:5;;;18729:9;;18724:14;18758:5;;;18754:9;;18749:14;18783:5;;;18779:9;;18774:14;18808:5;;;18804:9;;18799:14;18833:5;;;18829:9;;18824:14;18858:5;;;18854:9;;18849:14;18883:5;;;18879:9;;18874:14;;;18645;;18662:1;18645:18;18640:24;;;;18635:29;;;;18906:5;;18437:482;-1:-1:-1;;18437:482:0:o;4313:196::-;4416:12;4448:53;4471:6;4479:4;4485:1;4488:12;4448:22;:53::i;:::-;4441:60;4313:196;-1:-1:-1;;;;4313:196:0:o;5289:979::-;5419:12;5452:18;5463:6;5452:10;:18::i;:::-;5444:60;;;;;-1:-1:-1;;;5444:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5578:12;5592:23;5619:6;-1:-1:-1;;;;;5619:11:0;5639:8;5650:4;5619:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5619:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5577:78;;;;5670:7;5666:595;;;5701:10;-1:-1:-1;5694:17:0;;-1:-1:-1;5694:17:0;5666:595;5815:17;;:21;5811:439;;6078:10;6072:17;6139:15;6126:10;6122:2;6118:19;6111:44;6026:148;6214:20;;-1:-1:-1;;;6214:20:0;;;;;;;;;;;;;;;;;6221:12;;6214:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3486:233;3664:20;3703:8;;;3486:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://c1e2cba270c7715a32e8ac05dd8ecdf31b6a53ad357aa0cff8b292f07a6af86a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $83.48 | 16.8367 | $1,405.52 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.