More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,167 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 14074335 | 940 days ago | IN | 0 ETH | 0.00296211 | ||||
Redeem | 14056521 | 943 days ago | IN | 0 ETH | 0.00729934 | ||||
Redeem | 14050850 | 944 days ago | IN | 0 ETH | 0.0127824 | ||||
Redeem | 14050406 | 944 days ago | IN | 0 ETH | 0.00935264 | ||||
Redeem | 14049020 | 944 days ago | IN | 0 ETH | 0.02991283 | ||||
Redeem | 14046431 | 945 days ago | IN | 0 ETH | 0.00965717 | ||||
Redeem | 14042915 | 945 days ago | IN | 0 ETH | 0.00473053 | ||||
Redeem | 14042127 | 945 days ago | IN | 0 ETH | 0.00544536 | ||||
Redeem | 14041932 | 945 days ago | IN | 0 ETH | 0.00429377 | ||||
Redeem | 14041646 | 945 days ago | IN | 0 ETH | 0.00661731 | ||||
Redeem | 14041644 | 945 days ago | IN | 0 ETH | 0.00479764 | ||||
Redeem | 14041636 | 945 days ago | IN | 0 ETH | 0.00543214 | ||||
Redeem | 14039902 | 946 days ago | IN | 0 ETH | 0.00790295 | ||||
Redeem | 14038474 | 946 days ago | IN | 0 ETH | 0.00873136 | ||||
Redeem | 14036585 | 946 days ago | IN | 0 ETH | 0.00396969 | ||||
Redeem | 14036585 | 946 days ago | IN | 0 ETH | 0.00518991 | ||||
Redeem | 14036345 | 946 days ago | IN | 0 ETH | 0.02449076 | ||||
Redeem | 14033149 | 947 days ago | IN | 0 ETH | 0.00512228 | ||||
Redeem | 14032631 | 947 days ago | IN | 0 ETH | 0.00883513 | ||||
Redeem | 14032630 | 947 days ago | IN | 0 ETH | 0.0078711 | ||||
Redeem | 14032628 | 947 days ago | IN | 0 ETH | 0.00739438 | ||||
Deposit | 14032367 | 947 days ago | IN | 0 ETH | 0.03613139 | ||||
Redeem | 14032043 | 947 days ago | IN | 0 ETH | 0.00761921 | ||||
Redeem | 14030820 | 947 days ago | IN | 0 ETH | 0.01154904 | ||||
Redeem | 14030724 | 947 days ago | IN | 0 ETH | 0.02412253 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-23 */ // 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 (uint256 c) { if (a > 3) { c = a; uint256 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 private constant 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 (uint256) { return uint256(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint::fraction: division by zero"); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), "FixedPoint::fraction: overflow"); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), "FixedPoint::fraction: overflow"); return uq112x112(uint224(result)); } } } interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } interface ITreasury { function deposit( uint256 _amount, address _token, uint256 _profit ) external returns (bool); function updateReserve(address _token, uint256 _amount) external; function valueOfToken(address _token, uint256 _amount) external view returns (uint256 value_); function mintRewards(address _recipient, uint256 _amount) external; } interface IStaking { function stake(uint256 _amount, address _recipient) external returns (bool); } interface IStakingHelper { function stake(uint256 _amount, address _recipient) external; } contract TokenBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint256; /* ======== EVENTS ======== */ event BondCreated( uint256 deposit, uint256 indexed payout, uint256 indexed expires, uint256 indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint256 payout, uint256 remaining ); event BondPriceChanged( uint256 indexed priceInUSD, uint256 indexed internalPrice, uint256 indexed debtRatio ); event ControlVariableAdjustment( uint256 initialBCV, uint256 newBCV, uint256 adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable LOBI; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints LOBI when receives principle address public DAO; // receives profit share from bond address public partnerDAO; // receives profit share from bond AggregatorV3Interface internal priceFeed; address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping(address => Bond) public bondInfo; // stores bond information for depositors uint256 public totalDebt; // total value of outstanding bonds; used for pricing uint256 public lastDecay; // reference block for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint256 controlVariable; // scaling variable for price uint256 vestingTerm; // in blocks uint256 minimumPrice; // vs principle value. 4 decimals (1500 = 0.15) uint256 maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint256 feePartner; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) } // Info for bond holder struct Bond { uint256 payout; // LOBI remaining to be paid uint256 vesting; // Blocks left to vest uint256 lastBlock; // Last interaction uint256 pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint256 rate; // increment uint256 target; // BCV when adjustment finished uint256 buffer; // minimum length (in blocks) between adjustments uint256 lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor( address _LOBI, address _principle, address _treasury, address _DAO, address _partnerDAO, address _feed ) { require(_LOBI != address(0)); LOBI = _LOBI; require(_principle != address(0)); principle = _principle; require(_treasury != address(0)); treasury = _treasury; require(_DAO != address(0)); DAO = _DAO; require(_partnerDAO != address(0)); partnerDAO = _partnerDAO; require(_feed != address(0)); priceFeed = AggregatorV3Interface(_feed); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint256 _controlVariable, uint256 _vestingTerm, uint256 _minimumPrice, uint256 _maxPayout, uint256 _maxDebt, uint256 _initialDebt, uint256 _fee, uint256 _feePartner ) external onlyPolicy { terms = Terms({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, maxDebt: _maxDebt, fee: _fee, feePartner: _feePartner }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, DEBT, FEE, FEEPARTNER } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms(PARAMETER _parameter, uint256 _input) external onlyPolicy { if (_parameter == PARAMETER.VESTING) { // 0 require(_input >= 10000, "Vesting must be longer than 36 hours"); terms.vestingTerm = _input; } else if (_parameter == PARAMETER.PAYOUT) { // 1 require(_input <= 1000, "Payout cannot be above 1 percent"); terms.maxPayout = _input; } else if (_parameter == PARAMETER.DEBT) { // 2 terms.maxDebt = _input; } else if (_parameter == PARAMETER.FEE) { // 3 terms.fee = _input; } else if (_parameter == PARAMETER.FEEPARTNER) { // 4 terms.feePartner = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment( bool _addition, uint256 _increment, uint256 _target, uint256 _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( uint256 _amount, uint256 _maxPrice, address _depositor ) external returns (uint256) { require(_depositor != address(0), "Invalid address"); decayDebt(); require(totalDebt <= terms.maxDebt, "Max capacity reached"); uint256 priceInUSD = bondPriceInUSD(); // Stored in bond info uint256 nativePrice = _bondPrice(); require(_maxPrice >= nativePrice, "Slippage limit: more than max price"); // slippage protection uint256 value = ITreasury(treasury).valueOfToken(principle, _amount); uint256 payout = payoutFor(value); // payout to bonder is computed require(payout >= 10000000, "Bond too small"); // must be > 0.01 LOBI ( underflow protection ) require(payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint256 fee = payout.mul(terms.fee).div(10000); uint256 feePartner = payout.mul(terms.feePartner).div(10000); /** asset carries risk and is not minted against asset transfered to treasury and rewards minted as payout */ IERC20(principle).safeTransferFrom(msg.sender, treasury, _amount); ITreasury(treasury).updateReserve(principle, value); ITreasury(treasury).mintRewards( address(this), payout.add(fee).add(feePartner) ); if (fee != 0) { IERC20(LOBI).safeTransfer(DAO, fee); } if (feePartner != 0) { IERC20(LOBI).safeTransfer(partnerDAO, feePartner); } // 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 (uint256) { Bond memory info = bondInfo[_recipient]; uint256 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 uint256 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, uint256 _amount ) internal returns (uint256) { if (!_stake) { // if user does not want to stake IERC20(LOBI).transfer(_recipient, _amount); // send payout } else { // if user wants to stake if (useHelper) { // use if staking warmup is 0 IERC20(LOBI).approve(stakingHelper, _amount); IStakingHelper(stakingHelper).stake(_amount, _recipient); } else { IERC20(LOBI).approve(staking, _amount); IStaking(staking).stake(_amount, _recipient); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint256 blockCanAdjust = adjustment.lastBlock.add(adjustment.buffer); if (adjustment.rate != 0 && block.number >= blockCanAdjust) { uint256 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 (uint256) { return IERC20(LOBI).totalSupply().mul(terms.maxPayout).div(100000); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor(uint256 _value) public view returns (uint256) { return FixedPoint.fraction(_value, bondPrice()).decode112with18().div(1e14); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns (uint256 price_) { price_ = terms.controlVariable.mul(debtRatio()).div(1e5); if (price_ < terms.minimumPrice) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns (uint256 price_) { price_ = terms.controlVariable.mul(debtRatio()).div(1e5); if (price_ < terms.minimumPrice) { price_ = terms.minimumPrice; } else if (terms.minimumPrice != 0) { terms.minimumPrice = 0; } } /** * @notice get asset price from chainlink */ function assetPrice() public view returns (int256) { (, int256 price, , , ) = priceFeed.latestRoundData(); return price; } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns (uint256 price_) { price_ = bondPrice().mul(uint256(assetPrice())).mul(1e6); } /** * @notice calculate current ratio of debt to LOBI supply * @return debtRatio_ uint */ function debtRatio() public view returns (uint256 debtRatio_) { uint256 supply = IERC20(LOBI).totalSupply(); debtRatio_ = FixedPoint .fraction(currentDebt().mul(1e9), supply) .decode112with18() .div(1e18); } /** * @notice debt ratio in same terms as reserve bonds * @return uint */ function standardizedDebtRatio() external view returns (uint256) { return debtRatio().mul(uint256(assetPrice())).div(1e8); // ETH feed is 8 decimals } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns (uint256) { return totalDebt.sub(debtDecay()); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns (uint256 decay_) { uint256 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 (uint256 percentVested_) { Bond memory bond = bondInfo[_depositor]; uint256 blocksSinceLast = block.number.sub(bond.lastBlock); uint256 vesting = bond.vesting; if (vesting > 0) { percentVested_ = blocksSinceLast.mul(10000).div(vesting); } else { percentVested_ = 0; } } /** * @notice calculate amount of LOBI available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor(address _depositor) external view returns (uint256 pendingPayout_) { uint256 percentVested = percentVestedFor(_depositor); uint256 payout = bondInfo[_depositor].payout; if (percentVested >= 10000) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul(percentVested).div(10000); } } function setDAOs(address _DAO, address _partnerDAO) external onlyPolicy { DAO = _DAO; partnerDAO = _partnerDAO; } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or LOBI) to the DAO * @return bool */ function recoverLostToken(address _token) external returns (bool) { require(_token != LOBI); 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":"_LOBI","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_partnerDAO","type":"address"},{"internalType":"address","name":"_feed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOBI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_feePartner","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partnerDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"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 TokenBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_partnerDAO","type":"address"}],"name":"setDAOs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"feePartner","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
60e06040523480156200001157600080fd5b5060405162002a4338038062002a43833981810160405260c08110156200003757600080fd5b50805160208201516040808401516060850151608086015160a090960151600080546001600160a01b031916331780825594519697959693959294929391926001600160a01b0316917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038616620000b957600080fd5b6001600160601b0319606087901b166080526001600160a01b038516620000df57600080fd5b6001600160601b0319606086901b1660a0526001600160a01b0384166200010557600080fd5b6001600160601b0319606085901b1660c0526001600160a01b0383166200012b57600080fd5b600280546001600160a01b0319166001600160a01b038581169190911790915582166200015757600080fd5b600380546001600160a01b0319166001600160a01b038481169190911790915581166200018357600080fd5b600480546001600160a01b039092166001600160a01b0319909216919091179055505050505060805160601c60a05160601c60c05160601c6128146200022f60003980610e7e528061101352806111eb528061121252806112c75250806105e0528061104252806111c8528061124152806115b852508061137c52806113bc52806115535280611579528061173452806119805280611b055280611bea5280611cff52506128146000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063844b5c7c11610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b146105b6578063e0176de8146105be578063e392a262146105c6578063f5c2ab5b146105ce578063fc7b9c18146105d65761021c565b8063cea55f5714610538578063d24378eb14610540578063d4d863ce14610548578063d5025625146105765761021c565b806399286b59116100f457806399286b5914610488578063a5ffd19714610490578063b4abccba14610498578063bfce3e0c146104be578063cd1234b3146104ec5761021c565b8063844b5c7c1461043e5780638dbdbe6d14610446578063904b3ece1461047857806398fabd3a146104805761021c565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a1461040157806361d027b314610409578063759076e51461041157806377b81895146104195780637927ebf8146104215761021c565b8063451ee4a11461037857806346f68ee9146103ad5780634cf088d9146103d3578063507930ec146103db5761021c565b80631a3d0068116101ef5780631a3d00681461028f5780631e321a0f146102c05780631feed31f146102e65780632f3f470a146103145780633283ad0e146103305761021c565b8063016a42841461022157806301b88ee8146102455780630505c8c91461027d578063089208d814610285575b600080fd5b6102296105de565b604080516001600160a01b039092168252519081900360200190f35b61026b6004803603602081101561025b57600080fd5b50356001600160a01b0316610602565b60408051918252519081900360200190f35b61022961065b565b61028d61066b565b005b61028d600480360360808110156102a557600080fd5b50803515159060208101359060408101359060600135610702565b61028d600480360360408110156102d657600080fd5b5060ff81351690602001356107fa565b61026b600480360360408110156102fc57600080fd5b506001600160a01b0381351690602001351515610975565b61031c610b6a565b604080519115158252519081900360200190f35b61028d600480360361010081101561034757600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e00135610b7a565b610380610c2c565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b61028d600480360360208110156103c357600080fd5b50356001600160a01b0316610c44565b610229610d31565b61026b600480360360208110156103f157600080fd5b50356001600160a01b0316610d40565b61028d610dd2565b610229610e7c565b61026b610ea0565b610229610ebb565b61026b6004803603602081101561043757600080fd5b5035610eca565b61026b610eef565b61026b6004803603606081101561045c57600080fd5b50803590602081013590604001356001600160a01b0316610f11565b61026b611516565b610229611533565b610229611542565b610229611551565b61031c600480360360208110156104ae57600080fd5b50356001600160a01b0316611575565b61028d600480360360408110156104d457600080fd5b506001600160a01b038135811691602001351661168d565b6105126004803603602081101561050257600080fd5b50356001600160a01b0316611708565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61026b61172f565b61026b6117e7565b61028d6004803603604081101561055e57600080fd5b506001600160a01b0381351690602001351515611860565b61057e611923565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61026b61193b565b61026b61196c565b61026b611a09565b61026b611a4e565b61026b611a54565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061060e83610d40565b6001600160a01b038416600090815260136020526040902054909150612710821061063b57809250610654565b61065161271061064b8385611a5a565b90611aba565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b031633146106b8576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461074f576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600754610765906103e89061064b906019611a5a565b8311156107af576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600e805460ff19169091179055600f92909255601055601155601255565b6000546001600160a01b03163314610847576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600082600481111561085557fe5b14156108a65761271081101561089c5760405162461bcd60e51b81526004018080602001828103825260248152602001806127916024913960400191505060405180910390fd5b6008819055610971565b60018260048111156108b457fe5b141561091b576103e8811115610911576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b600a819055610971565b600282600481111561092957fe5b141561093957600b819055610971565b600382600481111561094757fe5b141561095757600c819055610971565b600482600481111561096557fe5b141561097157600d8190555b5050565b600061097f612684565b506001600160a01b0383166000908152601360209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109d285610d40565b90506127108110610a62576001600160a01b03851660008181526013602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a5985858460000151611afc565b92505050610b64565b8151600090610a79906127109061064b9085611a5a565b90506040518060800160405280610a9d838660000151611e0090919063ffffffff16565b8152602001610ac7610abc866040015143611e0090919063ffffffff16565b602087015190611e00565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152601384528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b5e868683611afc565b93505050505b92915050565b600654600160a01b900460ff1681565b6000546001600160a01b03163314610bc7576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b6040805160e08101825289815260208101899052908101879052606081018690526080810185905260a0810183905260c001819052600797909755600895909555600993909355600a91909155600b55600c91909155600d9190915560145543601555565b600e54600f5460105460115460125460ff9094169385565b6000546001600160a01b03163314610c91576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b6001600160a01b038116610cd65760405162461bcd60e51b81526004018080602001828103825260268152602001806126bf6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000610d4a612684565b506001600160a01b03821660009081526013602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610da0904390611e00565b60208301519091508015610dc557610dbe8161064b84612710611a5a565b9350610dca565b600093505b505050919050565b6001546001600160a01b03163314610e1b5760405162461bcd60e51b81526004018080602001828103825260228152602001806126e56022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610eb6610ead611a09565b60145490611e00565b905090565b6006546001600160a01b031681565b6000610b64655af3107a400061064b610eea85610ee561193b565b611e42565b611fb9565b6000610eb6620f4240610f0b610f036117e7565b610f0b61193b565b90611a5a565b60006001600160a01b038216610f60576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b610f68611fd1565b600b546014541115610fb8576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000610fc2610eef565b90506000610fce611fe5565b90508085101561100f5760405162461bcd60e51b815260040180806020018281038252602381526020018061276e6023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156110a657600080fd5b505afa1580156110ba573d6000803e3d6000fd5b505050506040513d60208110156110d057600080fd5b5051905060006110df82610eca565b90506298968081101561112a576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b61113261196c565b811115611177576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b600061119761271061064b60076005015485611a5a90919063ffffffff16565b905060006111b961271061064b60076006015486611a5a90919063ffffffff16565b90506112106001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f00000000000000000000000000000000000000000000000000000000000000008d61201f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356a07a3b7f0000000000000000000000000000000000000000000000000000000000000000866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156112a757600080fd5b505af11580156112bb573d6000803e3d6000fd5b50506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169150636a20de92905030611305846112ff888861207f565b9061207f565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561134b57600080fd5b505af115801561135f573d6000803e3d6000fd5b50505050816000146113a5576002546113a5906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846120d9565b80156113e5576003546113e5906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116836120d9565b6014546113f2908561207f565b601455604080516080810182526001600160a01b038a166000908152601360205291909120548190611424908661207f565b81526008805460208084019190915243604080850182905260609485018c90526001600160a01b038e1660009081526013845281902086518155928601516001840155850151600283015593909201516003909201919091555487916114899161207f565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a46114c761172f565b6114cf611fe5565b6114d7610eef565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a4611508612130565b509098975050505050505050565b6000610eb66305f5e10061064b61152b6117e7565b610f0b61172f565b6002546001600160a01b031681565b6003546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156115b657600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156115f557600080fd5b600254604080516370a0823160e01b81523060048201529051611685926001600160a01b0390811692908616916370a0823191602480820192602092909190829003018186803b15801561164857600080fd5b505afa15801561165c573d6000803e3d6000fd5b505050506040513d602081101561167257600080fd5b50516001600160a01b03851691906120d9565b506001919050565b6000546001600160a01b031633146116da576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b60136020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561178b57600080fd5b505afa15801561179f573d6000803e3d6000fd5b505050506040513d60208110156117b557600080fd5b505190506117e1670de0b6b3a764000061064b610eea6117db633b9aca00610f0b610ea0565b85611e42565b91505090565b6004805460408051633fabe5a360e21b8152905160009384936001600160a01b03169263feaf968c928183019260a092829003018186803b15801561182b57600080fd5b505afa15801561183f573d6000803e3d6000fd5b505050506040513d60a081101561185557600080fd5b506020015191505090565b6000546001600160a01b031633146118ad576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b6001600160a01b0382166118c057600080fd5b80156118f55760068054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610971565b6006805460ff60a01b19169055600580546001600160a01b0384166001600160a01b03199091161790555050565b600754600854600954600a54600b54600c54600d5487565b6000611958620186a061064b61194f61172f565b60075490611a5a565b600954909150811015610668575060095490565b6000610eb6620186a061064b6007600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d757600080fd5b505afa1580156119eb573d6000803e3d6000fd5b505050506040513d6020811015611a0157600080fd5b505190611a5a565b600080611a2160155443611e0090919063ffffffff16565b600854601454919250611a389161064b9084611a5a565b9150601454821115611a4a5760145491505b5090565b60155481565b60145481565b600082611a6957506000610b64565b82820282848281611a7657fe5b0414611ab35760405162461bcd60e51b815260040180806020018281038252602181526020018061272d6021913960400191505060405180910390fd5b9392505050565b6000611ab383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612210565b600082611bac577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b7a57600080fd5b505af1158015611b8e573d6000803e3d6000fd5b505050506040513d6020811015611ba457600080fd5b50611df99050565b600654600160a01b900460ff1615611cd3576006546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611c3557600080fd5b505af1158015611c49573d6000803e3d6000fd5b505050506040513d6020811015611c5f57600080fd5b505060065460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611cb657600080fd5b505af1158015611cca573d6000803e3d6000fd5b50505050611df9565b6005546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611d4a57600080fd5b505af1158015611d5e573d6000803e3d6000fd5b505050506040513d6020811015611d7457600080fd5b505060055460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d6020811015611df657600080fd5b50505b5092915050565b6000611ab383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506122b2565b611e4a6126ac565b60008211611e895760405162461bcd60e51b81526004018080602001828103825260268152602001806127076026913960400191505060405180910390fd5b82611ea35750604080516020810190915260008152610b64565b71ffffffffffffffffffffffffffffffffffff8311611f4a57600082607085901b81611ecb57fe5b0490506001600160e01b03811115611f2a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b64565b6000611f5b84600160701b8561230c565b90506001600160e01b03811115611f2a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b611fdc610ead611a09565b60145543601555565b6000611ff9620186a061064b61194f61172f565b60095490915081101561200f5750600954610668565b6009541561066857600060095590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526120799085906123ac565b50505050565b600082820183811015611ab3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261212b9084906123ac565b505050565b601154601254600091612143919061207f565b600f54909150158015906121575750804310155b1561220d57600754600e5460ff161561219157600f546007546121799161207f565b60078190556010541161218c576000600f555b6121b3565b600f546007546121a091611e00565b6007819055601054106121b3576000600f555b43601255600754600f54600e546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b6000818361229c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612261578181015183820152602001612249565b50505050905090810190601f16801561228e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816122a857fe5b0495945050505050565b600081848411156123045760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612261578181015183820152602001612249565b505050900390565b600080600061231b868661245d565b915091506000848061232957fe5b86880990508281111561233d576001820391505b8083039250848210612396576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6123a183838761248a565b979650505050505050565b6060612401826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124fa9092919063ffffffff16565b80519091501561212b5780806020019051602081101561242057600080fd5b505161212b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806127b5602a913960400191505060405180910390fd5b6000808060001984860990508385029250828103915082811015612482576001820391505b509250929050565b6000818103821680838161249a57fe5b0492508085816124a657fe5b0494508081600003816124b557fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606125098484600085612511565b949350505050565b606061251c8561267e565b61256d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106125ac5780518252601f19909201916020918201910161258d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461260e576040519150601f19603f3d011682016040523d82523d6000602084013e612613565b606091505b509150915081156126275791506125099050565b8051156126375780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612261578181015183820152602001612249565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122038e726c31dc175b4d4f584e4f8bc93ab04b309316c36ef7091282a0a503947d664736f6c63430007050033000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd05000000000000000000000000de50fb295549eda934d222e7a24d5a8dd132444f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000cd627aa160a6fa45eb793d19ef54f5062f20f33f
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063844b5c7c11610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b146105b6578063e0176de8146105be578063e392a262146105c6578063f5c2ab5b146105ce578063fc7b9c18146105d65761021c565b8063cea55f5714610538578063d24378eb14610540578063d4d863ce14610548578063d5025625146105765761021c565b806399286b59116100f457806399286b5914610488578063a5ffd19714610490578063b4abccba14610498578063bfce3e0c146104be578063cd1234b3146104ec5761021c565b8063844b5c7c1461043e5780638dbdbe6d14610446578063904b3ece1461047857806398fabd3a146104805761021c565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a1461040157806361d027b314610409578063759076e51461041157806377b81895146104195780637927ebf8146104215761021c565b8063451ee4a11461037857806346f68ee9146103ad5780634cf088d9146103d3578063507930ec146103db5761021c565b80631a3d0068116101ef5780631a3d00681461028f5780631e321a0f146102c05780631feed31f146102e65780632f3f470a146103145780633283ad0e146103305761021c565b8063016a42841461022157806301b88ee8146102455780630505c8c91461027d578063089208d814610285575b600080fd5b6102296105de565b604080516001600160a01b039092168252519081900360200190f35b61026b6004803603602081101561025b57600080fd5b50356001600160a01b0316610602565b60408051918252519081900360200190f35b61022961065b565b61028d61066b565b005b61028d600480360360808110156102a557600080fd5b50803515159060208101359060408101359060600135610702565b61028d600480360360408110156102d657600080fd5b5060ff81351690602001356107fa565b61026b600480360360408110156102fc57600080fd5b506001600160a01b0381351690602001351515610975565b61031c610b6a565b604080519115158252519081900360200190f35b61028d600480360361010081101561034757600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c08101359060e00135610b7a565b610380610c2c565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b61028d600480360360208110156103c357600080fd5b50356001600160a01b0316610c44565b610229610d31565b61026b600480360360208110156103f157600080fd5b50356001600160a01b0316610d40565b61028d610dd2565b610229610e7c565b61026b610ea0565b610229610ebb565b61026b6004803603602081101561043757600080fd5b5035610eca565b61026b610eef565b61026b6004803603606081101561045c57600080fd5b50803590602081013590604001356001600160a01b0316610f11565b61026b611516565b610229611533565b610229611542565b610229611551565b61031c600480360360208110156104ae57600080fd5b50356001600160a01b0316611575565b61028d600480360360408110156104d457600080fd5b506001600160a01b038135811691602001351661168d565b6105126004803603602081101561050257600080fd5b50356001600160a01b0316611708565b604080519485526020850193909352838301919091526060830152519081900360800190f35b61026b61172f565b61026b6117e7565b61028d6004803603604081101561055e57600080fd5b506001600160a01b0381351690602001351515611860565b61057e611923565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61026b61193b565b61026b61196c565b61026b611a09565b61026b611a4e565b61026b611a54565b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b60008061060e83610d40565b6001600160a01b038416600090815260136020526040902054909150612710821061063b57809250610654565b61065161271061064b8385611a5a565b90611aba565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b031633146106b8576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461074f576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600754610765906103e89061064b906019611a5a565b8311156107af576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600e805460ff19169091179055600f92909255601055601155601255565b6000546001600160a01b03163314610847576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600082600481111561085557fe5b14156108a65761271081101561089c5760405162461bcd60e51b81526004018080602001828103825260248152602001806127916024913960400191505060405180910390fd5b6008819055610971565b60018260048111156108b457fe5b141561091b576103e8811115610911576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b600a819055610971565b600282600481111561092957fe5b141561093957600b819055610971565b600382600481111561094757fe5b141561095757600c819055610971565b600482600481111561096557fe5b141561097157600d8190555b5050565b600061097f612684565b506001600160a01b0383166000908152601360209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109d285610d40565b90506127108110610a62576001600160a01b03851660008181526013602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a5985858460000151611afc565b92505050610b64565b8151600090610a79906127109061064b9085611a5a565b90506040518060800160405280610a9d838660000151611e0090919063ffffffff16565b8152602001610ac7610abc866040015143611e0090919063ffffffff16565b602087015190611e00565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152601384528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b5e868683611afc565b93505050505b92915050565b600654600160a01b900460ff1681565b6000546001600160a01b03163314610bc7576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b6040805160e08101825289815260208101899052908101879052606081018690526080810185905260a0810183905260c001819052600797909755600895909555600993909355600a91909155600b55600c91909155600d9190915560145543601555565b600e54600f5460105460115460125460ff9094169385565b6000546001600160a01b03163314610c91576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b6001600160a01b038116610cd65760405162461bcd60e51b81526004018080602001828103825260268152602001806126bf6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000610d4a612684565b506001600160a01b03821660009081526013602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610da0904390611e00565b60208301519091508015610dc557610dbe8161064b84612710611a5a565b9350610dca565b600093505b505050919050565b6001546001600160a01b03163314610e1b5760405162461bcd60e51b81526004018080602001828103825260228152602001806126e56022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd0581565b6000610eb6610ead611a09565b60145490611e00565b905090565b6006546001600160a01b031681565b6000610b64655af3107a400061064b610eea85610ee561193b565b611e42565b611fb9565b6000610eb6620f4240610f0b610f036117e7565b610f0b61193b565b90611a5a565b60006001600160a01b038216610f60576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b610f68611fd1565b600b546014541115610fb8576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000610fc2610eef565b90506000610fce611fe5565b90508085101561100f5760405162461bcd60e51b815260040180806020018281038252602381526020018061276e6023913960400191505060405180910390fd5b60007f000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd056001600160a01b031663d1b317e57f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156110a657600080fd5b505afa1580156110ba573d6000803e3d6000fd5b505050506040513d60208110156110d057600080fd5b5051905060006110df82610eca565b90506298968081101561112a576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b61113261196c565b811115611177576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b600061119761271061064b60076005015485611a5a90919063ffffffff16565b905060006111b961271061064b60076006015486611a5a90919063ffffffff16565b90506112106001600160a01b037f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5216337f000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd058d61201f565b7f000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd056001600160a01b03166356a07a3b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156112a757600080fd5b505af11580156112bb573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd05169150636a20de92905030611305846112ff888861207f565b9061207f565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561134b57600080fd5b505af115801561135f573d6000803e3d6000fd5b50505050816000146113a5576002546113a5906001600160a01b037f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d81169116846120d9565b80156113e5576003546113e5906001600160a01b037f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d81169116836120d9565b6014546113f2908561207f565b601455604080516080810182526001600160a01b038a166000908152601360205291909120548190611424908661207f565b81526008805460208084019190915243604080850182905260609485018c90526001600160a01b038e1660009081526013845281902086518155928601516001840155850151600283015593909201516003909201919091555487916114899161207f565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a46114c761172f565b6114cf611fe5565b6114d7610eef565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a4611508612130565b509098975050505050505050565b6000610eb66305f5e10061064b61152b6117e7565b610f0b61172f565b6002546001600160a01b031681565b6003546001600160a01b031681565b7f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d81565b60007f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d6001600160a01b0316826001600160a01b031614156115b657600080fd5b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001600160a01b0316826001600160a01b031614156115f557600080fd5b600254604080516370a0823160e01b81523060048201529051611685926001600160a01b0390811692908616916370a0823191602480820192602092909190829003018186803b15801561164857600080fd5b505afa15801561165c573d6000803e3d6000fd5b505050506040513d602081101561167257600080fd5b50516001600160a01b03851691906120d9565b506001919050565b6000546001600160a01b031633146116da576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b60136020526000908152604090208054600182015460028301546003909301549192909184565b6000807f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561178b57600080fd5b505afa15801561179f573d6000803e3d6000fd5b505050506040513d60208110156117b557600080fd5b505190506117e1670de0b6b3a764000061064b610eea6117db633b9aca00610f0b610ea0565b85611e42565b91505090565b6004805460408051633fabe5a360e21b8152905160009384936001600160a01b03169263feaf968c928183019260a092829003018186803b15801561182b57600080fd5b505afa15801561183f573d6000803e3d6000fd5b505050506040513d60a081101561185557600080fd5b506020015191505090565b6000546001600160a01b031633146118ad576040805162461bcd60e51b8152602060048201819052602482015260008051602061274e833981519152604482015290519081900360640190fd5b6001600160a01b0382166118c057600080fd5b80156118f55760068054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610971565b6006805460ff60a01b19169055600580546001600160a01b0384166001600160a01b03199091161790555050565b600754600854600954600a54600b54600c54600d5487565b6000611958620186a061064b61194f61172f565b60075490611a5a565b600954909150811015610668575060095490565b6000610eb6620186a061064b6007600301547f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d757600080fd5b505afa1580156119eb573d6000803e3d6000fd5b505050506040513d6020811015611a0157600080fd5b505190611a5a565b600080611a2160155443611e0090919063ffffffff16565b600854601454919250611a389161064b9084611a5a565b9150601454821115611a4a5760145491505b5090565b60155481565b60145481565b600082611a6957506000610b64565b82820282848281611a7657fe5b0414611ab35760405162461bcd60e51b815260040180806020018281038252602181526020018061272d6021913960400191505060405180910390fd5b9392505050565b6000611ab383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612210565b600082611bac577f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d6001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b7a57600080fd5b505af1158015611b8e573d6000803e3d6000fd5b505050506040513d6020811015611ba457600080fd5b50611df99050565b600654600160a01b900460ff1615611cd3576006546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d9092169163095ea7b3916044808201926020929091908290030181600087803b158015611c3557600080fd5b505af1158015611c49573d6000803e3d6000fd5b505050506040513d6020811015611c5f57600080fd5b505060065460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611cb657600080fd5b505af1158015611cca573d6000803e3d6000fd5b50505050611df9565b6005546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d9092169163095ea7b3916044808201926020929091908290030181600087803b158015611d4a57600080fd5b505af1158015611d5e573d6000803e3d6000fd5b505050506040513d6020811015611d7457600080fd5b505060055460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d6020811015611df657600080fd5b50505b5092915050565b6000611ab383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506122b2565b611e4a6126ac565b60008211611e895760405162461bcd60e51b81526004018080602001828103825260268152602001806127076026913960400191505060405180910390fd5b82611ea35750604080516020810190915260008152610b64565b71ffffffffffffffffffffffffffffffffffff8311611f4a57600082607085901b81611ecb57fe5b0490506001600160e01b03811115611f2a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b64565b6000611f5b84600160701b8561230c565b90506001600160e01b03811115611f2a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b611fdc610ead611a09565b60145543601555565b6000611ff9620186a061064b61194f61172f565b60095490915081101561200f5750600954610668565b6009541561066857600060095590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526120799085906123ac565b50505050565b600082820183811015611ab3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261212b9084906123ac565b505050565b601154601254600091612143919061207f565b600f54909150158015906121575750804310155b1561220d57600754600e5460ff161561219157600f546007546121799161207f565b60078190556010541161218c576000600f555b6121b3565b600f546007546121a091611e00565b6007819055601054106121b3576000600f555b43601255600754600f54600e546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b6000818361229c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612261578181015183820152602001612249565b50505050905090810190601f16801561228e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816122a857fe5b0495945050505050565b600081848411156123045760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612261578181015183820152602001612249565b505050900390565b600080600061231b868661245d565b915091506000848061232957fe5b86880990508281111561233d576001820391505b8083039250848210612396576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6123a183838761248a565b979650505050505050565b6060612401826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124fa9092919063ffffffff16565b80519091501561212b5780806020019051602081101561242057600080fd5b505161212b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806127b5602a913960400191505060405180910390fd5b6000808060001984860990508385029250828103915082811015612482576001820391505b509250929050565b6000818103821680838161249a57fe5b0492508085816124a657fe5b0494508081600003816124b557fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606125098484600085612511565b949350505050565b606061251c8561267e565b61256d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106125ac5780518252601f19909201916020918201910161258d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461260e576040519150601f19603f3d011682016040523d82523d6000602084013e612613565b606091505b509150915081156126275791506125099050565b8051156126375780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612261578181015183820152602001612249565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122038e726c31dc175b4d4f584e4f8bc93ab04b309316c36ef7091282a0a503947d664736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd05000000000000000000000000de50fb295549eda934d222e7a24d5a8dd132444f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000cd627aa160a6fa45eb793d19ef54f5062f20f33f
-----Decoded View---------------
Arg [0] : _LOBI (address): 0xDEc41Db0c33F3F6f3cb615449C311ba22D418A8d
Arg [1] : _principle (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [2] : _treasury (address): 0x873ad91fA4F2aA0d557C0919eC3F6c9D240cDd05
Arg [3] : _DAO (address): 0xDe50fb295549EdA934D222e7a24d5A8dd132444F
Arg [4] : _partnerDAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [5] : _feed (address): 0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33f
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000dec41db0c33f3f6f3cb615449c311ba22d418a8d
Arg [1] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [2] : 000000000000000000000000873ad91fa4f2aa0d557c0919ec3f6c9d240cdd05
Arg [3] : 000000000000000000000000de50fb295549eda934d222e7a24d5a8dd132444f
Arg [4] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [5] : 000000000000000000000000cd627aa160a6fa45eb793d19ef54f5062f20f33f
Deployed Bytecode Sourcemap
22034:16136:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22833:34;;;:::i;:::-;;;;-1:-1:-1;;;;;22833:34:0;;;;;;;;;;;;;;37254:379;;;;;;;;;;;;;;;;-1:-1:-1;37254:379:0;-1:-1:-1;;;;;37254:379:0;;:::i;:::-;;;;;;;;;;;;;;;;690:83;;;:::i;893:144::-;;;:::i;:::-;;27432:422;;;;;;;;;;;;;;;;-1:-1:-1;27432:422:0;;;;;;;;;;;;;;;;;;;:::i;26542:710::-;;;;;;;;;;;;;;;;-1:-1:-1;26542:710:0;;;;;;;;;:::i;30739:1071::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30739:1071:0;;;;;;;;;;:::i;23276:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;25705:575;;;;;;;;;;;;;;;;-1:-1:-1;25705:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23357:24::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1043:262;;;;;;;;;;;;;;;;-1:-1:-1;1043:262:0;-1:-1:-1;;;;;1043:262:0;;:::i;23149:22::-;;;:::i;36691:402::-;;;;;;;;;;;;;;;;-1:-1:-1;36691:402:0;-1:-1:-1;;;;;36691:402:0;;:::i;1311:204::-;;;:::i;22901:33::-;;;:::i;36093:99::-;;;:::i;23200:28::-;;;:::i;34112:153::-;;;;;;;;;;;;;;;;-1:-1:-1;34112:153:0;;:::i;35263:132::-;;;:::i;28444:2160::-;;;;;;;;;;;;;;;;-1:-1:-1;28444:2160:0;;;;;;;;;;;-1:-1:-1;;;;;28444:2160:0;;:::i;35846:158::-;;;:::i;22977:18::-;;;:::i;23035:25::-;;;:::i;22764:29::-;;;:::i;37932:235::-;;;;;;;;;;;;;;;;-1:-1:-1;37932:235:0;-1:-1:-1;;;;;37932:235:0;;:::i;37639:126::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37639:126:0;;;;;;;;;;:::i;23421:40::-;;;;;;;;;;;;;;;;-1:-1:-1;23421:40:0;-1:-1:-1;;;;;23421:40:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35508:241;;;:::i;35033:135::-;;;:::i;27975:268::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27975:268:0;;;;;;;;;;:::i;23304:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34358:210;;;:::i;33865:130::-;;;:::i;36284:258::-;;;:::i;23593:24::-;;;:::i;23510:::-;;;:::i;22833:34::-;;;:::o;37254:379::-;37338:22;37372:21;37396:28;37413:10;37396:16;:28::i;:::-;-1:-1:-1;;;;;37448:20:0;;37431:14;37448:20;;;:8;:20;;;;;:27;37372:52;;-1:-1:-1;37505:5:0;37488:22;;37484:144;;37538:6;37521:23;;37484:144;;;37584:36;37614:5;37584:25;:6;37595:13;37584:10;:25::i;:::-;:29;;:36::i;:::-;37567:53;;37484:144;37254:379;;;;;:::o;690:83::-;738:7;761:6;-1:-1:-1;;;;;761:6:0;690:83;;:::o;893:144::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;1002:1:::1;986:6:::0;;970:35:::1;::::0;-1:-1:-1;;;;;986:6:0;;::::1;::::0;970:35:::1;::::0;1002:1;;970:35:::1;1029:1;1012:19:::0;;-1:-1:-1;;;;;;1012:19:0::1;::::0;;893:144::o;27432:422::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;27607:5:::1;:21:::0;:39:::1;::::0;27641:4:::1;::::0;27607:29:::1;::::0;27633:2:::1;27607:25;:29::i;:39::-;27593:10;:53;;27577:106;;;::::0;;-1:-1:-1;;;27577:106:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27577:106:0;;;;;;;;;;;;;::::1;;27705:143;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;27828:12:::1;27705:143:::0;;;;;;;27692:10:::1;:156:::0;;-1:-1:-1;;27692:156:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;27432:422::o;26542:710::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;26660:17:::1;26646:10;:31;;;;;;;;;26642:605;;;26718:5;26708:6;:15;;26700:64;;;;-1:-1:-1::0;;;26700:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26773:17:::0;:26;;;26642:605:::1;;;26831:16;26817:10;:30;;;;;;;;;26813:434;;;26888:4;26878:6;:14;;26870:59;;;::::0;;-1:-1:-1;;;26870:59:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26938:15:::0;:24;;;26813:434:::1;;;26994:14;26980:10;:28;;;;;;;;;26976:271;;;27031:13:::0;:22;;;26976:271:::1;;;27085:13;27071:10;:27;;;;;;;;;27067:180;;;27121:9:::0;:18;;;27067:180:::1;;;27171:20;27157:10;:34;;;;;;;;;27153:94;;;27214:16:::0;:25;;;27153:94:::1;26542:710:::0;;:::o;30739:1071::-;30806:7;30822:16;;:::i;:::-;-1:-1:-1;;;;;;30841:20:0;;;;;;:8;:20;;;;;;;;30822:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30892:28;30850:10;30892:16;:28::i;:::-;30868:52;;31010:5;30993:13;:22;30989:816;;-1:-1:-1;;;;;31059:20:0;;;;;;:8;:20;;;;;;;;31052:27;;;;;;;;;;;;;;;;;;;;31138:11;;31113:40;;;;;;;;;;;;;;;;;;;;;;;;;31187:44;31199:10;31211:6;31219:4;:11;;;31187;:44::i;:::-;31180:51;;;;;;30989:816;31356:11;;31339:14;;31356:41;;31391:5;;31356:30;;31372:13;31356:15;:30::i;:41::-;31339:58;;31468:197;;;;;;;;31492:23;31508:6;31492:4;:11;;;:15;;:23;;;;:::i;:::-;31468:197;;;;31535:50;31552:32;31569:4;:14;;;31552:12;:16;;:32;;;;:::i;:::-;31535:12;;;;;:16;:50::i;:::-;31468:197;;31607:12;31468:197;;;;;;;;31641:14;;;;;31468:197;;;;;-1:-1:-1;;;;;31445:20:0;;-1:-1:-1;31445:20:0;;;:8;:20;;;;;:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31681:61;;;;;;;;;;;;;;;;;;;;;;;;;31758:39;31770:10;31782:6;31790;31758:11;:39::i;:::-;31751:46;;;;;30739:1071;;;;;:::o;23276:21::-;;;-1:-1:-1;;;23276:21:0;;;;;:::o;25705:575::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;25980:232:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25972:5:::1;:240:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26219:9:::1;:24:::0;26262:12:::1;26250:9;:24:::0;25705:575::o;23357:24::-;;;;;;;;;;;;;;;;;:::o;1043:262::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1159:23:0;::::1;1151:74;;;;-1:-1:-1::0;;;1151:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1253:6;::::0;;1237:34:::1;::::0;-1:-1:-1;;;;;1237:34:0;;::::1;::::0;1253:6;::::1;::::0;1237:34:::1;::::0;::::1;1278:9;:21:::0;;-1:-1:-1;;;;;;1278:21:0::1;-1:-1:-1::0;;;;;1278:21:0;;;::::1;::::0;;;::::1;::::0;;1043:262::o;23149:22::-;;;-1:-1:-1;;;;;23149:22:0;;:::o;36691:402::-;36773:22;36807:16;;:::i;:::-;-1:-1:-1;;;;;;36826:20:0;;;;;;:8;:20;;;;;;;;36807:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36826:20;36879:32;;:12;;:16;:32::i;:::-;36936:12;;;;36853:58;;-1:-1:-1;36961:11:0;;36957:131;;37000:39;37031:7;37000:26;:15;37020:5;37000:19;:26::i;:39::-;36983:56;;36957:131;;;37079:1;37062:18;;36957:131;36691:402;;;;;;:::o;1311:204::-;1390:9;;-1:-1:-1;;;;;1390:9:0;1376:10;:23;1368:70;;;;-1:-1:-1;;;1368:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1474:9;;;1466:6;;1450:34;;-1:-1:-1;;;;;1474:9:0;;;;1466:6;;;;1450:34;;;1500:9;;;1491:18;;-1:-1:-1;;;;;;1491:18:0;-1:-1:-1;;;;;1500:9:0;;;1491:18;;;;;;1311:204::o;22901:33::-;;;:::o;36093:99::-;36137:7;36160:26;36174:11;:9;:11::i;:::-;36160:9;;;:13;:26::i;:::-;36153:33;;36093:99;:::o;23200:28::-;;;-1:-1:-1;;;;;23200:28:0;;:::o;34112:153::-;34168:7;34191:68;34254:4;34191:58;:40;34211:6;34219:11;:9;:11::i;:::-;34191:19;:40::i;:::-;:56;:58::i;35263:132::-;35310:14;35342:47;35385:3;35342:38;35366:12;:10;:12::i;:::-;35342:11;:9;:11::i;:::-;:15;;:38::i;28444:2160::-;28555:7;-1:-1:-1;;;;;28579:24:0;;28571:52;;;;;-1:-1:-1;;;28571:52:0;;;;;;;;;;;;-1:-1:-1;;;28571:52:0;;;;;;;;;;;;;;;28632:11;:9;:11::i;:::-;28671:13;;28658:9;;:26;;28650:59;;;;;-1:-1:-1;;;28650:59:0;;;;;;;;;;;;-1:-1:-1;;;28650:59:0;;;;;;;;;;;;;;;28718:18;28739:16;:14;:16::i;:::-;28718:37;;28785:19;28807:12;:10;:12::i;:::-;28785:34;;28849:11;28836:9;:24;;28828:72;;;;-1:-1:-1;;;28828:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28932:13;28958:8;-1:-1:-1;;;;;28948:32:0;;28981:9;28992:7;28948:52;;;;;;;;;;;;;-1:-1:-1;;;;;28948:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28948:52:0;;-1:-1:-1;29007:14:0;29024:16;28948:52;29024:9;:16::i;:::-;29007:33;;29099:8;29089:6;:18;;29081:45;;;;;-1:-1:-1;;;29081:45:0;;;;;;;;;;;;-1:-1:-1;;;29081:45:0;;;;;;;;;;;;;;;29199:11;:9;:11::i;:::-;29189:6;:21;;29181:48;;;;;-1:-1:-1;;;29181:48:0;;;;;;;;;;;;-1:-1:-1;;;29181:48:0;;;;;;;;;;;;;;;29317:11;29331:32;29357:5;29331:21;29342:5;:9;;;29331:6;:10;;:21;;;;:::i;:32::-;29317:46;;29370:18;29391:39;29424:5;29391:28;29402:5;:16;;;29391:6;:10;;:28;;;;:::i;:39::-;29370:60;-1:-1:-1;29590:65:0;-1:-1:-1;;;;;29597:9:0;29590:34;29625:10;29637:8;29647:7;29590:34;:65::i;:::-;29674:8;-1:-1:-1;;;;;29664:33:0;;29698:9;29709:5;29664:51;;;;;;;;;;;;;-1:-1:-1;;;;;29664:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;29732:8:0;29722:31;;-1:-1:-1;29722:31:0;;-1:-1:-1;29770:4:0;29784:31;29804:10;29784:15;:6;29795:3;29784:10;:15::i;:::-;:19;;:31::i;:::-;29722:100;;;;;;;;;;;;;-1:-1:-1;;;;;29722:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29835:3;29842:1;29835:8;29831:66;;29880:3;;29854:35;;-1:-1:-1;;;;;29861:4:0;29854:25;;;29880:3;29885;29854:25;:35::i;:::-;29909:15;;29905:87;;29961:10;;29935:49;;-1:-1:-1;;;;;29942:4:0;29935:25;;;29961:10;29973;29935:25;:49::i;:::-;30044:9;;:20;;30058:5;30044:13;:20::i;:::-;30032:9;:32;30129:166;;;;;;;;-1:-1:-1;;;;;30151:20:0;;-1:-1:-1;30151:20:0;;;:8;:20;;;;;;:27;30129:166;;30151:39;;30183:6;30151:31;:39::i;:::-;30129:166;;30208:17;;;30129:166;;;;;;;;30245:12;30129:166;;;;;;;;;;;;;;-1:-1:-1;;;;;30106:20:0;;-1:-1:-1;30106:20:0;;;:8;:20;;;;;:189;;;;;;;;30208:17;30106:189;;;;;;;;;;;;;;;;;;;;;;;30412:17;30277:10;;30395:35;;:16;:35::i;:::-;30344:112;;;;;;;;30380:6;;30344:112;;;;;;;;;;30517:11;:9;:11::i;:::-;30503:12;:10;:12::i;:::-;30485:16;:14;:16::i;:::-;30468:61;;;;;;;30538:8;:6;:8::i;:::-;-1:-1:-1;30592:6:0;;28444:2160;-1:-1:-1;;;;;;;;28444:2160:0:o;35846:158::-;35902:7;35925:47;35968:3;35925:38;35949:12;:10;:12::i;:::-;35925:11;:9;:11::i;22977:18::-;;;-1:-1:-1;;;;;22977:18:0;;:::o;23035:25::-;;;-1:-1:-1;;;;;23035:25:0;;:::o;22764:29::-;;;:::o;37932:235::-;37992:4;38023;-1:-1:-1;;;;;38013:14:0;:6;-1:-1:-1;;;;;38013:14:0;;;38005:23;;;;;;38053:9;-1:-1:-1;;;;;38043:19:0;:6;-1:-1:-1;;;;;38043:19:0;;;38035:28;;;;;;38098:3;;38103:39;;;-1:-1:-1;;;38103:39:0;;38136:4;38103:39;;;;;;38070:73;;-1:-1:-1;;;;;38098:3:0;;;;38103:24;;;;;;:39;;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38103:39:0;-1:-1:-1;;;;;38070:27:0;;;:73;:27;:73::i;:::-;-1:-1:-1;38157:4:0;37932:235;;;:::o;37639:126::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;37718:3:::1;:10:::0;;-1:-1:-1;;;;;37718:10:0;;::::1;-1:-1:-1::0;;;;;;37718:10:0;;::::1;;::::0;;;37735::::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;37639:126::o;23421:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35508:241::-;35550:18;35577:14;35601:4;-1:-1:-1;;;;;35594:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35594:26:0;;-1:-1:-1;35640:103:0;35738:4;35640:85;:59;35668:22;35686:3;35668:13;:11;:13::i;:22::-;35692:6;35640:27;:59::i;:103::-;35627:116;;35508:241;;:::o;35033:135::-;35116:9;;;:27;;;-1:-1:-1;;;35116:27:0;;;;35076:6;;;;-1:-1:-1;;;;;35116:9:0;;:25;;:27;;;;;;;;;;;:9;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35116:27:0;;;;-1:-1:-1;;35033:135:0;:::o;27975:268::-;816:6;;-1:-1:-1;;;;;816:6:0;826:10;816:20;808:65;;;;;-1:-1:-1;;;808:65:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;808:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28062:22:0;::::1;28054:31;;;::::0;::::1;;28096:7;28092:146;;;28114:9;:16:::0;;-1:-1:-1;;;;;;;28114:16:0;;::::1;;-1:-1:-1::0;;;;;;28139:24:0::1;-1:-1:-1::0;;;;;28139:24:0;::::1;;::::0;;28092:146:::1;;;28186:9;:17:::0;;-1:-1:-1;;;;28186:17:0::1;::::0;;28212:7:::1;:18:::0;;-1:-1:-1;;;;;28212:18:0;::::1;-1:-1:-1::0;;;;;;28212:18:0;;::::1;;::::0;;27975:268;;:::o;23304:18::-;;;;;;;;;;;;;;;;:::o;34358:210::-;34400:14;34432:47;34475:3;34432:38;34458:11;:9;:11::i;:::-;34432:5;:21;;:25;:38::i;:47::-;34499:18;;34423:56;;-1:-1:-1;34490:27:0;;34486:77;;;-1:-1:-1;34537:18:0;;34358:210;:::o;33865:130::-;33907:7;33930:59;33982:6;33930:47;33961:5;:15;;;33937:4;-1:-1:-1;;;;;33930:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33930:26:0;;:30;:47::i;36284:258::-;36326:14;36349:23;36375:27;36392:9;;36375:12;:16;;:27;;;;:::i;:::-;36453:17;;36418:9;;36349:53;;-1:-1:-1;36418:53:0;;:30;;36349:53;36418:13;:30::i;:53::-;36409:62;;36491:9;;36482:6;:18;36478:59;;;36520:9;;36511:18;;36478:59;36284:258;;:::o;23593:24::-;;;;:::o;23510:::-;;;;:::o;2057:222::-;2115:7;2135:6;2131:37;;-1:-1:-1;2159:1:0;2152:8;;2131:37;2188:5;;;2192:1;2188;:5;:1;2208:5;;;;;:10;2200:56;;;;-1:-1:-1;;;2200:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2272:1;2057:222;-1:-1:-1;;;2057:222:0:o;2285:126::-;2343:7;2366:39;2370:1;2373;2366:39;;;;;;;;;;;;;;;;;:3;:39::i;32014:640::-;32123:7;32144:6;32139:489;;32209:4;-1:-1:-1;;;;;32202:21:0;;32224:10;32236:7;32202:42;;;;;;;;;;;;;-1:-1:-1;;;;;32202:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32139:489:0;;-1:-1:-1;32139:489:0;;32319:9;;-1:-1:-1;;;32319:9:0;;;;32315:306;;;32401:13;;32380:44;;;-1:-1:-1;;;32380:44:0;;-1:-1:-1;;;;;32401:13:0;;;32380:44;;;;;;;;;;;;32387:4;32380:20;;;;;;:44;;;;;;;;;;;;;;;-1:-1:-1;32380:20:0;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32450:13:0;;32435:56;;;-1:-1:-1;;;32435:56:0;;;;;;;;-1:-1:-1;;;;;32435:56:0;;;;;;;;;32450:13;;;;;32435:35;;:56;;;;;32450:13;;32435:56;;;;;;;32450:13;;32435:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32315:306;;;32539:7;;32518:38;;;-1:-1:-1;;;32518:38:0;;-1:-1:-1;;;;;32539:7:0;;;32518:38;;;;;;;;;;;;32525:4;32518:20;;;;;;:38;;;;;;;;;;;;;;;-1:-1:-1;32518:20:0;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32576:7:0;;32567:44;;;-1:-1:-1;;;32567:44:0;;;;;;;;-1:-1:-1;;;;;32567:44:0;;;;;;;;;32576:7;;;;;32567:23;;:44;;;;;32518:38;;32567:44;;;;;;;32576:7;;32567:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32315:306:0;-1:-1:-1;32641:7:0;32014:640;-1:-1:-1;;32014:640:0:o;1717:130::-;1775:7;1798:43;1802:1;1805;1798:43;;;;;;;;;;;;;;;;;:3;:43::i;19885:679::-;19981:16;;:::i;:::-;20031:1;20017:11;:15;20009:66;;;;-1:-1:-1;;;20009:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20086:14;20082:50;;-1:-1:-1;20109:23:0;;;;;;;;;-1:-1:-1;20109:23:0;;20102:30;;20082:50;20145:24;;;20141:418;;20180:14;20225:11;19308:3;20198:23;;;20225:11;20197:39;;;;;;-1:-1:-1;;;;;;20253:21:0;;;20245:64;;;;;-1:-1:-1;;;20245:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20325:26;;;;;;;;20343:6;-1:-1:-1;;;;;20325:26:0;;;;20318:33;;;;;20141:418;20374:14;20391:45;20407:9;-1:-1:-1;;;20424:11:0;20391:15;:45::i;:::-;20374:62;-1:-1:-1;;;;;;20453:21:0;;;20445:64;;;;;-1:-1:-1;;;20445:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19726:153;19846:7;19857:16;-1:-1:-1;;;;;19838:16:0;;;:35;;19726:153::o;33626:112::-;33675:26;33689:11;:9;:11::i;33675:26::-;33663:9;:38;33720:12;33708:9;:24;33626:112::o;34685:282::-;34725:14;34757:47;34800:3;34757:38;34783:11;:9;:11::i;34757:47::-;34824:18;;34748:56;;-1:-1:-1;34815:27:0;;34811:151;;;-1:-1:-1;34862:18:0;;34811:151;;;34898:18;;:23;34894:68;;34953:1;34932:18;:22;34685:282;:::o;16388:245::-;16552:68;;;-1:-1:-1;;;;;16552:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16552:68:0;-1:-1:-1;;;16552:68:0;;;16510:117;;16538:5;;16510:19;:117::i;:::-;16388:245;;;;:::o;1544:167::-;1602:7;1630:5;;;1650:6;;;;1642:46;;;;;-1:-1:-1;;;1642:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16170:212;16311:58;;;-1:-1:-1;;;;;16311:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16311:58:0;-1:-1:-1;;;16311:58:0;;;16269:107;;16297:5;;16269:19;:107::i;:::-;16170:212;;;:::o;32738:835::-;32822:17;;32797:20;;32772:22;;32797:43;;:20;:24;:43::i;:::-;32851:15;;32772:68;;-1:-1:-1;32851:20:0;;;;:54;;;32891:14;32875:12;:30;;32851:54;32847:721;;;32934:5;:21;32968:10;:14;;;32964:404;;;33045:15;;33019:5;:21;:42;;:25;:42::i;:::-;32995:5;:66;;;33101:17;;-1:-1:-1;33072:92:0;;33151:1;33133:15;:19;33072:92;32964:404;;;33240:15;;33214:5;:21;:42;;:25;:42::i;:::-;33190:5;:66;;;33296:17;;-1:-1:-1;33267:92:0;;33346:1;33328:15;:19;33267:92;33399:12;33376:20;:35;33479:5;:21;33511:15;;33376:10;33537:14;33425:135;;;;;;;;;;;;;;;;;;;;33537:14;;33425:135;;;;;;;;;;;;;;;;32847:721;;32738:835;:::o;2417:195::-;2523:7;2554:12;2547:5;2539:28;;;;-1:-1:-1;;;2539:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2574:9;2590:1;2586;:5;;;;;;;2417:195;-1:-1:-1;;;;;2417:195:0:o;1853:198::-;1959:7;1991:12;1983:6;;;;1975:29;;;;-1:-1:-1;;;1975:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2023:5:0;;;1853:198::o;18842:307::-;18934:7;18951:9;18962;18975:13;18983:1;18986;18975:7;:13::i;:::-;18950:38;;;;18995:10;19021:1;19008:15;;;;;19018:1;19015;19008:15;18995:28;;19039:1;19034:2;:6;19030:18;;;19047:1;19042:6;;;;19030:18;19060:2;19055:7;;;;19081:1;19077;:5;19069:44;;;;;-1:-1:-1;;;19069:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19127:16;19135:1;19138;19141;19127:7;:16::i;:::-;19120:23;18842:307;-1:-1:-1;;;;;;;18842:307:0:o;17734:447::-;17811:23;17837:90;17873:4;17837:90;;;;;;;;;;;;;;;;;17845:5;-1:-1:-1;;;;;17837:27:0;;;:90;;;;;:::i;:::-;17938:17;;17811:116;;-1:-1:-1;17938:21:0;17934:242;;18085:10;18074:30;;;;;;;;;;;;;;;-1:-1:-1;18074:30:0;18056:112;;;;-1:-1:-1;;;18056:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18210:210;18286:9;;;-1:-1:-1;;18341:1:0;18338;18331:25;18318:38;;18371:1;18367;:5;18363:9;;18388:1;18383:2;:6;18379:10;;18405:1;18400:2;:6;18396:18;;;18413:1;18408:6;;;;18396:18;18210:210;;;;;;:::o;18426:410::-;18518:7;18553:2;;;18549:6;;;18554:1;18549:6;18562:9;;;;;;;18583:4;18578:9;;;;;;;;;18614:4;18606;18605:5;;18604:14;;;;;18655:1;:9;;;18680:5;;;18676:9;;18671:14;18701:5;;;18697:9;;18692:14;18722:5;;;18718:9;;18713:14;18743:5;;;18739:9;;18734:14;18764:5;;;18760:9;;18755:14;18785:5;;;18781:9;;18776:14;18806:5;;;18802:9;;18797:14;;;18604;;18621:1;18604:18;18599:24;;;;18594:29;;;;18825:5;;18426:410;-1:-1:-1;;18426:410:0:o;4052:210::-;4175:12;4203:53;4226:6;4234:4;4240:1;4243:12;4203:22;:53::i;:::-;4196:60;4052:210;-1:-1:-1;;;;4052:210:0:o;5124:900::-;5279:12;5308:18;5319:6;5308:10;:18::i;:::-;5300:60;;;;;-1:-1:-1;;;5300:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5426:12;5440:23;5467:6;-1:-1:-1;;;;;5467:11:0;5486:8;5504:4;5467:48;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5467:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5425:90;;;;5526:7;5522:497;;;5551:10;-1:-1:-1;5544:17:0;;-1:-1:-1;5544:17:0;5522:497;5649:17;;:21;5645:367;;5878:10;5872:17;5929:15;5916:10;5912:2;5908:19;5901:44;5836:120;5982:20;;-1:-1:-1;;;5982:20:0;;;;;;;;;;;;;;;;;5989:12;;5982:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3229:225;3400:20;3440:8;;;3229:225::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://38e726c31dc175b4d4f584e4f8bc93ab04b309316c36ef7091282a0a503947d6
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.