Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 73 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 14197516 | 1008 days ago | IN | 0 ETH | 0.00235204 | ||||
Redeem | 14179441 | 1011 days ago | IN | 0 ETH | 0.008005 | ||||
Redeem | 14171812 | 1012 days ago | IN | 0 ETH | 0.00281299 | ||||
Deposit | 14163325 | 1014 days ago | IN | 0 ETH | 0.02977542 | ||||
Deposit | 14163297 | 1014 days ago | IN | 0 ETH | 0.01225806 | ||||
Redeem | 14151178 | 1016 days ago | IN | 0 ETH | 0.00385649 | ||||
Redeem | 14138744 | 1017 days ago | IN | 0 ETH | 0.00362841 | ||||
Deposit | 14138027 | 1018 days ago | IN | 0 ETH | 0.02480095 | ||||
Redeem | 14120279 | 1020 days ago | IN | 0 ETH | 0.00405926 | ||||
Redeem | 14111997 | 1022 days ago | IN | 0 ETH | 0.00397239 | ||||
Deposit | 14105416 | 1023 days ago | IN | 0 ETH | 0.03084757 | ||||
Deposit | 14077733 | 1027 days ago | IN | 0 ETH | 0.04696432 | ||||
Redeem | 14077730 | 1027 days ago | IN | 0 ETH | 0.00922744 | ||||
Redeem | 14070054 | 1028 days ago | IN | 0 ETH | 0.01255869 | ||||
Redeem | 14058634 | 1030 days ago | IN | 0 ETH | 0.00813705 | ||||
Redeem | 14051524 | 1031 days ago | IN | 0 ETH | 0.01984077 | ||||
Deposit | 14045834 | 1032 days ago | IN | 0 ETH | 0.0498735 | ||||
Deposit | 14045410 | 1032 days ago | IN | 0 ETH | 0.07884089 | ||||
Redeem | 14036183 | 1033 days ago | IN | 0 ETH | 0.00669748 | ||||
Redeem | 14014302 | 1037 days ago | IN | 0 ETH | 0.00631965 | ||||
Deposit | 14010075 | 1037 days ago | IN | 0 ETH | 0.05002548 | ||||
Redeem | 14010043 | 1037 days ago | IN | 0 ETH | 0.00675572 | ||||
Redeem | 13991122 | 1040 days ago | IN | 0 ETH | 0.00620623 | ||||
Deposit | 13979874 | 1042 days ago | IN | 0 ETH | 0.07278563 | ||||
Redeem | 13976403 | 1043 days ago | IN | 0 ETH | 0.00731107 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ManifestBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-24 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipPushed( address(0), _owner ); } function policy() public view override returns (address) { return _owner; } modifier onlyPolicy() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceManagement() public virtual override onlyPolicy() { emit OwnershipPushed( _owner, address(0) ); _owner = address(0); } function pushManagement( address newOwner_ ) public virtual override onlyPolicy() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed( _owner, newOwner_ ); _newOwner = newOwner_; } function pullManagement() public virtual override { require( msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled( _owner, _newOwner ); _owner = _newOwner; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address( this ), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; } contract ManifestBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; /* ======== EVENTS ======== */ event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInOHM ); event BondRedeemed( address indexed recipient, uint payout, uint remaining ); event BondPriceChanged( uint indexed priceInOHM, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable MNFST; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints MNFST when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping( address => Bond ) public bondInfo; // stores bond information for depositors uint public totalDebt; // total value of outstanding bonds; used for pricing uint public lastDecay; // reference block for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint controlVariable; // scaling variable for price uint vestingTerm; // in blocks uint minimumPrice; // vs principle value uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt } // Info for bond holder struct Bond { uint payout; // MNFST remaining to be paid uint vesting; // Blocks left to vest uint lastBlock; // Last interaction uint pricePaid; // In OHM per 1, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _MNFST, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _MNFST != address(0) ); MNFST = _MNFST; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint _controlVariable, uint _vestingTerm, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _initialDebt ) external onlyPolicy() { require( terms.controlVariable == 0, "Bonds must be initialized from 0" ); terms = Terms ({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, DEBT } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() { if ( _parameter == PARAMETER.VESTING ) { // 0 require( _input >= 10000, "Vesting must be longer than 36 hours" ); terms.vestingTerm = _input; } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 1000, "Payout cannot be above 1 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.FEE ) { // 2 require( _input <= 10000, "DAO fee cannot exceed payout" ); terms.fee = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment ( bool _addition, uint _increment, uint _target, uint _buffer ) external onlyPolicy() { require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external returns ( uint ) { require( _depositor != address(0), "Invalid address" ); decayDebt(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInOHM = bondPriceInOHM(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 MNFST ( underflow protection ) require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) MNFST */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to dao IERC20( MNFST ).safeTransfer( DAO, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInOHM }); // indexed events are emitted emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInOHM ); emit BondPriceChanged( bondPriceInOHM(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { Bond memory info = bondInfo[ _recipient ]; uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining) if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ), lastBlock: block.number, pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( MNFST ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( MNFST ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( MNFST ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer ); if( adjustment.rate != 0 && block.number >= blockCanAdjust ) { uint initial = terms.controlVariable; if ( adjustment.add ) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if ( terms.controlVariable >= adjustment.target ) { adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable.sub( adjustment.rate ); if ( terms.controlVariable <= adjustment.target ) { adjustment.rate = 0; } } adjustment.lastBlock = block.number; emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = block.number; } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( MNFST ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to OHM for 1000 value * @return price_ uint */ function bondPriceInOHM() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ).div(1000); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ).div( 1000 ); } } /** * @notice calculate current ratio of debt to MNFST supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( MNFST ).totalSupply(); debtRatio_ = FixedPoint.fraction( currentDebt().mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** * @notice debt ratio in same terms for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { if ( isLiquidityBond ) { return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 ); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns ( uint ) { return totalDebt.sub( debtDecay() ); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns ( uint decay_ ) { uint blocksSinceLast = block.number.sub( lastDecay ); decay_ = totalDebt.mul( blocksSinceLast ).div( terms.vestingTerm ); if ( decay_ > totalDebt ) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) { Bond memory bond = bondInfo[ _depositor ]; uint blocksSinceLast = block.number.sub( bond.lastBlock ); uint vesting = bond.vesting; if ( vesting > 0 ) { percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of MNFST available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = bondInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or MNFST) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != MNFST ); 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":"_MNFST","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInOHM","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInOHM","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":"MNFST","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInOHM","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ManifestBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b5060405162002c4a38038062002c4a833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000b557600080fd5b6001600160601b0319606086901b166080526001600160a01b038416620000db57600080fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200010157600080fd5b6001600160601b0319606084901b1660c0526001600160a01b0382166200012757600080fd5b6001600160601b0319606092831b811660e0529181901b909116610120526001600160a01b0316151560f81b6101005250505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c612a1c6200022e60003980610ba652806116e95280611930525080610b7252806116b85280611b0b52508061155e52806117b25280611859525080610f6a52806111cd52806113d052806114b252508061059b5280610bd55280610c8252806111fc528061137752806113a152806114815280611718528061181752508061153c52806117d8528061190c528061197e5280611b805280611d055280611dea5280611eff5250612a1c6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610571578063e0176de814610579578063e392a26214610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063cea55f57146104f8578063d4d863ce14610500578063d50256251461052e578063d79690601461056957610211565b806398fabd3a116100f457806398fabd3a1461046e578063b4abccba14610476578063b5764e471461049c578063c5332b7c146104a4578063cd1234b3146104ac57610211565b806377b818951461040f5780637927ebf8146104175780638dbdbe6d14610434578063904b3ece1461046657610211565b806340e6ff55116101a8578063507930ec11610177578063507930ec146103905780635a96ac0a146103b657806361d027b3146103be57806371535008146103c6578063759076e51461040757610211565b806340e6ff5514610325578063451ee4a11461032d57806346f68ee9146103625780634cf088d91461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b610260610b6e565b610335610d18565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037857600080fd5b50356001600160a01b0316610d30565b61021e610e1d565b610260600480360360208110156103a657600080fd5b50356001600160a01b0316610e2c565b610282610ebe565b61021e610f68565b610282600480360360e08110156103dc57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610f8c565b610260611080565b61021e611096565b6102606004803603602081101561042d57600080fd5b50356110a5565b6102606004803603606081101561044a57600080fd5b50803590602081013590604001356001600160a01b03166110cb565b6102606116b4565b61021e6117b0565b6103116004803603602081101561048c57600080fd5b50356001600160a01b03166117d4565b61021e61190a565b61021e61192e565b6104d2600480360360208110156104c257600080fd5b50356001600160a01b0316611952565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610260611979565b6102826004803603604081101561051657600080fd5b506001600160a01b0381351690602001351515611a31565b610536611af4565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611b09565b610260611b2d565b610260611b6c565b610260611c09565b610260611c4e565b610260611c54565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806105c983610e2c565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c5a565b90611cba565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c5a565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576127108110156108575760405162461bcd60e51b81526004018080602001828103825260248152602001806129996024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b600061097361288c565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610e2c565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611cfc565b92505050610b58565b8151600090610a6d90612710906106069085611c5a565b90506040518060800160405280610a9183866000015161200090919063ffffffff16565b8152602001610abb610ab086604001514361200090919063ffffffff16565b602087015190612000565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611cfc565b93505050505b92915050565b600354600160a01b900460ff1681565b60007f000000000000000000000000000000000000000000000000000000000000000015610c7257610c6b6103e861060660646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610c3157600080fd5b505afa158015610c45573d6000803e3d6000fd5b505050506040513d6020811015610c5b57600080fd5b5051610c65611b2d565b90611c5a565b9050610623565b610d136103e861060660646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd957600080fd5b505afa158015610ced573d6000803e3d6000fd5b505050506040513d6020811015610d0357600080fd5b505160ff16600a0a610c65611b2d565b905090565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610d7d576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b6001600160a01b038116610dc25760405162461bcd60e51b81526004018080602001828103825260268152602001806128c76026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610e3661288c565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610e8c904390612000565b60208301519091508015610eb157610eaa8161060684612710611c5a565b9350610eb6565b600093505b505050919050565b6001546001600160a01b03163314610f075760405162461bcd60e51b81526004018080602001828103825260228152602001806128ed6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610fd9576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b6004541561102e576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610d1361108d611c09565b60105490612000565b6003546001600160a01b031681565b6000610b58662386f26fc100006106066110c6856110c1611b2d565b612042565b6121b9565b60006001600160a01b03821661111a576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6111226121d1565b6009546010541115611172576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b600061117c610b6e565b905060006111886121e5565b9050808510156111c95760405162461bcd60e51b81526004018080602001828103825260238152602001806129766023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561126057600080fd5b505afa158015611274573d6000803e3d6000fd5b505050506040513d602081101561128a57600080fd5b505190506000611299826110a5565b9050629896808110156112e4576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6112ec611b6c565b811115611331576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611350612710610606600480015485611c5a90919063ffffffff16565b90506000611368826113628686612000565b90612000565b905061139f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308d612227565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561143657600080fd5b505af115801561144a573d6000803e3d6000fd5b505050506040513d602081101561146057600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b1580156114fd57600080fd5b505af1158015611511573d6000803e3d6000fd5b505050506040513d602081101561152757600080fd5b50508115611583576115836001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000084612287565b60105461159090856122de565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906115c290866122de565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f84528190208651815592860151600184015585015160028301559390920151600390920191909155548791611627916122de565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611665611979565b61166d6121e5565b611675610b6e565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a46116a6612338565b509098975050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156117a857610c6b633b9aca006106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561177457600080fd5b505afa158015611788573d6000803e3d6000fd5b505050506040513d602081101561179e57600080fd5b5051610c65611979565b610c6b611979565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561181557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561185457600080fd5b6119027f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118c557600080fd5b505afa1580156118d9573d6000803e3d6000fd5b505050506040513d60208110156118ef57600080fd5b50516001600160a01b0385169190612287565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d557600080fd5b505afa1580156119e9573d6000803e3d6000fd5b505050506040513d60208110156119ff57600080fd5b50519050611a2b670de0b6b3a76400006106066110c6611a25633b9aca00610c65611080565b85612042565b91505090565b6000546001600160a01b03163314611a7e576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b6001600160a01b038216611a9157600080fd5b8015611ac65760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b5862989680610606633b9aca00611b52611b49611979565b60045490611c5a565b906122de565b600654909150811015610623575060065490565b6000610d13620186a06106066004600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bd757600080fd5b505afa158015611beb573d6000803e3d6000fd5b505050506040513d6020811015611c0157600080fd5b505190611c5a565b600080611c216011544361200090919063ffffffff16565b600554601054919250611c38916106069084611c5a565b9150601054821115611c4a5760105491505b5090565b60115481565b60105481565b600082611c6957506000610b58565b82820282848281611c7657fe5b0414611cb35760405162461bcd60e51b81526004018080602001828103825260218152602001806129356021913960400191505060405180910390fd5b9392505050565b6000611cb383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612418565b600082611dac577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b50611ff99050565b600354600160a01b900460ff1615611ed3576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611e3557600080fd5b505af1158015611e49573d6000803e3d6000fd5b505050506040513d6020811015611e5f57600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50505050611ff9565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611f4a57600080fd5b505af1158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611fcc57600080fd5b505af1158015611fe0573d6000803e3d6000fd5b505050506040513d6020811015611ff657600080fd5b50505b5092915050565b6000611cb383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ba565b61204a6128b4565b600082116120895760405162461bcd60e51b815260040180806020018281038252602681526020018061290f6026913960400191505060405180910390fd5b826120a35750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161214a57600082607085901b816120cb57fe5b0490506001600160e01b0381111561212a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061215b84600160701b85612514565b90506001600160e01b0381111561212a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b6121dc61108d611c09565b60105543601155565b600061220162989680610606633b9aca00611b52611b49611979565b6006549091508110156122175750600654610623565b6006541561062357600060065590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122819085906125b4565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526122d99084906125b4565b505050565b600082820183811015611cb3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e5460009161234b91906122de565b600b549091501580159061235f5750804310155b1561241557600454600a5460ff161561239957600b54600454612381916122de565b6004819055600c5411612394576000600b555b6123bb565b600b546004546123a891612000565b6004819055600c54106123bb576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081836124a45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612469578181015183820152602001612451565b50505050905090810190601f1680156124965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124b057fe5b0495945050505050565b6000818484111561250c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612469578181015183820152602001612451565b505050900390565b60008060006125238686612665565b915091506000848061253157fe5b868809905082811115612545576001820391505b808303925084821061259e576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6125a9838387612692565b979650505050505050565b6060612609826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127029092919063ffffffff16565b8051909150156122d95780806020019051602081101561262857600080fd5b50516122d95760405162461bcd60e51b815260040180806020018281038252602a8152602001806129bd602a913960400191505060405180910390fd5b600080806000198486099050838502925082810391508281101561268a576001820391505b509250929050565b600081810382168083816126a257fe5b0492508085816126ae57fe5b0494508081600003816126bd57fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606127118484600085612719565b949350505050565b606061272485612886565b612775576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127b45780518252601f199092019160209182019101612795565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612816576040519150601f19603f3d011682016040523d82523d6000602084013e61281b565b606091505b5091509150811561282f5791506127119050565b80511561283f5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612469578181015183820152602001612451565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d24faec265827203facd4143a69cb71d0b69d17e75bc0db6f11c5cbac8ebfef764736f6c6343000705003300000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c6000000000000000000000000a963a46ef8d90cba23347def96632417beaf72a200000000000000000000000034f6128924d3a8d364a5cee667b423334a1a2114
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610571578063e0176de814610579578063e392a26214610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063cea55f57146104f8578063d4d863ce14610500578063d50256251461052e578063d79690601461056957610211565b806398fabd3a116100f457806398fabd3a1461046e578063b4abccba14610476578063b5764e471461049c578063c5332b7c146104a4578063cd1234b3146104ac57610211565b806377b818951461040f5780637927ebf8146104175780638dbdbe6d14610434578063904b3ece1461046657610211565b806340e6ff55116101a8578063507930ec11610177578063507930ec146103905780635a96ac0a146103b657806361d027b3146103be57806371535008146103c6578063759076e51461040757610211565b806340e6ff5514610325578063451ee4a11461032d57806346f68ee9146103625780634cf088d91461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b610260610b6e565b610335610d18565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037857600080fd5b50356001600160a01b0316610d30565b61021e610e1d565b610260600480360360208110156103a657600080fd5b50356001600160a01b0316610e2c565b610282610ebe565b61021e610f68565b610282600480360360e08110156103dc57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610f8c565b610260611080565b61021e611096565b6102606004803603602081101561042d57600080fd5b50356110a5565b6102606004803603606081101561044a57600080fd5b50803590602081013590604001356001600160a01b03166110cb565b6102606116b4565b61021e6117b0565b6103116004803603602081101561048c57600080fd5b50356001600160a01b03166117d4565b61021e61190a565b61021e61192e565b6104d2600480360360208110156104c257600080fd5b50356001600160a01b0316611952565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610260611979565b6102826004803603604081101561051657600080fd5b506001600160a01b0381351690602001351515611a31565b610536611af4565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611b09565b610260611b2d565b610260611b6c565b610260611c09565b610260611c4e565b610260611c54565b7f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef81565b6000806105c983610e2c565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c5a565b90611cba565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c5a565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576127108110156108575760405162461bcd60e51b81526004018080602001828103825260248152602001806129996024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b600061097361288c565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610e2c565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611cfc565b92505050610b58565b8151600090610a6d90612710906106069085611c5a565b90506040518060800160405280610a9183866000015161200090919063ffffffff16565b8152602001610abb610ab086604001514361200090919063ffffffff16565b602087015190612000565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611cfc565b93505050505b92915050565b600354600160a01b900460ff1681565b60007f000000000000000000000000000000000000000000000000000000000000000115610c7257610c6b6103e861060660646106067f00000000000000000000000034f6128924d3a8d364a5cee667b423334a1a21146001600160a01b03166332da80a37f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610c3157600080fd5b505afa158015610c45573d6000803e3d6000fd5b505050506040513d6020811015610c5b57600080fd5b5051610c65611b2d565b90611c5a565b9050610623565b610d136103e861060660646106067f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd957600080fd5b505afa158015610ced573d6000803e3d6000fd5b505050506040513d6020811015610d0357600080fd5b505160ff16600a0a610c65611b2d565b905090565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610d7d576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b6001600160a01b038116610dc25760405162461bcd60e51b81526004018080602001828103825260268152602001806128c76026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610e3661288c565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610e8c904390612000565b60208301519091508015610eb157610eaa8161060684612710611c5a565b9350610eb6565b600093505b505050919050565b6001546001600160a01b03163314610f075760405162461bcd60e51b81526004018080602001828103825260228152602001806128ed6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c681565b6000546001600160a01b03163314610fd9576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b6004541561102e576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610d1361108d611c09565b60105490612000565b6003546001600160a01b031681565b6000610b58662386f26fc100006106066110c6856110c1611b2d565b612042565b6121b9565b60006001600160a01b03821661111a576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6111226121d1565b6009546010541115611172576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b600061117c610b6e565b905060006111886121e5565b9050808510156111c95760405162461bcd60e51b81526004018080602001828103825260238152602001806129766023913960400191505060405180910390fd5b60007f000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c66001600160a01b0316631eec5a9a7f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561126057600080fd5b505afa158015611274573d6000803e3d6000fd5b505050506040513d602081101561128a57600080fd5b505190506000611299826110a5565b9050629896808110156112e4576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6112ec611b6c565b811115611331576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611350612710610606600480015485611c5a90919063ffffffff16565b90506000611368826113628686612000565b90612000565b905061139f6001600160a01b037f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef1633308d612227565b7f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef6001600160a01b031663095ea7b37f000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c68c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561143657600080fd5b505af115801561144a573d6000803e3d6000fd5b505050506040513d602081101561146057600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef811660248301526044820184905291517f000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c69092169163bc157ac1916064808201926020929091908290030181600087803b1580156114fd57600080fd5b505af1158015611511573d6000803e3d6000fd5b505050506040513d602081101561152757600080fd5b50508115611583576115836001600160a01b037f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac167f000000000000000000000000a963a46ef8d90cba23347def96632417beaf72a284612287565b60105461159090856122de565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906115c290866122de565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f84528190208651815592860151600184015585015160028301559390920151600390920191909155548791611627916122de565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611665611979565b61166d6121e5565b611675610b6e565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a46116a6612338565b509098975050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000001156117a857610c6b633b9aca006106067f00000000000000000000000034f6128924d3a8d364a5cee667b423334a1a21146001600160a01b03166332da80a37f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561177457600080fd5b505afa158015611788573d6000803e3d6000fd5b505050506040513d602081101561179e57600080fd5b5051610c65611979565b610c6b611979565b7f000000000000000000000000a963a46ef8d90cba23347def96632417beaf72a281565b60007f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac6001600160a01b0316826001600160a01b0316141561181557600080fd5b7f00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef6001600160a01b0316826001600160a01b0316141561185457600080fd5b6119027f000000000000000000000000a963a46ef8d90cba23347def96632417beaf72a2836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118c557600080fd5b505afa1580156118d9573d6000803e3d6000fd5b505050506040513d60208110156118ef57600080fd5b50516001600160a01b0385169190612287565b506001919050565b7f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac81565b7f00000000000000000000000034f6128924d3a8d364a5cee667b423334a1a211481565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119d557600080fd5b505afa1580156119e9573d6000803e3d6000fd5b505050506040513d60208110156119ff57600080fd5b50519050611a2b670de0b6b3a76400006106066110c6611a25633b9aca00610c65611080565b85612042565b91505090565b6000546001600160a01b03163314611a7e576040805162461bcd60e51b81526020600482018190526024820152600080516020612956833981519152604482015290519081900360640190fd5b6001600160a01b038216611a9157600080fd5b8015611ac65760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000611b5862989680610606633b9aca00611b52611b49611979565b60045490611c5a565b906122de565b600654909150811015610623575060065490565b6000610d13620186a06106066004600301547f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bd757600080fd5b505afa158015611beb573d6000803e3d6000fd5b505050506040513d6020811015611c0157600080fd5b505190611c5a565b600080611c216011544361200090919063ffffffff16565b600554601054919250611c38916106069084611c5a565b9150601054821115611c4a5760105491505b5090565b60115481565b60105481565b600082611c6957506000610b58565b82820282848281611c7657fe5b0414611cb35760405162461bcd60e51b81526004018080602001828103825260218152602001806129356021913960400191505060405180910390fd5b9392505050565b6000611cb383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612418565b600082611dac577f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac6001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611d7a57600080fd5b505af1158015611d8e573d6000803e3d6000fd5b505050506040513d6020811015611da457600080fd5b50611ff99050565b600354600160a01b900460ff1615611ed3576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac9092169163095ea7b3916044808201926020929091908290030181600087803b158015611e3557600080fd5b505af1158015611e49573d6000803e3d6000fd5b505050506040513d6020811015611e5f57600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50505050611ff9565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac9092169163095ea7b3916044808201926020929091908290030181600087803b158015611f4a57600080fd5b505af1158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b158015611fcc57600080fd5b505af1158015611fe0573d6000803e3d6000fd5b505050506040513d6020811015611ff657600080fd5b50505b5092915050565b6000611cb383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ba565b61204a6128b4565b600082116120895760405162461bcd60e51b815260040180806020018281038252602681526020018061290f6026913960400191505060405180910390fd5b826120a35750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161214a57600082607085901b816120cb57fe5b0490506001600160e01b0381111561212a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061215b84600160701b85612514565b90506001600160e01b0381111561212a576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b6121dc61108d611c09565b60105543601155565b600061220162989680610606633b9aca00611b52611b49611979565b6006549091508110156122175750600654610623565b6006541561062357600060065590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526122819085906125b4565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526122d99084906125b4565b505050565b600082820183811015611cb3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e5460009161234b91906122de565b600b549091501580159061235f5750804310155b1561241557600454600a5460ff161561239957600b54600454612381916122de565b6004819055600c5411612394576000600b555b6123bb565b600b546004546123a891612000565b6004819055600c54106123bb576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081836124a45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612469578181015183820152602001612451565b50505050905090810190601f1680156124965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816124b057fe5b0495945050505050565b6000818484111561250c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612469578181015183820152602001612451565b505050900390565b60008060006125238686612665565b915091506000848061253157fe5b868809905082811115612545576001820391505b808303925084821061259e576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6125a9838387612692565b979650505050505050565b6060612609826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127029092919063ffffffff16565b8051909150156122d95780806020019051602081101561262857600080fd5b50516122d95760405162461bcd60e51b815260040180806020018281038252602a8152602001806129bd602a913960400191505060405180910390fd5b600080806000198486099050838502925082810391508281101561268a576001820391505b509250929050565b600081810382168083816126a257fe5b0492508085816126ae57fe5b0494508081600003816126bd57fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60606127118484600085612719565b949350505050565b606061272485612886565b612775576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127b45780518252601f199092019160209182019101612795565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612816576040519150601f19603f3d011682016040523d82523d6000602084013e61281b565b606091505b5091509150811561282f5791506127119050565b80511561283f5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612469578181015183820152602001612451565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d24faec265827203facd4143a69cb71d0b69d17e75bc0db6f11c5cbac8ebfef764736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c6000000000000000000000000a963a46ef8d90cba23347def96632417beaf72a200000000000000000000000034f6128924d3a8d364a5cee667b423334a1a2114
-----Decoded View---------------
Arg [0] : _MNFST (address): 0x21585BBcD5bDC3f5737620cf0Db2E51978cf60ac
Arg [1] : _principle (address): 0x89C4D11DfD5868d847CA26c8B1CAa9C25c712cEf
Arg [2] : _treasury (address): 0x200a433086C37eB55bc4CD31f8195831052a67C6
Arg [3] : _DAO (address): 0xa963a46eF8D90Cba23347deF96632417Beaf72A2
Arg [4] : _bondCalculator (address): 0x34f6128924d3a8d364a5CEE667b423334a1a2114
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000021585bbcd5bdc3f5737620cf0db2e51978cf60ac
Arg [1] : 00000000000000000000000089c4d11dfd5868d847ca26c8b1caa9c25c712cef
Arg [2] : 000000000000000000000000200a433086c37eb55bc4cd31f8195831052a67c6
Arg [3] : 000000000000000000000000a963a46ef8d90cba23347def96632417beaf72a2
Arg [4] : 00000000000000000000000034f6128924d3a8d364a5cee667b423334a1a2114
Deployed Bytecode Sourcemap
21296:17333:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22014:34;;;:::i;:::-;;;;-1:-1:-1;;;;;22014:34:0;;;;;;;;;;;;;;37770:400;;;;;;;;;;;;;;;;-1:-1:-1;37770:400:0;-1:-1:-1;;;;;37770:400:0;;:::i;:::-;;;;;;;;;;;;;;;;693:89;;;:::i;918:158::-;;;:::i;:::-;;26859:466;;;;;;;;;;;;;;;;-1:-1:-1;26859:466:0;;;;;;;;;;;;;;;;;;;:::i;25949:714::-;;;;;;;;;;;;;;;;-1:-1:-1;25949:714:0;;;;;;;;;:::i;30411:1206::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30411:1206:0;;;;;;;;;;:::i;22546:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;35266:353;;;:::i;22631:24::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;-1:-1:-1;1084:260:0;-1:-1:-1;;;;;1084:260:0;;:::i;22415:22::-;;;:::i;37169:427::-;;;;;;;;;;;;;;;;-1:-1:-1;37169:427:0;-1:-1:-1;;;;;37169:427:0;;:::i;1356:221::-;;;:::i;22084:33::-;;;:::i;25034:669::-;;;;;;;;;;;;;;;;-1:-1:-1;25034:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36512:106::-;;;:::i;22468:28::-;;;:::i;34153:161::-;;;;;;;;;;;;;;;;-1:-1:-1;34153:161:0;;:::i;28005:2255::-;;;;;;;;;;;;;;;;-1:-1:-1;28005:2255:0;;;;;;;;;;;-1:-1:-1;;;;;28005:2255:0;;:::i;36138:275::-;;;:::i;22163:28::-;;;:::i;38356:270::-;;;;;;;;;;;;;;;;-1:-1:-1;38356:270:0;-1:-1:-1;;;;;38356:270:0;;:::i;21942:30::-;;;:::i;22334:39::-;;;:::i;22697:42::-;;;;;;;;;;;;;;;;-1:-1:-1;22697:42:0;-1:-1:-1;;;;;22697:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35745:272;;;:::i;27458:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27458:318:0;;;;;;;;;;:::i;22576:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22235:37;;;:::i;34419:261::-;;;:::i;33882:142::-;;;:::i;36720:286::-;;;:::i;22872:21::-;;;:::i;22790:::-;;;:::i;22014:34::-;;;:::o;37770:400::-;37842:19;37875:18;37896:30;37914:10;37896:16;:30::i;:::-;-1:-1:-1;;;;;37951:22:0;;37937:11;37951:22;;;:8;:22;;;;;:29;37875:51;;-1:-1:-1;38015:5:0;37998:22;;37993:170;;38055:6;38038:23;;37993:170;;;38111:40;38144:5;38111:27;:6;38123:13;38111:10;:27::i;:::-;:31;;:40::i;:::-;38094:57;;37993:170;37770:400;;;;;:::o;693:89::-;741:7;768:6;-1:-1:-1;;;;;768:6:0;693:89;;:::o;918:158::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;1034:1:::1;1018:6:::0;;1001:37:::1;::::0;-1:-1:-1;;;;;1018:6:0;;::::1;::::0;1001:37:::1;::::0;1034:1;;1001:37:::1;1066:1;1049:19:::0;;-1:-1:-1;;;;;;1049:19:0::1;::::0;;918:158::o;26859:466::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;27046:5:::1;:21:::0;:43:::1;::::0;27083:4:::1;::::0;27046:31:::1;::::0;27073:2:::1;27046:25;:31::i;:43::-;27032:10;:57;;27023:91;;;::::0;;-1:-1:-1;;;27023:91:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27023:91:0;;;;;;;;;;;;;::::1;;27140:177;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;27293:12:::1;27140:177:::0;;;;;;;27127:10:::1;:190:::0;;-1:-1:-1;;27127:190:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;26859:466::o;25949:714::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;26061:17:::1;26047:10;:31;;;;;;;;;26042:614;;;26120:5;26110:6;:15;;26101:66;;;;-1:-1:-1::0;;;26101:66:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26182:17:::0;:26;;;26042:614:::1;;;26245:16;26231:10;:30;;;;;;;;;26226:430;;;26303:4;26293:6;:14;;26284:61;;;::::0;;-1:-1:-1;;;26284:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26360:15:::0;:24;;;26226:430:::1;;;26421:13;26407:10;:27;;;;;;;;;26402:254;;;26476:5;26466:6;:15;;26457:58;;;::::0;;-1:-1:-1;;;26457:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26530:9:::0;:18;;;26402:254:::1;;;26585:14;26571:10;:28;;;;;;;;;26566:90;;;26622:13:::0;:22;;;26566:90:::1;25949:714:::0;;:::o;30411:1206::-;30481:4;30507:16;;:::i;:::-;-1:-1:-1;;;;;;30526:22:0;;;;;;:8;:22;;;;;;;;30507:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30580:30;30536:10;30580:16;:30::i;:::-;30559:51;;30705:5;30688:13;:22;30683:927;;-1:-1:-1;;;;;30754:22:0;;;;;;:8;:22;;;;;;;;30747:29;;;;;;;;;;;;;;;;;;;;30842:11;;30816:42;;;;;;;;;;;;;;;;;;;;;;;;;30898:46;30911:10;30923:6;30931:4;:11;;;30898;:46::i;:::-;30891:53;;;;;;30683:927;31077:11;;31063;;31077:45;;31115:5;;31077:32;;31094:13;31077:15;:32::i;:45::-;31063:59;;31207:241;;;;;;;;31239:25;31256:6;31239:4;:11;;;:15;;:25;;;;:::i;:::-;31207:241;;;;31292:54;31310:34;31328:4;:14;;;31310:12;:16;;:34;;;;:::i;:::-;31292:12;;;;;:16;:54::i;:::-;31207:241;;31376:12;31207:241;;;;;;;;31418:14;;;;;31207:241;;;;;-1:-1:-1;;;;;31182:22:0;;-1:-1:-1;31182:22:0;;;:8;:22;;;;;:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31470:65;;;;;;;;;;;;;;;;;;;;;;;;;31557:41;31570:10;31582:6;31590;31557:11;:41::i;:::-;31550:48;;;;;30411:1206;;;;;:::o;22546:21::-;;;-1:-1:-1;;;22546:21:0;;;;;:::o;35266:353::-;35314:11;35343:15;35339:273;;;35385:95;35475:4;35385:85;35465:3;35385:74;35419:14;-1:-1:-1;;;;;35402:42:0;;35446:9;35402:55;;;;;;;;;;;;;-1:-1:-1;;;;;35402:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35402:55:0;35385:11;:9;:11::i;:::-;:15;;:74::i;:95::-;35376:104;;35339:273;;;35522:78;35594:4;35522:66;35583:3;35522:55;35553:9;-1:-1:-1;;;;;35545:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35545:30:0;35539:36;;:2;:36;35522:11;:9;:11::i;:78::-;35513:87;;35266:353;:::o;22631:24::-;;;;;;;;;;;;;;;;;:::o;1084:260::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1186:23:0;::::1;1177:75;;;;-1:-1:-1::0;;;1177:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:6;::::0;;1268:36:::1;::::0;-1:-1:-1;;;;;1268:36:0;;::::1;::::0;1285:6;::::1;::::0;1268:36:::1;::::0;::::1;1315:9;:21:::0;;-1:-1:-1;;;;;;1315:21:0::1;-1:-1:-1::0;;;;;1315:21:0;;;::::1;::::0;;;::::1;::::0;;1084:260::o;22415:22::-;;;-1:-1:-1;;;;;22415:22:0;;:::o;37169:427::-;37239:19;37272:16;;:::i;:::-;-1:-1:-1;;;;;;37291:22:0;;;;;;:8;:22;;;;;;;;37272:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37291:22;37347:34;;:12;;:16;:34::i;:::-;37407:12;;;;37324:57;;-1:-1:-1;37437:11:0;;37432:157;;37483:43;37517:7;37483:28;:15;37504:5;37483:19;:28::i;:43::-;37466:60;;37432:157;;;37576:1;37559:18;;37432:157;37169:427;;;;;;:::o;1356:221::-;1440:9;;-1:-1:-1;;;;;1440:9:0;1426:10;:23;1417:71;;;;-1:-1:-1;;;1417:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:9;;;1521:6;;1504:36;;-1:-1:-1;;;;;1529:9:0;;;;1521:6;;;;1504:36;;;1560:9;;;1551:18;;-1:-1:-1;;;;;;1551:18:0;-1:-1:-1;;;;;1560:9:0;;;1551:18;;;;;;1356:221::o;22084:33::-;;;:::o;25034:669::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;25301:5:::1;:21:::0;:26;25292:73:::1;;;::::0;;-1:-1:-1;;;25292:73:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25384:241;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;25376:5:::1;:249:::0;;;;;;;;;;;;;;;;;;;;25636:9:::1;:24:::0;25683:12:::1;25671:9;:24:::0;25034:669::o;36512:106::-;36557:4;36582:28;36597:11;:9;:11::i;:::-;36582:9;;;:13;:28::i;22468:::-;;;-1:-1:-1;;;;;22468:28:0;;:::o;34153:161::-;34209:4;34234:72;34300:4;34234:60;:42;34255:6;34263:11;:9;:11::i;:::-;34234:19;:42::i;:::-;:58;:60::i;28005:2255::-;28127:4;-1:-1:-1;;;;;28154:24:0;;28145:54;;;;;-1:-1:-1;;;28145:54:0;;;;;;;;;;;;-1:-1:-1;;;28145:54:0;;;;;;;;;;;;;;;28212:11;:9;:11::i;:::-;28256:13;;28243:9;;:26;;28234:61;;;;;-1:-1:-1;;;28234:61:0;;;;;;;;;;;;-1:-1:-1;;;28234:61:0;;;;;;;;;;;;;;;28316:15;28334:16;:14;:16::i;:::-;28316:34;;28384:16;28403:12;:10;:12::i;:::-;28384:31;;28450:11;28437:9;:24;;28428:74;;;;-1:-1:-1;;;28428:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28538:10;28562:8;-1:-1:-1;;;;;28551:29:0;;28582:9;28593:7;28551:51;;;;;;;;;;;;;-1:-1:-1;;;;;28551:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28551:51:0;;-1:-1:-1;28613:11:0;28627:18;28551:51;28627:9;:18::i;:::-;28613:32;;28709:8;28699:6;:18;;28690:47;;;;;-1:-1:-1;;;28690:47:0;;;;;;;;;;;;-1:-1:-1;;;28690:47:0;;;;;;;;;;;;;;;28816:11;:9;:11::i;:::-;28806:6;:21;;28797:49;;;;;-1:-1:-1;;;28797:49:0;;;;;;;;;;;;-1:-1:-1;;;28797:49:0;;;;;;;;;;;;;;;28942:8;28953:36;28982:5;28953:23;28965:5;:9;;;28953:6;:10;;:23;;;;:::i;:36::-;28942:47;-1:-1:-1;29000:11:0;29014:30;28942:47;29014:19;:5;29025:6;29014:9;:19::i;:::-;:23;;:30::i;:::-;29000:44;-1:-1:-1;29227:74:0;-1:-1:-1;;;;;29235:9:0;29227:36;29265:10;29285:4;29292:7;29227:36;:74::i;:::-;29320:9;-1:-1:-1;;;;;29312:27:0;;29350:8;29362:7;29312:59;;;;;;;;;;;;;-1:-1:-1;;;;;29312:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29382:59:0;;;-1:-1:-1;;;29382:59:0;;;;;;;;-1:-1:-1;;;;;29422:9:0;29382:59;;;;;;;;;;;;;;29393:8;29382:29;;;;;;:59;;;;;29312;;29382;;;;;;;;-1:-1:-1;29382:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29467:8:0;;29462:114;;29523:40;-1:-1:-1;;;;;29531:5:0;29523:28;29553:3;29558;29523:28;:40::i;:::-;29644:9;;:22;;29659:5;29644:13;:22::i;:::-;29632:9;:34;29758:199;;;;;;;;-1:-1:-1;;;;;29787:22:0;;-1:-1:-1;29787:22:0;;;:8;:22;;;;;;:29;29758:199;;29787:43;;29822:6;29787:33;:43::i;:::-;29758:199;;29854:17;;;29758:199;;;;;;;;29897:12;29758:199;;;;;;;;;;;;;;-1:-1:-1;;;;;29733:22:0;;-1:-1:-1;29733:22:0;;;:8;:22;;;;;:224;;;;;;;;29854:17;29733:224;;;;;;;;;;;;;;;;;;;;;;;30062:17;29935:10;;30044:37;;:16;:37::i;:::-;30014:81;;;;;;;;30036:6;;30014:81;;;;;;;;;;30161:11;:9;:11::i;:::-;30147:12;:10;:12::i;:::-;30129:16;:14;:16::i;:::-;30111:63;;;;;;;30187:8;:6;:8::i;:::-;-1:-1:-1;30245:6:0;;28005:2255;-1:-1:-1;;;;;;;;28005:2255:0:o;36138:275::-;36195:4;36218:15;36213:193;;;36258:85;36338:3;36258:74;36292:14;-1:-1:-1;;;;;36275:42:0;;36319:9;36275:55;;;;;;;;;;;;;-1:-1:-1;;;;;36275:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36275:55:0;36258:11;:9;:11::i;36213:193::-;36383:11;:9;:11::i;22163:28::-;;;:::o;38356:270::-;38419:4;38456:5;-1:-1:-1;;;;;38446:15:0;:6;-1:-1:-1;;;;;38446:15:0;;;38437:26;;;;;;38493:9;-1:-1:-1;;;;;38483:19:0;:6;-1:-1:-1;;;;;38483:19:0;;;38474:30;;;;;;38515:81;38546:3;38559:6;-1:-1:-1;;;;;38551:26:0;;38587:4;38551:43;;;;;;;;;;;;;-1:-1:-1;;;;;38551:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38551:43:0;-1:-1:-1;;;;;38515:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;38614:4:0;38356:270;;;:::o;21942:30::-;;;:::o;22334:39::-;;;:::o;22697:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35745:272::-;35788:15;35820:11;35842:5;-1:-1:-1;;;;;35834:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35834:29:0;;-1:-1:-1;35887:122:0;36003:4;35887:110;:92;35922:24;35941:3;35922:13;:11;:13::i;:24::-;35962:6;35887:19;:92::i;:122::-;35874:135;;35745:272;;:::o;27458:318::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27554:22:0;::::1;27545:33;;;::::0;::::1;;27594:7;27589:180;;;27619:9;:16:::0;;-1:-1:-1;;;;;;;27619:16:0;;::::1;;-1:-1:-1::0;;;;;;27650:24:0::1;-1:-1:-1::0;;;;;27650:24:0;::::1;;::::0;;27589:180:::1;;;27707:9;:17:::0;;-1:-1:-1;;;;27707:17:0::1;::::0;;27739:7:::1;:18:::0;;-1:-1:-1;;;;;27739:18:0;::::1;-1:-1:-1::0;;;;;;27739:18:0;;::::1;;::::0;;27458:318;;:::o;22576:18::-;;;;;;;;;;;;;;:::o;22235:37::-;;;:::o;34419:261::-;34462:11;34504:69;34568:3;34504:58;34550:10;34504:40;34531:11;:9;:11::i;:::-;34504:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;34598:18;;34495:78;;-1:-1:-1;34589:27:0;;34584:89;;;-1:-1:-1;34643:18:0;;34419:261;:::o;33882:142::-;33925:4;33950:66;34008:6;33950:52;33985:5;:15;;;33958:5;-1:-1:-1;;;;;33950:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33950:29:0;;:33;:52::i;36720:286::-;36763:11;36788:20;36811:29;36829:9;;36811:12;:16;;:29;;;;:::i;:::-;36898:17;;36860:9;;36788:52;;-1:-1:-1;36860:57:0;;:32;;36788:52;36860:13;:32::i;:57::-;36851:66;;36942:9;;36933:6;:18;36928:71;;;36978:9;;36969:18;;36928:71;36720:286;;:::o;22872:21::-;;;;:::o;22790:::-;;;;:::o;2143:250::-;2201:7;2225:6;2221:47;;-1:-1:-1;2255:1:0;2248:8;;2221:47;2292:5;;;2296:1;2292;:5;:1;2316:5;;;;;:10;2308:56;;;;-1:-1:-1;;;2308:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2384:1;2143:250;-1:-1:-1;;;2143:250:0:o;2401:132::-;2459:7;2486:39;2490:1;2493;2486:39;;;;;;;;;;;;;;;;;:3;:39::i;31847:696::-;31936:4;31960:6;31954:557;;32026:5;-1:-1:-1;;;;;32018:24:0;;32044:10;32056:7;32018:47;;;;;;;;;;;;;-1:-1:-1;;;;;32018:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31954:557:0;;-1:-1:-1;31954:557:0;;32144:9;;-1:-1:-1;;;32144:9:0;;;;32139:361;;;32230:13;;32205:49;;;-1:-1:-1;;;32205:49:0;;-1:-1:-1;;;;;32230:13:0;;;32205:49;;;;;;;;;;;;32213:5;32205:23;;;;;;:49;;;;;;;;;;;;;;;-1:-1:-1;32205:23:0;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32289:13:0;;32273:60;;;-1:-1:-1;;;32273:60:0;;;;;;;;-1:-1:-1;;;;;32273:60:0;;;;;;;;;32289:13;;;;;32273:37;;:60;;;;;32289:13;;32273:60;;;;;;;32289:13;;32273:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32139:361;;;32399:7;;32374:43;;;-1:-1:-1;;;32374:43:0;;-1:-1:-1;;;;;32399:7:0;;;32374:43;;;;;;;;;;;;32382:5;32374:23;;;;;;:43;;;;;;;;;;;;;;;-1:-1:-1;32374:23:0;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32446:7:0;;32436:48;;;-1:-1:-1;;;32436:48:0;;;;;;;;-1:-1:-1;;;;;32436:48:0;;;;;;;;;32446:7;;;;;32436:25;;:48;;;;;32374:43;;32436:48;;;;;;;32446:7;;32436:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32139:361:0;-1:-1:-1;32528:7:0;31847:696;-1:-1:-1;;31847:696:0:o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;19956:719::-;20037:16;;:::i;:::-;20088:1;20074:11;:15;20066:66;;;;-1:-1:-1;;;20066:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20147:14;20143:50;;-1:-1:-1;20170:23:0;;;;;;;;;-1:-1:-1;20170:23:0;;20163:30;;20143:50;20210:24;;;20206:462;;20251:14;20296:11;19382:3;20269:23;;;20296:11;20268:39;;;;;;-1:-1:-1;;;;;;20330:21:0;;;20322:64;;;;;-1:-1:-1;;;20322:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20408:26;;;;;;;;20426:6;-1:-1:-1;;;;;20408:26:0;;;;20401:33;;;;;20206:462;20467:14;20484:45;20500:9;-1:-1:-1;;;20517:11:0;20484:15;:45::i;:::-;20467:62;-1:-1:-1;;;;;;20552:21:0;;;20544:64;;;;;-1:-1:-1;;;20544:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19811:137;19913:7;19924:16;-1:-1:-1;;;;;19908:13:0;;;:32;;19811:137::o;33613:124::-;33666:28;33681:11;:9;:11::i;33666:28::-;33654:9;:40;33717:12;33705:9;:24;33613:124::o;34807:345::-;34848:11;34882:69;34946:3;34882:58;34928:10;34882:40;34909:11;:9;:11::i;34882:69::-;34976:18;;34873:78;;-1:-1:-1;34967:27:0;;34962:183;;;-1:-1:-1;35021:18:0;;34962:183;;;35070:18;;:23;35065:80;;35132:1;35111:18;:22;34807:345;:::o;16493:205::-;16621:68;;;-1:-1:-1;;;;;16621:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16621:68:0;-1:-1:-1;;;16621:68:0;;;16594:96;;16614:5;;16594:19;:96::i;:::-;16493:205;;;;:::o;16308:177::-;16418:58;;;-1:-1:-1;;;;;16418:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16418:58:0;-1:-1:-1;;;16418:58:0;;;16391:86;;16411:5;;16391:19;:86::i;:::-;16308:177;;;:::o;1610:181::-;1668:7;1700:5;;;1724:6;;;;1716:46;;;;;-1:-1:-1;;;1716:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32635:917;32721:17;;32695:20;;32673:19;;32695:45;;:20;:24;:45::i;:::-;32755:15;;32673:67;;-1:-1:-1;32755:20:0;;;;:54;;;32795:14;32779:12;:30;;32755:54;32751:794;;;32842:5;:21;32883:10;:14;;;32878:494;;;32970:15;;32943:5;:21;:44;;:25;:44::i;:::-;32919:5;:68;;;33036:17;;-1:-1:-1;33006:112:0;;33097:1;33079:15;:19;33006:112;32878:494;;;33209:15;;33182:5;:21;:44;;:25;:44::i;:::-;33158:5;:68;;;33275:17;;-1:-1:-1;33245:112:0;;33336:1;33318:15;:19;33245:112;33409:12;33386:20;:35;:20;33477:21;33500:15;;33386:10;33517:14;33441:92;;;;;;;;;;;;;;;;;;;;33517:14;;33441:92;;;;;;;;;;;;;;;;32751:794;;32635:917;:::o;2541:189::-;2627:7;2662:12;2655:5;2647:28;;;;-1:-1:-1;;;2647:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:9;2702:1;2698;:5;;;;;;;2541:189;-1:-1:-1;;;;;2541:189:0:o;1943:192::-;2029:7;2065:12;2057:6;;;;2049:29;;;;-1:-1:-1;;;2049:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2101:5:0;;;1943:192::o;18856:347::-;18962:7;18983:9;18994;19007:13;19015:1;19018;19007:7;:13::i;:::-;18982:38;;;;19031:10;19057:1;19044:15;;;;;19054:1;19051;19044:15;19031:28;;19079:1;19074:2;:6;19070:18;;;19087:1;19082:6;;;;19070:18;19104:2;19099:7;;;;19129:1;19125;:5;19117:44;;;;;-1:-1:-1;;;19117:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19179:16;19187:1;19190;19193;19179:7;:16::i;:::-;19172:23;18856:347;-1:-1:-1;;;;;;;18856:347:0:o;17697:420::-;17780:23;17806:69;17834:4;17806:69;;;;;;;;;;;;;;;;;17814:5;-1:-1:-1;;;;;17806:27:0;;;:69;;;;;:::i;:::-;17890:17;;17780:95;;-1:-1:-1;17890:21:0;17886:224;;18032:10;18021:30;;;;;;;;;;;;;;;-1:-1:-1;18021:30:0;18013:85;;;;-1:-1:-1;;;18013:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18148:210;18209:9;;;-1:-1:-1;;18265:1:0;18262;18255:25;18242:38;;18299:1;18295;:5;18291:9;;18320:1;18315:2;:6;18311:10;;18341:1;18336:2;:6;18332:18;;;18349:1;18344:6;;;;18332:18;18148:210;;;;;;:::o;18366:482::-;18472:7;18511:2;;;18507:6;;;18512:1;18507:6;18524:9;;;;;;;18549:4;18544:9;;;;;;;;;18584:4;18576;18575:5;;18574:14;;;;;18633:1;:9;;;18662:5;;;18658:9;;18653:14;18687:5;;;18683:9;;18678:14;18712:5;;;18708:9;;18703:14;18737:5;;;18733:9;;18728:14;18762:5;;;18758:9;;18753:14;18787:5;;;18783:9;;18778:14;18812:5;;;18808:9;;18803:14;;;18574;;18591:1;18574:18;18569:24;;;;18564:29;;;;18835:5;;18366:482;-1:-1:-1;;18366:482:0:o;4242:196::-;4345:12;4377:53;4400:6;4408:4;4414:1;4417:12;4377:22;:53::i;:::-;4370:60;4242:196;-1:-1:-1;;;;4242:196:0:o;5218:979::-;5348:12;5381:18;5392:6;5381:10;:18::i;:::-;5373:60;;;;;-1:-1:-1;;;5373:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5507:12;5521:23;5548:6;-1:-1:-1;;;;;5548:11:0;5568:8;5579:4;5548:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5548:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5506:78;;;;5599:7;5595:595;;;5630:10;-1:-1:-1;5623:17:0;;-1:-1:-1;5623:17:0;5595:595;5744:17;;:21;5740:439;;6007:10;6001:17;6068:15;6055:10;6051:2;6047:19;6040:44;5955:148;6143:20;;-1:-1:-1;;;6143:20:0;;;;;;;;;;;;;;;;;6150:12;;6143:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3415:233;3593:20;3632:8;;;3415:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://d24faec265827203facd4143a69cb71d0b69d17e75bc0db6f11c5cbac8ebfef7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.