Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GenerationalWealthSocietyBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-18 */ // SPDX-License-Identifier: MIT 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 GenerationalWealthSocietyBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; /* ======== EVENTS ======== */ event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint payout, uint remaining ); event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable GWS; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints GWS 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; // GWS remaining to be paid uint vesting; // Blocks left to vest uint lastBlock; // Last interaction uint pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _GWS, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _GWS != address(0), "_GWS=0"); GWS = _GWS; require( _principle != address(0), "_principle=0"); principle = _principle; require( _treasury != address(0), "_treasury=0"); treasury = _treasury; require( _DAO != address(0), "_DAO=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 >= 1000, "Vesting must be longer than 36 hours" ); terms.vestingTerm = _input; } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 1000, "Payout cannot be above 1 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.FEE ) { // 2 require( _input <= 10000, "DAO fee cannot exceed payout" ); terms.fee = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment ( bool _addition, uint _increment, uint _target, uint _buffer ) external onlyPolicy() { require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external returns ( uint ) { require( _depositor != address(0), "Invalid address" ); decayDebt(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 GWS ( 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,"FE" ); uint profit = value.sub( payout ).sub( fee, "PP" ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) GWS */ 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( GWS ).safeTransfer( DAO, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { Bond memory info = bondInfo[ _recipient ]; uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining) if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ), lastBlock: block.number, pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( GWS ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( GWS ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( GWS ).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( GWS ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @notice calculate current ratio of debt to GWS supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( GWS ).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 GWS 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 GWS) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != GWS ); 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":"_GWS","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GWS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum GenerationalWealthSocietyBondDepository.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
6101406040523480156200001257600080fd5b5060405162002d5438038062002d54833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000e6576040805162461bcd60e51b815260206004820152600660248201526505f4757533d360d41b604482015290519081900360640190fd5b6001600160601b0319606086901b166080526001600160a01b03841662000143576040805162461bcd60e51b815260206004820152600c60248201526b05f7072696e6369706c653d360a41b604482015290519081900360640190fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200019f576040805162461bcd60e51b815260206004820152600b60248201526a05f74726561737572793d360ac1b604482015290519081900360640190fd5b6001600160601b0319606084901b1660c0526001600160a01b038216620001f6576040805162461bcd60e51b815260206004820152600660248201526505f44414f3d360d41b604482015290519081900360640190fd5b6001600160601b0319606092831b811660e0529181901b909116610120526001600160a01b0316151560f81b6101005250505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c612a57620002fd60003980610f7c5280611748528061196b525080610f4e52806117175280611b465250806115bd528061181152806118b8525080610de452806111e5528061142f528061151152508061059b5280610fab5280611052528061121452806113d6528061140052806114e052806117775280611876525080610d16528061159b528061183752806119b95280611bbb5280611d405280611e255280611f3a5250612a576000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610571578063e0176de814610579578063e392a26214610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063cea55f57146104f8578063d4d863ce14610500578063d50256251461052e578063d79690601461056957610211565b8063904b3ece116100f4578063904b3ece1461046e57806398fabd3a14610476578063b4abccba1461047e578063c5332b7c146104a4578063cd1234b3146104ac57610211565b806377b818951461040f5780637927ebf814610417578063844b5c7c146104345780638dbdbe6d1461043c57610211565b8063451ee4a1116101a8578063508f183211610177578063508f1832146103ae5780635a96ac0a146103b657806361d027b3146103be57806371535008146103c6578063759076e51461040757610211565b8063451ee4a11461032557806346f68ee91461035a5780634cf088d914610380578063507930ec1461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b61032d610b6e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037057600080fd5b50356001600160a01b0316610b86565b61021e610c73565b6102606004803603602081101561039e57600080fd5b50356001600160a01b0316610c82565b61021e610d14565b610282610d38565b61021e610de2565b610282600480360360e08110156103dc57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610e06565b610260610efa565b61021e610f15565b6102606004803603602081101561042d57600080fd5b5035610f24565b610260610f4a565b6102606004803603606081101561045257600080fd5b50803590602081013590604001356001600160a01b03166110e3565b610260611713565b61021e61180f565b6103116004803603602081101561049457600080fd5b50356001600160a01b0316611833565b61021e611969565b6104d2600480360360208110156104c257600080fd5b50356001600160a01b031661198d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102606119b4565b6102826004803603604081101561051657600080fd5b506001600160a01b0381351690602001351515611a6c565b610536611b2f565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611b44565b610260611b68565b610260611ba7565b610260611c44565b610260611c89565b610260611c8f565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806105c983610c82565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c95565b90611cf5565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c95565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576103e88110156108575760405162461bcd60e51b81526004018080602001828103825260248152602001806129d46024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b60006109736128c7565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610c82565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611d37565b92505050610b58565b8151600090610a6d90612710906106069085611c95565b90506040518060800160405280610a9183866000015161203b90919063ffffffff16565b8152602001610abb610ab086604001514361203b90919063ffffffff16565b60208701519061203b565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611d37565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610bd3576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b6001600160a01b038116610c185760405162461bcd60e51b81526004018080602001828103825260268152602001806129026026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610c8c6128c7565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610ce290439061203b565b60208301519091508015610d0757610d008161060684612710611c95565b9350610d0c565b600093505b505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b03163314610d815760405162461bcd60e51b81526004018080602001828103825260228152602001806129286022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610e53576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b60045415610ea8576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610f10610f07611c44565b6010549061203b565b905090565b6003546001600160a01b031681565b6000610b58662386f26fc10000610606610f4585610f40611b68565b61207d565b6121f4565b60007f0000000000000000000000000000000000000000000000000000000000000000156110485761104160646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561100757600080fd5b505afa15801561101b573d6000803e3d6000fd5b505050506040513d602081101561103157600080fd5b505161103b611b68565b90611c95565b9050610623565b610f1060646106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156110a957600080fd5b505afa1580156110bd573d6000803e3d6000fd5b505050506040513d60208110156110d357600080fd5b505160ff16600a0a61103b611b68565b60006001600160a01b038216611132576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b61113a61220c565b600954601054111561118a576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000611194610f4a565b905060006111a0612220565b9050808510156111e15760405162461bcd60e51b81526004018080602001828103825260238152602001806129b16023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d60208110156112a257600080fd5b5051905060006112b182610f24565b9050629896808110156112fc576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b611304611ba7565b811115611349576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b600061138a61271060405180604001604052806002815260200161464560f01b815250611383600480015486611c9590919063ffffffff16565b9190612262565b905060006113c78260405180604001604052806002815260200161050560f41b8152506113c0868861203b90919063ffffffff16565b9190612304565b90506113fe6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308d61235e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561149557600080fd5b505af11580156114a9573d6000803e3d6000fd5b505050506040513d60208110156114bf57600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b15801561155c57600080fd5b505af1158015611570573d6000803e3d6000fd5b505050506040513d602081101561158657600080fd5b505081156115e2576115e26001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f0000000000000000000000000000000000000000000000000000000000000000846123be565b6010546115ef9085612415565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906116219086612415565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554879161168691612415565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a46116c46119b4565b6116cc612220565b6116d4610f4a565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a461170561246f565b509098975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561180757611041633b9aca006106067f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117d357600080fd5b505afa1580156117e7573d6000803e3d6000fd5b505050506040513d60208110156117fd57600080fd5b505161103b6119b4565b6110416119b4565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561187457600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156118b357600080fd5b6119617f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561192457600080fd5b505afa158015611938573d6000803e3d6000fd5b505050506040513d602081101561194e57600080fd5b50516001600160a01b03851691906123be565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1057600080fd5b505afa158015611a24573d6000803e3d6000fd5b505050506040513d6020811015611a3a57600080fd5b50519050611a66670de0b6b3a7640000610606610f45611a60633b9aca0061103b610efa565b8561207d565b91505090565b6000546001600160a01b03163314611ab9576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b6001600160a01b038216611acc57600080fd5b8015611b015760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b9362989680610606633b9aca00611b8d611b846119b4565b60045490611c95565b90612415565b600654909150811015610623575060065490565b6000610f10620186a06106066004600301547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c1257600080fd5b505afa158015611c26573d6000803e3d6000fd5b505050506040513d6020811015611c3c57600080fd5b505190611c95565b600080611c5c6011544361203b90919063ffffffff16565b600554601054919250611c73916106069084611c95565b9150601054821115611c855760105491505b5090565b60115481565b60105481565b600082611ca457506000610b58565b82820282848281611cb157fe5b0414611cee5760405162461bcd60e51b81526004018080602001828103825260218152602001806129706021913960400191505060405180910390fd5b9392505050565b6000611cee83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612262565b600082611de7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611db557600080fd5b505af1158015611dc9573d6000803e3d6000fd5b505050506040513d6020811015611ddf57600080fd5b506120349050565b600354600160a01b900460ff1615611f0e576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611e7057600080fd5b505af1158015611e84573d6000803e3d6000fd5b505050506040513d6020811015611e9a57600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611ef157600080fd5b505af1158015611f05573d6000803e3d6000fd5b50505050612034565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b505050506040513d6020811015611faf57600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b15801561200757600080fd5b505af115801561201b573d6000803e3d6000fd5b505050506040513d602081101561203157600080fd5b50505b5092915050565b6000611cee83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612304565b6120856128ef565b600082116120c45760405162461bcd60e51b815260040180806020018281038252602681526020018061294a6026913960400191505060405180910390fd5b826120de5750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161218557600082607085901b8161210657fe5b0490506001600160e01b03811115612165576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061219684600160701b8561254f565b90506001600160e01b03811115612165576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b612217610f07611c44565b60105543601155565b600061223c62989680610606633b9aca00611b8d611b846119b4565b6006549091508110156122525750600654610623565b6006541561062357600060065590565b600081836122ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156122b357818101518382015260200161229b565b50505050905090810190601f1680156122e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816122fa57fe5b0495945050505050565b600081848411156123565760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156122b357818101518382015260200161229b565b505050900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123b89085906125ef565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526124109084906125ef565b505050565b600082820183811015611cee576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e546000916124829190612415565b600b54909150158015906124965750804310155b1561254c57600454600a5460ff16156124d057600b546004546124b891612415565b6004819055600c54116124cb576000600b555b6124f2565b600b546004546124df9161203b565b6004819055600c54106124f2576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600080600061255e86866126a0565b915091506000848061256c57fe5b868809905082811115612580576001820391505b80830392508482106125d9576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6125e48383876126cd565b979650505050505050565b6060612644826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661273d9092919063ffffffff16565b8051909150156124105780806020019051602081101561266357600080fd5b50516124105760405162461bcd60e51b815260040180806020018281038252602a8152602001806129f8602a913960400191505060405180910390fd5b60008080600019848609905083850292508281039150828110156126c5576001820391505b509250929050565b600081810382168083816126dd57fe5b0492508085816126e957fe5b0494508081600003816126f857fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b606061274c8484600085612754565b949350505050565b606061275f856128c1565b6127b0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127ef5780518252601f1990920191602091820191016127d0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612851576040519150601f19603f3d011682016040523d82523d6000602084013e612856565b606091505b5091509150811561286a57915061274c9050565b80511561287a5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156122b357818101518382015260200161229b565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212203d0a67c24556b530942daa471c1661b112a738d6c87984b35ab202d7361893ed64736f6c6343000705003300000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d70000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a46000000000000000000000000bd0500f9d9c80264d8de74acf21a257bfcfa9a62000000000000000000000000b34bb944906e78184e3d86a20466d55830275728
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b14610571578063e0176de814610579578063e392a26214610581578063f5c2ab5b14610589578063fc7b9c181461059157610211565b8063cea55f57146104f8578063d4d863ce14610500578063d50256251461052e578063d79690601461056957610211565b8063904b3ece116100f4578063904b3ece1461046e57806398fabd3a14610476578063b4abccba1461047e578063c5332b7c146104a4578063cd1234b3146104ac57610211565b806377b818951461040f5780637927ebf814610417578063844b5c7c146104345780638dbdbe6d1461043c57610211565b8063451ee4a1116101a8578063508f183211610177578063508f1832146103ae5780635a96ac0a146103b657806361d027b3146103be57806371535008146103c6578063759076e51461040757610211565b8063451ee4a11461032557806346f68ee91461035a5780634cf088d914610380578063507930ec1461038857610211565b80631a3d0068116101e45780631a3d0068146102845780631e321a0f146102b55780631feed31f146102db5780632f3f470a1461030957610211565b8063016a42841461021657806301b88ee81461023a5780630505c8c914610272578063089208d81461027a575b600080fd5b61021e610599565b604080516001600160a01b039092168252519081900360200190f35b6102606004803603602081101561025057600080fd5b50356001600160a01b03166105bd565b60408051918252519081900360200190f35b61021e610616565b610282610626565b005b6102826004803603608081101561029a57600080fd5b508035151590602081013590604081013590606001356106bd565b610282600480360360408110156102cb57600080fd5b5060ff81351690602001356107b5565b610260600480360360408110156102f157600080fd5b506001600160a01b0381351690602001351515610969565b610311610b5e565b604080519115158252519081900360200190f35b61032d610b6e565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102826004803603602081101561037057600080fd5b50356001600160a01b0316610b86565b61021e610c73565b6102606004803603602081101561039e57600080fd5b50356001600160a01b0316610c82565b61021e610d14565b610282610d38565b61021e610de2565b610282600480360360e08110156103dc57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610e06565b610260610efa565b61021e610f15565b6102606004803603602081101561042d57600080fd5b5035610f24565b610260610f4a565b6102606004803603606081101561045257600080fd5b50803590602081013590604001356001600160a01b03166110e3565b610260611713565b61021e61180f565b6103116004803603602081101561049457600080fd5b50356001600160a01b0316611833565b61021e611969565b6104d2600480360360208110156104c257600080fd5b50356001600160a01b031661198d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102606119b4565b6102826004803603604081101561051657600080fd5b506001600160a01b0381351690602001351515611a6c565b610536611b2f565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610311611b44565b610260611b68565b610260611ba7565b610260611c44565b610260611c89565b610260611c8f565b7f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e81565b6000806105c983610c82565b6001600160a01b0384166000908152600f602052604090205490915061271082106105f65780925061060f565b61060c6127106106068385611c95565b90611cf5565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b03163314610673576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461070a576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b600454610720906103e890610606906019611c95565b83111561076a576040805162461bcd60e51b8152602060048201526013602482015272496e6372656d656e7420746f6f206c6172676560681b604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905260608501829052436080909501859052600a805460ff19169091179055600b92909255600c55600d55600e55565b6000546001600160a01b03163314610802576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b600082600381111561081057fe5b1415610861576103e88110156108575760405162461bcd60e51b81526004018080602001828103825260248152602001806129d46024913960400191505060405180910390fd5b6005819055610965565b600182600381111561086f57fe5b14156108d6576103e88111156108cc576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6007819055610965565b60028260038111156108e457fe5b141561094b57612710811115610941576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6008819055610965565b600382600381111561095957fe5b14156109655760098190555b5050565b60006109736128c7565b506001600160a01b0383166000908152600f60209081526040808320815160808101835281548152600182015493810193909352600281015491830191909152600301546060820152906109c685610c82565b90506127108110610a56576001600160a01b0385166000818152600f602090815260408083208381556001810184905560028101849055600301839055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a4d85858460000151611d37565b92505050610b58565b8151600090610a6d90612710906106069085611c95565b90506040518060800160405280610a9183866000015161203b90919063ffffffff16565b8152602001610abb610ab086604001514361203b90919063ffffffff16565b60208701519061203b565b8152436020808301919091526060808701516040938401526001600160a01b038a166000818152600f84528490208551808255868501516001830155868601516002830155959092015160039092019190915582518581529182019390935281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610b52868683611d37565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d54600e5460ff9094169385565b6000546001600160a01b03163314610bd3576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b6001600160a01b038116610c185760405162461bcd60e51b81526004018080602001828103825260268152602001806129026026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610c8c6128c7565b506001600160a01b0382166000908152600f602090815260408083208151608081018352815481526001820154938101939093526002810154918301829052600301546060830152909190610ce290439061203b565b60208301519091508015610d0757610d008161060684612710611c95565b9350610d0c565b600093505b505050919050565b7f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d781565b6001546001600160a01b03163314610d815760405162461bcd60e51b81526004018080602001828103825260228152602001806129286022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a4681565b6000546001600160a01b03163314610e53576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b60045415610ea8576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a00182905260049690965560059490945560069290925560075560085560095560105543601155565b6000610f10610f07611c44565b6010549061203b565b905090565b6003546001600160a01b031681565b6000610b58662386f26fc10000610606610f4585610f40611b68565b61207d565b6121f4565b60007f0000000000000000000000000000000000000000000000000000000000000001156110485761104160646106067f000000000000000000000000b34bb944906e78184e3d86a20466d558302757286001600160a01b03166332da80a37f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561100757600080fd5b505afa15801561101b573d6000803e3d6000fd5b505050506040513d602081101561103157600080fd5b505161103b611b68565b90611c95565b9050610623565b610f1060646106067f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156110a957600080fd5b505afa1580156110bd573d6000803e3d6000fd5b505050506040513d60208110156110d357600080fd5b505160ff16600a0a61103b611b68565b60006001600160a01b038216611132576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b61113a61220c565b600954601054111561118a576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b6000611194610f4a565b905060006111a0612220565b9050808510156111e15760405162461bcd60e51b81526004018080602001828103825260238152602001806129b16023913960400191505060405180910390fd5b60007f000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a466001600160a01b0316631eec5a9a7f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561127857600080fd5b505afa15801561128c573d6000803e3d6000fd5b505050506040513d60208110156112a257600080fd5b5051905060006112b182610f24565b9050629896808110156112fc576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b611304611ba7565b811115611349576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b600061138a61271060405180604001604052806002815260200161464560f01b815250611383600480015486611c9590919063ffffffff16565b9190612262565b905060006113c78260405180604001604052806002815260200161050560f41b8152506113c0868861203b90919063ffffffff16565b9190612304565b90506113fe6001600160a01b037f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e1633308d61235e565b7f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e6001600160a01b031663095ea7b37f000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a468c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561149557600080fd5b505af11580156114a9573d6000803e3d6000fd5b505050506040513d60208110156114bf57600080fd5b50506040805163bc157ac160e01b8152600481018c90526001600160a01b037f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e811660248301526044820184905291517f000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a469092169163bc157ac1916064808201926020929091908290030181600087803b15801561155c57600080fd5b505af1158015611570573d6000803e3d6000fd5b505050506040513d602081101561158657600080fd5b505081156115e2576115e26001600160a01b037f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d7167f000000000000000000000000bd0500f9d9c80264d8de74acf21a257bfcfa9a62846123be565b6010546115ef9085612415565b601055604080516080810182526001600160a01b038a166000908152600f602052919091205481906116219086612415565b81526005805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600f8452819020865181559286015160018401558501516002830155939092015160039092019190915554879161168691612415565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a46116c46119b4565b6116cc612220565b6116d4610f4a565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a461170561246f565b509098975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000011561180757611041633b9aca006106067f000000000000000000000000b34bb944906e78184e3d86a20466d558302757286001600160a01b03166332da80a37f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117d357600080fd5b505afa1580156117e7573d6000803e3d6000fd5b505050506040513d60208110156117fd57600080fd5b505161103b6119b4565b6110416119b4565b7f000000000000000000000000bd0500f9d9c80264d8de74acf21a257bfcfa9a6281565b60007f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d76001600160a01b0316826001600160a01b0316141561187457600080fd5b7f0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e6001600160a01b0316826001600160a01b031614156118b357600080fd5b6119617f000000000000000000000000bd0500f9d9c80264d8de74acf21a257bfcfa9a62836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561192457600080fd5b505afa158015611938573d6000803e3d6000fd5b505050506040513d602081101561194e57600080fd5b50516001600160a01b03851691906123be565b506001919050565b7f000000000000000000000000b34bb944906e78184e3d86a20466d5583027572881565b600f6020526000908152604090208054600182015460028301546003909301549192909184565b6000807f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d76001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1057600080fd5b505afa158015611a24573d6000803e3d6000fd5b505050506040513d6020811015611a3a57600080fd5b50519050611a66670de0b6b3a7640000610606610f45611a60633b9aca0061103b610efa565b8561207d565b91505090565b6000546001600160a01b03163314611ab9576040805162461bcd60e51b81526020600482018190526024820152600080516020612991833981519152604482015290519081900360640190fd5b6001600160a01b038216611acc57600080fd5b8015611b015760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b038416179055610965565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095486565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000611b9362989680610606633b9aca00611b8d611b846119b4565b60045490611c95565b90612415565b600654909150811015610623575060065490565b6000610f10620186a06106066004600301547f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d76001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c1257600080fd5b505afa158015611c26573d6000803e3d6000fd5b505050506040513d6020811015611c3c57600080fd5b505190611c95565b600080611c5c6011544361203b90919063ffffffff16565b600554601054919250611c73916106069084611c95565b9150601054821115611c855760105491505b5090565b60115481565b60105481565b600082611ca457506000610b58565b82820282848281611cb157fe5b0414611cee5760405162461bcd60e51b81526004018080602001828103825260218152602001806129706021913960400191505060405180910390fd5b9392505050565b6000611cee83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612262565b600082611de7577f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d76001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611db557600080fd5b505af1158015611dc9573d6000803e3d6000fd5b505050506040513d6020811015611ddf57600080fd5b506120349050565b600354600160a01b900460ff1615611f0e576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d79092169163095ea7b3916044808201926020929091908290030181600087803b158015611e7057600080fd5b505af1158015611e84573d6000803e3d6000fd5b505050506040513d6020811015611e9a57600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b158015611ef157600080fd5b505af1158015611f05573d6000803e3d6000fd5b50505050612034565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d79092169163095ea7b3916044808201926020929091908290030181600087803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b505050506040513d6020811015611faf57600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b15801561200757600080fd5b505af115801561201b573d6000803e3d6000fd5b505050506040513d602081101561203157600080fd5b50505b5092915050565b6000611cee83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612304565b6120856128ef565b600082116120c45760405162461bcd60e51b815260040180806020018281038252602681526020018061294a6026913960400191505060405180910390fd5b826120de5750604080516020810190915260008152610b58565b71ffffffffffffffffffffffffffffffffffff831161218557600082607085901b8161210657fe5b0490506001600160e01b03811115612165576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b58565b600061219684600160701b8561254f565b90506001600160e01b03811115612165576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b612217610f07611c44565b60105543601155565b600061223c62989680610606633b9aca00611b8d611b846119b4565b6006549091508110156122525750600654610623565b6006541561062357600060065590565b600081836122ee5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156122b357818101518382015260200161229b565b50505050905090810190601f1680156122e05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816122fa57fe5b0495945050505050565b600081848411156123565760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156122b357818101518382015260200161229b565b505050900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123b89085906125ef565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526124109084906125ef565b505050565b600082820183811015611cee576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d54600e546000916124829190612415565b600b54909150158015906124965750804310155b1561254c57600454600a5460ff16156124d057600b546004546124b891612415565b6004819055600c54116124cb576000600b555b6124f2565b600b546004546124df9161203b565b6004819055600c54106124f2576000600b555b43600e55600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600080600061255e86866126a0565b915091506000848061256c57fe5b868809905082811115612580576001820391505b80830392508482106125d9576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6125e48383876126cd565b979650505050505050565b6060612644826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661273d9092919063ffffffff16565b8051909150156124105780806020019051602081101561266357600080fd5b50516124105760405162461bcd60e51b815260040180806020018281038252602a8152602001806129f8602a913960400191505060405180910390fd5b60008080600019848609905083850292508281039150828110156126c5576001820391505b509250929050565b600081810382168083816126dd57fe5b0492508085816126e957fe5b0494508081600003816126f857fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b606061274c8484600085612754565b949350505050565b606061275f856128c1565b6127b0576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106127ef5780518252601f1990920191602091820191016127d0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612851576040519150601f19603f3d011682016040523d82523d6000602084013e612856565b606091505b5091509150811561286a57915061274c9050565b80511561287a5780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156122b357818101518382015260200161229b565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212203d0a67c24556b530942daa471c1661b112a738d6c87984b35ab202d7361893ed64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d70000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a46000000000000000000000000bd0500f9d9c80264d8de74acf21a257bfcfa9a62000000000000000000000000b34bb944906e78184e3d86a20466d55830275728
-----Decoded View---------------
Arg [0] : _GWS (address): 0x36F17BD0F7028c784b2e0C9B5a65dBe071a902d7
Arg [1] : _principle (address): 0x5669Deb8CC857661e64Fe08F41Bd74536758818E
Arg [2] : _treasury (address): 0xF6b7EA4D234c545f061fF6D5a1a3d447eA8d8a46
Arg [3] : _DAO (address): 0xbD0500F9D9C80264d8DE74ACf21a257BFcfa9A62
Arg [4] : _bondCalculator (address): 0xB34bb944906E78184e3d86a20466d55830275728
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000036f17bd0f7028c784b2e0c9b5a65dbe071a902d7
Arg [1] : 0000000000000000000000005669deb8cc857661e64fe08f41bd74536758818e
Arg [2] : 000000000000000000000000f6b7ea4d234c545f061ff6d5a1a3d447ea8d8a46
Arg [3] : 000000000000000000000000bd0500f9d9c80264d8de74acf21a257bfcfa9a62
Arg [4] : 000000000000000000000000b34bb944906e78184e3d86a20466d55830275728
Deployed Bytecode Sourcemap
21266:17233:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21999:34;;;:::i;:::-;;;;-1:-1:-1;;;;;21999:34:0;;;;;;;;;;;;;;37644:400;;;;;;;;;;;;;;;;-1:-1:-1;37644:400:0;-1:-1:-1;;;;;37644:400:0;;:::i;:::-;;;;;;;;;;;;;;;;679:89;;;:::i;904:158::-;;;:::i;:::-;;26862:463;;;;;;;;;;;;;;;;-1:-1:-1;26862:463:0;;;;;;;;;;;;;;;;;;;:::i;25953:713::-;;;;;;;;;;;;;;;;-1:-1:-1;25953:713:0;;;;;;;;;:::i;30363:1198::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30363:1198:0;;;;;;;;;;:::i;22529:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;22614:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1070:260;;;;;;;;;;;;;;;;-1:-1:-1;1070:260:0;-1:-1:-1;;;;;1070:260:0;;:::i;22398:22::-;;;:::i;37045:427::-;;;;;;;;;;;;;;;;-1:-1:-1;37045:427:0;-1:-1:-1;;;;;37045:427:0;;:::i;21929:28::-;;;:::i;1338:221::-;;;:::i;22069:33::-;;;:::i;25044:667::-;;;;;;;;;;;;;;;;-1:-1:-1;25044:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36388:106::-;;;:::i;22451:28::-;;;:::i;34085:161::-;;;;;;;;;;;;;;;;-1:-1:-1;34085:161:0;;:::i;35173:331::-;;;:::i;28001:2213::-;;;;;;;;;;;;;;;;-1:-1:-1;28001:2213:0;;;;;;;;;;;-1:-1:-1;;;;;28001:2213:0;;:::i;36014:275::-;;;:::i;22146:28::-;;;:::i;38228:268::-;;;;;;;;;;;;;;;;-1:-1:-1;38228:268:0;-1:-1:-1;;;;;38228:268:0;;:::i;22317:39::-;;;:::i;22680:42::-;;;;;;;;;;;;;;;;-1:-1:-1;22680:42:0;-1:-1:-1;;;;;22680:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35628:265;;;:::i;27458:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27458:318:0;;;;;;;;;;:::i;22559:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22218:37;;;:::i;34351:253::-;;;:::i;33816:140::-;;;:::i;36596:286::-;;;:::i;22855:21::-;;;:::i;22773:::-;;;:::i;21999:34::-;;;:::o;37644:400::-;37716:19;37749:18;37770:30;37788:10;37770:16;:30::i;:::-;-1:-1:-1;;;;;37825:22:0;;37811:11;37825:22;;;:8;:22;;;;;:29;37749:51;;-1:-1:-1;37889:5:0;37872:22;;37867:170;;37929:6;37912:23;;37867:170;;;37985:40;38018:5;37985:27;:6;37997:13;37985:10;:27::i;:::-;:31;;:40::i;:::-;37968:57;;37867:170;37644:400;;;;;:::o;679:89::-;727:7;754:6;-1:-1:-1;;;;;754:6:0;679:89;;:::o;904:158::-;818:6;;-1:-1:-1;;;;;818:6:0;828:10;818:20;809:67;;;;;-1:-1:-1;;;809:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;809:67:0;;;;;;;;;;;;;;;1020:1:::1;1004:6:::0;;987:37:::1;::::0;-1:-1:-1;;;;;1004:6:0;;::::1;::::0;987:37:::1;::::0;1020:1;;987:37:::1;1052:1;1035:19:::0;;-1:-1:-1;;;;;;1035:19:0::1;::::0;;904:158::o;26862:463::-;818:6;;-1:-1:-1;;;;;818:6:0;828:10;818:20;809:67;;;;;-1:-1:-1;;;809:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;809: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;;;;;;;;;;;;;26862:463::o;25953:713::-;818:6;;-1:-1:-1;;;;;818:6:0;828:10;818:20;809:67;;;;;-1:-1:-1;;;809:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;809:67:0;;;;;;;;;;;;;;;26065:17:::1;26051:10;:31;;;;;;;;;26046:613;;;26124:4;26114:6;:14;;26105:65;;;;-1:-1:-1::0;;;26105:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26185:17:::0;:26;;;26046:613:::1;;;26248:16;26234:10;:30;;;;;;;;;26229:430;;;26306:4;26296:6;:14;;26287:61;;;::::0;;-1:-1:-1;;;26287:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26363:15:::0;:24;;;26229:430:::1;;;26424:13;26410:10;:27;;;;;;;;;26405:254;;;26479:5;26469:6;:15;;26460:58;;;::::0;;-1:-1:-1;;;26460:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26533:9:::0;:18;;;26405:254:::1;;;26588:14;26574:10;:28;;;;;;;;;26569:90;;;26625:13:::0;:22;;;26569:90:::1;25953:713:::0;;:::o;30363:1198::-;30433:4;30451:16;;:::i;:::-;-1:-1:-1;;;;;;30470:22:0;;;;;;:8;:22;;;;;;;;30451:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30524:30;30480:10;30524:16;:30::i;:::-;30503:51;;30649:5;30632:13;:22;30627:927;;-1:-1:-1;;;;;30698:22:0;;;;;;:8;:22;;;;;;;;30691:29;;;;;;;;;;;;;;;;;;;;30786:11;;30760:42;;;;;;;;;;;;;;;;;;;;;;;;;30842:46;30855:10;30867:6;30875:4;:11;;;30842;:46::i;:::-;30835:53;;;;;;30627:927;31021:11;;31007;;31021:45;;31059:5;;31021:32;;31038:13;31021:15;:32::i;:45::-;31007:59;;31151:241;;;;;;;;31183:25;31200:6;31183:4;:11;;;:15;;:25;;;;:::i;:::-;31151:241;;;;31236:54;31254:34;31272:4;:14;;;31254:12;:16;;:34;;;;:::i;:::-;31236:12;;;;;:16;:54::i;:::-;31151:241;;31320:12;31151:241;;;;;;;;31362:14;;;;;31151:241;;;;;-1:-1:-1;;;;;31126:22:0;;-1:-1:-1;31126:22:0;;;:8;:22;;;;;:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31414:65;;;;;;;;;;;;;;;;;;;;;;;;;31501:41;31514:10;31526:6;31534;31501:11;:41::i;:::-;31494:48;;;;;30363:1198;;;;;:::o;22529:21::-;;;-1:-1:-1;;;22529:21:0;;;;;:::o;22614:24::-;;;;;;;;;;;;;;;;;:::o;1070:260::-;818:6;;-1:-1:-1;;;;;818:6:0;828:10;818:20;809:67;;;;;-1:-1:-1;;;809:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;809:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1172:23:0;::::1;1163:75;;;;-1:-1:-1::0;;;1163:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1271:6;::::0;;1254:36:::1;::::0;-1:-1:-1;;;;;1254:36:0;;::::1;::::0;1271:6;::::1;::::0;1254:36:::1;::::0;::::1;1301:9;:21:::0;;-1:-1:-1;;;;;;1301:21:0::1;-1:-1:-1::0;;;;;1301:21:0;;;::::1;::::0;;;::::1;::::0;;1070:260::o;22398:22::-;;;-1:-1:-1;;;;;22398:22:0;;:::o;37045:427::-;37115:19;37148:16;;:::i;:::-;-1:-1:-1;;;;;;37167:22:0;;;;;;:8;:22;;;;;;;;37148:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37167:22;37223:34;;:12;;:16;:34::i;:::-;37283:12;;;;37200:57;;-1:-1:-1;37313:11:0;;37308:157;;37359:43;37393:7;37359:28;:15;37380:5;37359:19;:28::i;:43::-;37342:60;;37308:157;;;37452:1;37435:18;;37308:157;37045:427;;;;;;:::o;21929:28::-;;;:::o;1338:221::-;1422:9;;-1:-1:-1;;;;;1422:9:0;1408:10;:23;1399:71;;;;-1:-1:-1;;;1399:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1511:9;;;1503:6;;1486:36;;-1:-1:-1;;;;;1511:9:0;;;;1503:6;;;;1486:36;;;1542:9;;;1533:18;;-1:-1:-1;;;;;;1533:18:0;-1:-1:-1;;;;;1542:9:0;;;1533:18;;;;;;1338:221::o;22069:33::-;;;:::o;25044:667::-;818:6;;-1:-1:-1;;;;;818:6:0;828:10;818:20;809:67;;;;;-1:-1:-1;;;809:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;809:67:0;;;;;;;;;;;;;;;25309:5:::1;:21:::0;:26;25300:73:::1;;;::::0;;-1:-1:-1;;;25300:73:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25392:241;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;25384:5:::1;:249:::0;;;;;;;;;;;;;;;;;;;;25644:9:::1;:24:::0;25691:12:::1;25679:9;:24:::0;25044:667::o;36388:106::-;36433:4;36458:28;36473:11;:9;:11::i;:::-;36458:9;;;:13;:28::i;:::-;36451:35;;36388:106;:::o;22451:28::-;;;-1:-1:-1;;;;;22451:28:0;;:::o;34085:161::-;34141:4;34166:72;34232:4;34166:60;:42;34187:6;34195:11;:9;:11::i;:::-;34166:19;:42::i;:::-;:58;:60::i;35173:331::-;35221:11;35250:15;35246:251;;;35292:85;35372:3;35292:74;35326:14;-1:-1:-1;;;;;35309:42:0;;35353:9;35309:55;;;;;;;;;;;;;-1:-1:-1;;;;;35309:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35309:55:0;35292:11;:9;:11::i;:::-;:15;;:74::i;:85::-;35283:94;;35246:251;;;35419:66;35480:3;35419:55;35450:9;-1:-1:-1;;;;;35442:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35442:30:0;35436:36;;:2;:36;35419:11;:9;:11::i;28001:2213::-;28121:4;-1:-1:-1;;;;;28148:24:0;;28139:54;;;;;-1:-1:-1;;;28139:54:0;;;;;;;;;;;;-1:-1:-1;;;28139:54:0;;;;;;;;;;;;;;;28206:11;:9;:11::i;:::-;28250:13;;28237:9;;:26;;28228:61;;;;;-1:-1:-1;;;28228:61:0;;;;;;;;;;;;-1:-1:-1;;;28228:61:0;;;;;;;;;;;;;;;28302:15;28320:16;:14;:16::i;:::-;28302:34;;28370:16;28389:12;:10;:12::i;:::-;28370:31;;28436:11;28423:9;:24;;28414:74;;;;-1:-1:-1;;;28414:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28524:10;28548:8;-1:-1:-1;;;;;28537:29:0;;28568:9;28579:7;28537:51;;;;;;;;;;;;;-1:-1:-1;;;;;28537:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28537:51:0;;-1:-1:-1;28599:11:0;28613:18;28537:51;28613:9;:18::i;:::-;28599:32;;28695:8;28685:6;:18;;28676:47;;;;;-1:-1:-1;;;28676:47:0;;;;;;;;;;;;-1:-1:-1;;;28676:47:0;;;;;;;;;;;;;;;28800:11;:9;:11::i;:::-;28790:6;:21;;28781:49;;;;;-1:-1:-1;;;28781:49:0;;;;;;;;;;;;-1:-1:-1;;;28781:49:0;;;;;;;;;;;;;;;28926:8;28937:41;28966:5;28937:41;;;;;;;;;;;;;-1:-1:-1;;;28937:41:0;;;:23;28949:5;:9;;;28937:6;:10;;:23;;;;:::i;:::-;:27;:41;:27;:41::i;:::-;28926:52;;28989:11;29003:36;29028:3;29003:36;;;;;;;;;;;;;-1:-1:-1;;;29003:36:0;;;:19;29014:6;29003:5;:9;;:19;;;;:::i;:::-;:23;:36;:23;:36::i;:::-;28989:50;-1:-1:-1;29220:74:0;-1:-1:-1;;;;;29228:9:0;29220:36;29258:10;29278:4;29285:7;29220:36;:74::i;:::-;29313:9;-1:-1:-1;;;;;29305:27:0;;29343:8;29355:7;29305:59;;;;;;;;;;;;;-1:-1:-1;;;;;29305:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29375:59:0;;;-1:-1:-1;;;29375:59:0;;;;;;;;-1:-1:-1;;;;;29415:9:0;29375:59;;;;;;;;;;;;;;29386:8;29375:29;;;;;;:59;;;;;29305;;29375;;;;;;;;-1:-1:-1;29375:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29452:8:0;;29447:110;;29507:38;-1:-1:-1;;;;;29515:3:0;29507:26;29535:3;29540;29507:26;:38::i;:::-;29617:9;;:22;;29632:5;29617:13;:22::i;:::-;29605:9;:34;29714:198;;;;;;;;-1:-1:-1;;;;;29742:22:0;;-1:-1:-1;29742:22:0;;;:8;:22;;;;;;:29;29714:198;;29742:43;;29777:6;29742:33;:43::i;:::-;29714:198;;29809:17;;;29714:198;;;;;;;;29852:12;29714:198;;;;;;;;;;;;;;-1:-1:-1;;;;;29689:22:0;;-1:-1:-1;29689:22:0;;;:8;:22;;;;;:223;;;;;;;;29809:17;29689:223;;;;;;;;;;;;;;;;;;;;;;;30017:17;29890:10;;29999:37;;:16;:37::i;:::-;29969:81;;;;;;;;29991:6;;29969:81;;;;;;;;;;30116:11;:9;:11::i;:::-;30102:12;:10;:12::i;:::-;30084:16;:14;:16::i;:::-;30066:63;;;;;;;30142:8;:6;:8::i;:::-;-1:-1:-1;30200:6:0;;28001:2213;-1:-1:-1;;;;;;;;28001:2213:0:o;36014:275::-;36071:4;36094:15;36089:193;;;36134:85;36214:3;36134:74;36168:14;-1:-1:-1;;;;;36151:42:0;;36195:9;36151:55;;;;;;;;;;;;;-1:-1:-1;;;;;36151:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36151:55:0;36134:11;:9;:11::i;36089:193::-;36259:11;:9;:11::i;22146:28::-;;;:::o;38228:268::-;38291:4;38328:3;-1:-1:-1;;;;;38318:13:0;:6;-1:-1:-1;;;;;38318:13:0;;;38309:24;;;;;;38363:9;-1:-1:-1;;;;;38353:19:0;:6;-1:-1:-1;;;;;38353:19:0;;;38344:30;;;;;;38385:81;38416:3;38429:6;-1:-1:-1;;;;;38421:26:0;;38457:4;38421:43;;;;;;;;;;;;;-1:-1:-1;;;;;38421:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38421:43:0;-1:-1:-1;;;;;38385:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;38484:4:0;38228:268;;;:::o;22317:39::-;;;:::o;22680:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35628:265::-;35671:15;35700:11;35722:3;-1:-1:-1;;;;;35714:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35714:27:0;;-1:-1:-1;35765:120:0;35879:4;35765:108;:90;35799:24;35818:3;35799:13;:11;:13::i;:24::-;35838:6;35765:19;:90::i;:120::-;35752:133;;35628:265;;:::o;27458:318::-;818:6;;-1:-1:-1;;;;;818:6:0;828:10;818:20;809:67;;;;;-1:-1:-1;;;809:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;809: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;22559:18::-;;;;;;;;;;;;;;:::o;22218:37::-;;;:::o;34351:253::-;34394:11;34428:69;34492:3;34428:58;34474:10;34428:40;34455:11;:9;:11::i;:::-;34428:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;34522:18;;34419:78;;-1:-1:-1;34513:27:0;;34508:89;;;-1:-1:-1;34567:18:0;;34351:253;:::o;33816:140::-;33859:4;33884:64;33940:6;33884:50;33917:5;:15;;;33892:3;-1:-1:-1;;;;;33884:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33884:27:0;;:31;:50::i;36596:286::-;36639:11;36664:20;36687:29;36705:9;;36687:12;:16;;:29;;;;:::i;:::-;36774:17;;36736:9;;36664:52;;-1:-1:-1;36736:57:0;;:32;;36664:52;36736:13;:32::i;:57::-;36727:66;;36818:9;;36809:6;:18;36804:71;;;36854:9;;36845:18;;36804:71;36596:286;;:::o;22855:21::-;;;;:::o;22773:::-;;;;:::o;2125:250::-;2183:7;2207:6;2203:47;;-1:-1:-1;2237:1:0;2230:8;;2203:47;2274:5;;;2278:1;2274;:5;:1;2298:5;;;;;:10;2290:56;;;;-1:-1:-1;;;2290:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2366:1;2125:250;-1:-1:-1;;;2125:250:0:o;2383:132::-;2441:7;2468:39;2472:1;2475;2468:39;;;;;;;;;;;;;;;;;:3;:39::i;31787:690::-;31876:4;31900:6;31894:551;;31966:3;-1:-1:-1;;;;;31958:22:0;;31982:10;31994:7;31958:45;;;;;;;;;;;;;-1:-1:-1;;;;;31958:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31894:551:0;;-1:-1:-1;31894:551:0;;32082:9;;-1:-1:-1;;;32082:9:0;;;;32077:357;;;32166:13;;32143:47;;;-1:-1:-1;;;32143:47:0;;-1:-1:-1;;;;;32166:13:0;;;32143:47;;;;;;;;;;;;32151:3;32143:21;;;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;32143:21:0;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32225:13:0;;32209:60;;;-1:-1:-1;;;32209:60:0;;;;;;;;-1:-1:-1;;;;;32209:60:0;;;;;;;;;32225:13;;;;;32209:37;;:60;;;;;32225:13;;32209:60;;;;;;;32225:13;;32209:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32077:357;;;32333:7;;32310:41;;;-1:-1:-1;;;32310:41:0;;-1:-1:-1;;;;;32333:7:0;;;32310:41;;;;;;;;;;;;32318:3;32310:21;;;;;;:41;;;;;;;;;;;;;;;-1:-1:-1;32310:21:0;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32380:7:0;;32370:48;;;-1:-1:-1;;;32370:48:0;;;;;;;;-1:-1:-1;;;;;32370:48:0;;;;;;;;;32380:7;;;;;32370:25;;:48;;;;;32310:41;;32370:48;;;;;;;32380:7;;32370:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32077:357:0;-1:-1:-1;32462:7:0;31787:690;-1:-1:-1;;31787:690:0:o;1781:136::-;1839:7;1866:43;1870:1;1873;1866:43;;;;;;;;;;;;;;;;;:3;:43::i;19926:719::-;20007:16;;:::i;:::-;20058:1;20044:11;:15;20036:66;;;;-1:-1:-1;;;20036:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20117:14;20113:50;;-1:-1:-1;20140:23:0;;;;;;;;;-1:-1:-1;20140:23:0;;20133:30;;20113:50;20180:24;;;20176:462;;20221:14;20266:11;19352:3;20239:23;;;20266:11;20238:39;;;;;;-1:-1:-1;;;;;;20300:21:0;;;20292:64;;;;;-1:-1:-1;;;20292:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20378:26;;;;;;;;20396:6;-1:-1:-1;;;;;20378:26:0;;;;20371:33;;;;;20176:462;20437:14;20454:45;20470:9;-1:-1:-1;;;20487:11:0;20454:15;:45::i;:::-;20437:62;-1:-1:-1;;;;;;20522:21:0;;;20514:64;;;;;-1:-1:-1;;;20514:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19781:137;19883:7;19894:16;-1:-1:-1;;;;;19878:13:0;;;:32;;19781:137::o;33547:124::-;33600:28;33615:11;:9;:11::i;33600:28::-;33588:9;:40;33651:12;33639:9;:24;33547:124::o;34731:337::-;34772:11;34806:69;34870:3;34806:58;34852:10;34806:40;34833:11;:9;:11::i;34806:69::-;34900:18;;34797:78;;-1:-1:-1;34891:27:0;;34886:175;;;-1:-1:-1;34945:18:0;;34886:175;;;34986:18;;:23;34981:80;;35048:1;35027:18;:22;34731:337;:::o;2523:189::-;2609:7;2644:12;2637:5;2629:28;;;;-1:-1:-1;;;2629:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2668:9;2684:1;2680;:5;;;;;;;2523:189;-1:-1:-1;;;;;2523:189:0:o;1925:192::-;2011:7;2047:12;2039:6;;;;2031:29;;;;-1:-1:-1;;;2031:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2083:5:0;;;1925:192::o;16463:205::-;16591:68;;;-1:-1:-1;;;;;16591:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16591:68:0;-1:-1:-1;;;16591:68:0;;;16564:96;;16584:5;;16564:19;:96::i;:::-;16463:205;;;;:::o;16278:177::-;16388:58;;;-1:-1:-1;;;;;16388:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16388:58:0;-1:-1:-1;;;16388:58:0;;;16361:86;;16381:5;;16361:19;:86::i;:::-;16278:177;;;:::o;1592:181::-;1650:7;1682:5;;;1706:6;;;;1698:46;;;;;-1:-1:-1;;;1698:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;32569:917;32655:17;;32629:20;;32607:19;;32629:45;;:20;:24;:45::i;:::-;32689:15;;32607:67;;-1:-1:-1;32689:20:0;;;;:54;;;32729:14;32713:12;:30;;32689:54;32685:794;;;32776:5;:21;32817:10;:14;;;32812:494;;;32904:15;;32877:5;:21;:44;;:25;:44::i;:::-;32853:5;:68;;;32970:17;;-1:-1:-1;32940:112:0;;33031:1;33013:15;:19;32940:112;32812:494;;;33143:15;;33116:5;:21;:44;;:25;:44::i;:::-;33092:5;:68;;;33209:17;;-1:-1:-1;33179:112:0;;33270:1;33252:15;:19;33179:112;33343:12;33320:20;:35;:20;33411:21;33434:15;;33320:10;33451:14;33375:92;;;;;;;;;;;;;;;;;;;;33451:14;;33375:92;;;;;;;;;;;;;;;;32685:794;;32569:917;:::o;18826:347::-;18932:7;18953:9;18964;18977:13;18985:1;18988;18977:7;:13::i;:::-;18952:38;;;;19001:10;19027:1;19014:15;;;;;19024:1;19021;19014:15;19001:28;;19049:1;19044:2;:6;19040:18;;;19057:1;19052:6;;;;19040:18;19074:2;19069:7;;;;19099:1;19095;:5;19087:44;;;;;-1:-1:-1;;;19087:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19149:16;19157:1;19160;19163;19149:7;:16::i;:::-;19142:23;18826:347;-1:-1:-1;;;;;;;18826:347:0:o;17667:420::-;17750:23;17776:69;17804:4;17776:69;;;;;;;;;;;;;;;;;17784:5;-1:-1:-1;;;;;17776:27:0;;;:69;;;;;:::i;:::-;17860:17;;17750:95;;-1:-1:-1;17860:21:0;17856:224;;18002:10;17991:30;;;;;;;;;;;;;;;-1:-1:-1;17991:30:0;17983:85;;;;-1:-1:-1;;;17983:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18118:210;18179:9;;;-1:-1:-1;;18235:1:0;18232;18225:25;18212:38;;18269:1;18265;:5;18261:9;;18290:1;18285:2;:6;18281:10;;18311:1;18306:2;:6;18302:18;;;18319:1;18314:6;;;;18302:18;18118:210;;;;;;:::o;18336:482::-;18442:7;18481:2;;;18477:6;;;18482:1;18477:6;18494:9;;;;;;;18519:4;18514:9;;;;;;;;;18554:4;18546;18545:5;;18544:14;;;;;18603:1;:9;;;18632:5;;;18628:9;;18623:14;18657:5;;;18653:9;;18648:14;18682:5;;;18678:9;;18673:14;18707:5;;;18703:9;;18698:14;18732:5;;;18728:9;;18723:14;18757:5;;;18753:9;;18748:14;18782:5;;;18778:9;;18773:14;;;18544;;18561:1;18544:18;18539:24;;;;18534:29;;;;18805:5;;18336:482;-1:-1:-1;;18336:482:0:o;4224:196::-;4327:12;4359:53;4382:6;4390:4;4396:1;4399:12;4359:22;:53::i;:::-;4352:60;4224:196;-1:-1:-1;;;;4224:196:0:o;5200:979::-;5330:12;5363:18;5374:6;5363:10;:18::i;:::-;5355:60;;;;;-1:-1:-1;;;5355:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5489:12;5503:23;5530:6;-1:-1:-1;;;;;5530:11:0;5550:8;5561:4;5530:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5530:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5488:78;;;;5581:7;5577:595;;;5612:10;-1:-1:-1;5605:17:0;;-1:-1:-1;5605:17:0;5577:595;5726:17;;:21;5722:439;;5989:10;5983:17;6050:15;6037:10;6033:2;6029:19;6022:44;5937:148;6125:20;;-1:-1:-1;;;6125:20:0;;;;;;;;;;;;;;;;;6132:12;;6125:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3397:233;3575:20;3614:8;;;3397:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://3d0a67c24556b530942daa471c1661b112a738d6c87984b35ab202d7361893ed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.