Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HectorBondStakeDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-12-07
*/
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
interface IOwnable {
function policy() external view returns (address);
function renounceManagement() external;
function pushManagement( address newOwner_ ) external;
function pullManagement() external;
}
contract Ownable is IOwnable {
address internal _owner;
address internal _newOwner;
event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
event OwnershipPulled(address indexed previousOwner, address indexed newOwner);
constructor () {
_owner = msg.sender;
emit OwnershipPushed( address(0), _owner );
}
function policy() public view override returns (address) {
return _owner;
}
modifier onlyPolicy() {
require( _owner == msg.sender, "Ownable: caller is not the owner" );
_;
}
function renounceManagement() public virtual override onlyPolicy() {
emit OwnershipPushed( _owner, address(0) );
_owner = address(0);
}
function pushManagement( address newOwner_ ) public virtual override onlyPolicy() {
require( newOwner_ != address(0), "Ownable: new owner is the zero address");
emit OwnershipPushed( _owner, newOwner_ );
_newOwner = newOwner_;
}
function pullManagement() public virtual override {
require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
emit OwnershipPulled( _owner, _newOwner );
_owner = _newOwner;
}
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
function sqrrt(uint256 a) internal pure returns (uint c) {
if (a > 3) {
c = a;
uint b = add( div( a, 2), 1 );
while (b < c) {
c = b;
b = div( add( div( a, b ), b), 2 );
}
} else if (a != 0) {
c = 1;
}
}
}
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
function addressToString(address _address) internal pure returns(string memory) {
bytes32 _bytes = bytes32(uint256(_address));
bytes memory HEX = "0123456789abcdef";
bytes memory _addr = new bytes(42);
_addr[0] = '0';
_addr[1] = 'x';
for(uint256 i = 0; i < 20; i++) {
_addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
_addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
}
return string(_addr);
}
}
interface IERC20 {
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
abstract contract ERC20 is IERC20 {
using SafeMath for uint256;
// TODO comment actual hash value.
bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
mapping (address => uint256) internal _balances;
mapping (address => mapping (address => uint256)) internal _allowances;
uint256 internal _totalSupply;
string internal _name;
string internal _symbol;
uint8 internal _decimals;
constructor (string memory name_, string memory symbol_, uint8 decimals_) {
_name = name_;
_symbol = symbol_;
_decimals = decimals_;
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view override returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint(address account_, uint256 ammount_) internal virtual {
require(account_ != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address( this ), account_, ammount_);
_totalSupply = _totalSupply.add(ammount_);
_balances[account_] = _balances[account_].add(ammount_);
emit Transfer(address( this ), account_, ammount_);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}
interface IERC2612Permit {
function permit(
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
}
library Counters {
using SafeMath for uint256;
struct Counter {
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
counter._value += 1;
}
function decrement(Counter storage counter) internal {
counter._value = counter._value.sub(1);
}
}
abstract contract ERC20Permit is ERC20, IERC2612Permit {
using Counters for Counters.Counter;
mapping(address => Counters.Counter) private _nonces;
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
bytes32 public DOMAIN_SEPARATOR;
constructor() {
uint256 chainID;
assembly {
chainID := chainid()
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name())),
keccak256(bytes("1")), // Version
chainID,
address(this)
)
);
}
function permit(
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual override {
require(block.timestamp <= deadline, "Permit: expired deadline");
bytes32 hashStruct =
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));
bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));
address signer = ecrecover(_hash, v, r, s);
require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");
_nonces[owner].increment();
_approve(owner, spender, amount);
}
function nonces(address owner) public view override returns (uint256) {
return _nonces[owner].current();
}
}
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
library FullMath {
function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) {
uint256 mm = mulmod(x, y, uint256(-1));
l = x * y;
h = mm - l;
if (mm < l) h -= 1;
}
function fullDiv(
uint256 l,
uint256 h,
uint256 d
) private pure returns (uint256) {
uint256 pow2 = d & -d;
d /= pow2;
l /= pow2;
l += h * ((-pow2) / pow2 + 1);
uint256 r = 1;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
return l * r;
}
function mulDiv(
uint256 x,
uint256 y,
uint256 d
) internal pure returns (uint256) {
(uint256 l, uint256 h) = fullMul(x, y);
uint256 mm = mulmod(x, y, d);
if (mm > l) h -= 1;
l -= mm;
require(h < d, 'FullMath::mulDiv: overflow');
return fullDiv(l, h, d);
}
}
library FixedPoint {
struct uq112x112 {
uint224 _x;
}
struct uq144x112 {
uint256 _x;
}
uint8 private constant RESOLUTION = 112;
uint256 private constant Q112 = 0x10000000000000000000000000000;
uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000;
uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)
function decode(uq112x112 memory self) internal pure returns (uint112) {
return uint112(self._x >> RESOLUTION);
}
function decode112with18(uq112x112 memory self) internal pure returns (uint) {
return uint(self._x) / 5192296858534827;
}
function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
require(denominator > 0, 'FixedPoint::fraction: division by zero');
if (numerator == 0) return FixedPoint.uq112x112(0);
if (numerator <= uint144(-1)) {
uint256 result = (numerator << RESOLUTION) / denominator;
require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
return uq112x112(uint224(result));
} else {
uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
return uq112x112(uint224(result));
}
}
}
interface ITreasury {
function deposit( uint _amount, address _token, uint _profit ) external returns ( uint send_ );
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 );
function claim( address _recipient ) external;
}
interface ISHEC {
function gonsForBalance( uint amount ) external view returns ( uint );
function balanceForGons( uint gons ) external view returns ( uint );
}
contract HectorBondStakeDepository 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 HEC; // intermediate reward token from treasury
address public immutable sHEC; // token given as payment for bond
address public immutable principle; // token used to create bond
address public immutable treasury; // mints HEC 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 stake and claim if no staking warmup
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
uint public totalPrinciple; // total principle bonded through this depository
string internal name_; //name of this bond
/* ======== 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 with gons
struct Bond {
uint gonsPayout; // sHEC gons remaining to be paid
uint hecPayout; //hec amount at the moment of bond
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 (
string memory _name,
address _HEC,
address _sHEC,
address _principle,
address _treasury,
address _DAO,
address _bondCalculator
) {
require( _HEC != address(0) );
HEC = _HEC;
require( _sHEC != address(0) );
sHEC = _sHEC;
require( _principle != address(0) );
principle = _principle;
require( _treasury != address(0) );
treasury = _treasury;
require( _DAO != address(0) );
DAO = _DAO;
// bondCalculator should be address(0) if not LP bond
bondCalculator = _bondCalculator;
isLiquidityBond = ( _bondCalculator != address(0) );
name_ = _name;
}
/**
* @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() {
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, MINPRICE }
/**
* @notice set parameters for new bonds
* @param _parameter PARAMETER
* @param _input uint
*/
function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() {
if ( _parameter == PARAMETER.VESTING ) { // 0
require( _input >= 10000, "Vesting must be longer than 3 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;
} else if ( _parameter == PARAMETER.MINPRICE ) { // 4
terms.minimumPrice = _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() {
adjustment = Adjust({
add: _addition,
rate: _increment,
target: _target,
buffer: _buffer,
lastBlock: block.number
});
}
/**
* @notice set contract for auto stake
* @param _staking address
*/
function setStaking( address _staking) external onlyPolicy() {
require( _staking != address(0) );
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 >= _bondPrice(), "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 HEC ( underflow protection )
require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage
// profits are calculated
uint fee = payout.mul( terms.fee ).div( 10000 );
uint profit = value.sub( payout ).sub( fee );
/**
principle is transferred in
approved and
deposited into the treasury, returning (_amount - profit) HEC
*/
IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount );
IERC20( principle ).approve( address( treasury ), _amount );
ITreasury( treasury ).deposit( _amount, principle, profit );
totalPrinciple=totalPrinciple.add(_amount);
if ( fee != 0 ) { // fee is transferred to dao
IERC20( HEC ).safeTransfer( DAO, fee );
}
// total debt is increased
totalDebt = totalDebt.add( value );
//TODO
//uint stakeAmount = totalBond.sub(fee);
IERC20( HEC ).approve( staking, payout );
IStaking( staking ).stake( payout, address(this) );
IStaking( staking ).claim( address(this) );
uint stakeGons=ISHEC(sHEC).gonsForBalance(payout);
// depositor info is stored
_bondInfo[ _depositor ] = Bond({
gonsPayout: _bondInfo[ _depositor ].gonsPayout.add( stakeGons ),
hecPayout: _bondInfo[ _depositor ].hecPayout.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, keep the parameter bool _stake for compatibility of redeem helper
* @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)
require ( percentVested >= 10000 ,"not yet fully vested") ; // if fully vested
delete _bondInfo[ _recipient ]; // delete user info
uint _amount = ISHEC(sHEC).balanceForGons(info.gonsPayout);
emit BondRedeemed( _recipient, _amount, 0 ); // emit bond data
IERC20( sHEC ).transfer( _recipient, _amount ); // pay user everything due
return _amount;
}
/* ======== INTERNAL HELPER FUNCTIONS ======== */
/**
* @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( HEC ).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 return bond info with latest sHEC balance calculated from gons
* @param _depositor address
* @return payout uint
* @return vesting uint
* @return lastBlock uint
* @return pricePaid uint
*/
function bondInfo(address _depositor) public view returns ( uint payout,uint vesting,uint lastBlock,uint pricePaid ) {
Bond memory info = _bondInfo[ _depositor ];
payout=ISHEC(sHEC).balanceForGons(info.gonsPayout);
vesting=info.vesting;
lastBlock=info.lastBlock;
pricePaid=info.pricePaid;
}
/**
* @notice calculate current ratio of debt to HEC supply
* @return debtRatio_ uint
*/
function debtRatio() public view returns ( uint debtRatio_ ) {
uint supply = IERC20( HEC ).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 HEC 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 = ISHEC(sHEC).balanceForGons(_bondInfo[ _depositor ].gonsPayout);
if ( percentVested >= 10000 ) {
pendingPayout_ = payout;
} else {
pendingPayout_ = 0;
}
}
/**
* @notice show the name of current bond
* @return _name string
*/
function name() public view returns (string memory _name) {
return name_;
}
/* ======= AUXILLIARY ======= */
/**
* @notice allow anyone to send lost tokens (excluding principle or HEC) to the DAO
* @return bool
*/
function recoverLostToken( address _token ) external returns ( bool ) {
require( _token != HEC );
require( _token != sHEC );
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
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_HEC","type":"address"},{"internalType":"address","name":"_sHEC","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":"HEC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_bondInfo","outputs":[{"internalType":"uint256","name":"gonsPayout","type":"uint256"},{"internalType":"uint256","name":"hecPayout","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":"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":"_depositor","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":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"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":[],"name":"sHEC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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 HectorBondStakeDepository.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"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","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":"totalPrinciple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101606040523480156200001257600080fd5b506040516200308138038062003081833981810160405260e08110156200003857600080fd5b81019080805160405193929190846401000000008211156200005957600080fd5b9083019060208201858111156200006f57600080fd5b82516401000000008111828201881017156200008a57600080fd5b82525081516020918201929091019080838360005b83811015620000b95781810151838201526020016200009f565b50505050905090810190601f168015620000e75780820380516001836020036101000a031916815260200191505b5060408181526020830151908301516060840151608085015160a086015160c090960151600080546001600160a01b031916331780825595995093975091959094909391926001600160a01b039290921691907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b0386166200017357600080fd5b6001600160601b0319606087901b166080526001600160a01b0385166200019957600080fd5b6001600160601b0319606086901b1660a0526001600160a01b038416620001bf57600080fd5b6001600160601b0319606085901b1660c0526001600160a01b038316620001e557600080fd5b6001600160601b0319606084901b1660e0526001600160a01b0382166200020b57600080fd5b6001600160601b0319606083811b82166101005282901b16610140526001600160a01b038116151560f81b6101205286516200024f9060129060208a01906200025d565b505050505050505062000309565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002955760008555620002e0565b82601f10620002b057805160ff1916838001178555620002e0565b82800160010185558215620002e0579182015b82811115620002e0578251825591602001919060010190620002c3565b50620002ee929150620002f2565b5090565b5b80821115620002ee5760008155600101620002f3565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160f81c6101405160601c612c83620003fe6000398061115f5280611bc65280611e4c5250806111315280611b9552806120715250806117655280611cb35280611d9952508061102552806113c352806115c752806116a9525080610677528061118e528061123552806113f2528061156e528061159852806116785280611bf55280611d575250806106ab5280610c325280610ced528061100152806119255280611d185280611f1352508061174352806117c65280611c8f5280611cd95280611fa752806120e55250612c836000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063839c278811610130578063c6b2c4cd116100b8578063d7ccfb0b1161007c578063d7ccfb0b1461064d578063e0176de814610655578063e392a2621461065d578063f5c2ab5b14610665578063fc7b9c181461066d57610227565b8063c6b2c4cd14610565578063cd1234b3146105b6578063cea55f5714610602578063d50256251461060a578063d79690601461064557610227565b8063904b3ece116100ff578063904b3ece1461050b5780639854278e1461051357806398fabd3a1461051b578063b4abccba14610523578063c5332b7c1461055d57610227565b8063839c2788146104a3578063844b5c7c146104ab5780638dbdbe6d146104b35780638ff39099146104e557610227565b806346f68ee9116101b35780635d0afda9116101825780635d0afda91461042d57806361d027b314610435578063715350081461043d578063759076e51461047e5780637927ebf81461048657610227565b806346f68ee9146103d15780634cf088d9146103f7578063507930ec146103ff5780635a96ac0a1461042557610227565b8063089208d8116101fa578063089208d81461030d5780631a3d0068146103175780631e321a0f146103485780631feed31f1461036e578063451ee4a11461039c57610227565b8063016a42841461022c57806301b88ee8146102505780630505c8c91461028857806306fdde0314610290575b600080fd5b610234610675565b604080516001600160a01b039092168252519081900360200190f35b6102766004803603602081101561026657600080fd5b50356001600160a01b0316610699565b60408051918252519081900360200190f35b610234610780565b610298610790565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d25781810151838201526020016102ba565b50505050905090810190601f1680156102ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610315610826565b005b6103156004803603608081101561032d57600080fd5b508035151590602081013590604081013590606001356108bd565b6103156004803603604081101561035e57600080fd5b5060ff8135169060200135610955565b6102766004803603604081101561038457600080fd5b506001600160a01b0381351690602001351515610b27565b6103a4610d9a565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b610315600480360360208110156103e757600080fd5b50356001600160a01b0316610db2565b610234610e9f565b6102766004803603602081101561041557600080fd5b50356001600160a01b0316610eae565b610315610f55565b610234610fff565b610234611023565b610315600480360360e081101561045357600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611047565b6102766110e6565b6102766004803603602081101561049c57600080fd5b5035611101565b610276611127565b61027661112d565b610276600480360360608110156104c957600080fd5b50803590602081013590604001356001600160a01b03166112c6565b610315600480360360208110156104fb57600080fd5b50356001600160a01b0316611b0f565b610276611b91565b610234611c8d565b610234611cb1565b6105496004803603602081101561053957600080fd5b50356001600160a01b0316611cd5565b604080519115158252519081900360200190f35b610234611e4a565b61058b6004803603602081101561057b57600080fd5b50356001600160a01b0316611e6e565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105dc600480360360208110156105cc57600080fd5b50356001600160a01b0316611e9d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610276611fa2565b61061261205a565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61054961206f565b610276612093565b6102766120d2565b61027661216e565b6102766121b3565b6102766121b9565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806106a583610eae565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637965d56d600e6000876001600160a01b03166001600160a01b03168152602001908152602001600020600001546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561073557600080fd5b505afa158015610749573d6000803e3d6000fd5b505050506040513d602081101561075f57600080fd5b50519050612710821061077457809250610779565b600092505b5050919050565b6000546001600160a01b03165b90565b60128054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b6000546001600160a01b03163314610873576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461090a576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6040805160a08101825294151580865260208601859052908501839052606085018290524360809095018590526009805460ff19169091179055600a92909255600b55600c55600d55565b6000546001600160a01b031633146109a2576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b60008260048111156109b057fe5b1415610a01576127108110156109f75760405162461bcd60e51b8152600401808060200182810382526023815260200180612bbe6023913960400191505060405180910390fd5b6004819055610b23565b6001826004811115610a0f57fe5b1415610a76576103e8811115610a6c576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6006819055610b23565b6002826004811115610a8457fe5b1415610aeb57612710811115610ae1576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6007819055610b23565b6003826004811115610af957fe5b1415610b09576008819055610b23565b6004826004811115610b1757fe5b1415610b235760058190555b5050565b6000610b31612aed565b506001600160a01b0383166000908152600e60209081526040808320815160a081018352815481526001820154938101939093526002810154918301919091526003810154606083015260040154608082015290610b8e85610eae565b9050612710811015610bde576040805162461bcd60e51b81526020600482015260146024820152731b9bdd081e595d08199d5b1b1e481d995cdd195960621b604482015290519081900360640190fd5b6001600160a01b038086166000908152600e60209081526040808320838155600181018490556002810184905560038101849055600490810184905586518251637965d56d60e01b815291820152905192937f00000000000000000000000000000000000000000000000000000000000000001692637965d56d92602480840193919291829003018186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d6020811015610ca057600080fd5b5051604080518281526000602082015281519293506001600160a01b038916927f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b509093505050505b92915050565b600954600a54600b54600c54600d5460ff9094169385565b6000546001600160a01b03163314610dff576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6001600160a01b038116610e445760405162461bcd60e51b8152600401808060200182810382526026815260200180612b2f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610eb8612aed565b506001600160a01b0382166000908152600e60209081526040808320815160a081018352815481526001820154938101939093526002810154918301919091526003810154606083018190526004909101546080830152909190610f1d9043906121bf565b60408301519091508015610f4857610f4181610f3b84612710612208565b90612261565b9350610f4d565b600093505b505050919050565b6001546001600160a01b03163314610f9e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612b556022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611094576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a001829052600396909655600494909455600592909255600655600755600855600f5543601055565b60006110fc6110f361216e565b600f54906121bf565b905090565b6000610d94662386f26fc10000610f3b6111228561111d612093565b6122a3565b61241a565b60115481565b60007f00000000000000000000000000000000000000000000000000000000000000001561122b576112246064610f3b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156111ea57600080fd5b505afa1580156111fe573d6000803e3d6000fd5b505050506040513d602081101561121457600080fd5b505161121e612093565b90612208565b905061078d565b6110fc6064610f3b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561128c57600080fd5b505afa1580156112a0573d6000803e3d6000fd5b505050506040513d60208110156112b657600080fd5b505160ff16600a0a61121e612093565b60006001600160a01b038216611315576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b61131d612432565b600854600f54111561136d576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b600061137761112d565b9050611381612446565b8410156113bf5760405162461bcd60e51b8152600401808060200182810382526023815260200180612c016023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50519050600061148f82611101565b9050629896808110156114da576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6114e26120d2565b811115611527576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611547612710610f3b6003600401548561220890919063ffffffff16565b9050600061155f8261155986866121bf565b906121bf565b90506115966001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308c612488565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561162d57600080fd5b505af1158015611641573d6000803e3d6000fd5b505050506040513d602081101561165757600080fd5b50506040805163bc157ac160e01b8152600481018b90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b1580156116f457600080fd5b505af1158015611708573d6000803e3d6000fd5b505050506040513d602081101561171e57600080fd5b505060115461172d908a6124e8565b601155811561178a5761178a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000084612542565b600f5461179790856124e8565b600f556002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810186905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b15801561181157600080fd5b505af1158015611825573d6000803e3d6000fd5b505050506040513d602081101561183b57600080fd5b505060025460408051637acb775760e01b81526004810186905230602482015290516001600160a01b0390921691637acb7757916044808201926020929091908290030181600087803b15801561189157600080fd5b505af11580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b505060025460408051630f41a04d60e11b815230600482015290516001600160a01b0390921691631e83409a9160248082019260009290919082900301818387803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631bd39674856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d60208110156119b157600080fd5b50516040805160a0810182526001600160a01b038b166000908152600e60205291909120549192509081906119e690846124e8565b81526001600160a01b038a166000908152600e6020908152604090912060010154910190611a1490876124e8565b81526004805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600e84528190208651815592860151600184015585015160028301559284015160038201556080909301519281019290925590548791611a82916124e8565b604080518d8152905187917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611ac0611fa2565b611ac8612446565b611ad061112d565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a4611b01612599565b509198975050505050505050565b6000546001600160a01b03163314611b5c576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6001600160a01b038116611b6f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60007f000000000000000000000000000000000000000000000000000000000000000015611c8557611224633b9aca00610f3b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c5157600080fd5b505afa158015611c65573d6000803e3d6000fd5b505050506040513d6020811015611c7b57600080fd5b505161121e611fa2565b611224611fa2565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d1657600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d5557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611d9457600080fd5b611e427f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e0557600080fd5b505afa158015611e19573d6000803e3d6000fd5b505050506040513d6020811015611e2f57600080fd5b50516001600160a01b0385169190612542565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b600080600080611eab612aed565b506001600160a01b038086166000908152600e6020908152604091829020825160a08101845281548082526001830154828501526002830154828601526003830154606083015260049283015460808301528451637965d56d60e01b815292830152925192937f00000000000000000000000000000000000000000000000000000000000000001692637965d56d92602480840193919291829003018186803b158015611f5757600080fd5b505afa158015611f6b573d6000803e3d6000fd5b505050506040513d6020811015611f8157600080fd5b50516040820151606083015160809093015191989097509195509350915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ffe57600080fd5b505afa158015612012573d6000803e3d6000fd5b505050506040513d602081101561202857600080fd5b50519050612054670de0b6b3a7640000610f3b61112261204e633b9aca0061121e6110e6565b856122a3565b91505090565b60035460045460055460065460075460085486565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006120be62989680610f3b633b9aca006120b86120af611fa2565b60035490612208565b906124e8565b60055490915081101561078d575060055490565b60006110fc620186a0610f3b60038001547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561213c57600080fd5b505afa158015612150573d6000803e3d6000fd5b505050506040513d602081101561216657600080fd5b505190612208565b600080612186601054436121bf90919063ffffffff16565b600454600f5491925061219d91610f3b9084612208565b9150600f548211156121af57600f5491505b5090565b60105481565b600f5481565b600061220183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612679565b9392505050565b60008261221757506000610d94565b8282028284828161222457fe5b04146122015760405162461bcd60e51b8152600401808060200182810382526021815260200180612b9d6021913960400191505060405180910390fd5b600061220183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612710565b6122ab612b1c565b600082116122ea5760405162461bcd60e51b8152600401808060200182810382526026815260200180612b776026913960400191505060405180910390fd5b826123045750604080516020810190915260008152610d94565b71ffffffffffffffffffffffffffffffffffff83116123ab57600082607085901b8161232c57fe5b0490506001600160e01b0381111561238b576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610d94565b60006123bc84600160701b85612775565b90506001600160e01b0381111561238b576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b61243d6110f361216e565b600f5543601055565b600061246262989680610f3b633b9aca006120b86120af611fa2565b600554909150811015612478575060055461078d565b6005541561078d57600060055590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526124e2908590612815565b50505050565b600082820183811015612201576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612594908490612815565b505050565b600c54600d546000916125ac91906124e8565b600a54909150158015906125c05750804310155b156126765760035460095460ff16156125fa57600a546003546125e2916124e8565b6003819055600b54116125f5576000600a555b61261c565b600a54600354612609916121bf565b6003819055600b541061261c576000600a555b43600d55600354600a546009546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081848411156127085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361275f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156126cd5781810151838201526020016126b5565b50600083858161276b57fe5b0495945050505050565b600080600061278486866128c6565b915091506000848061279257fe5b8688099050828111156127a6576001820391505b80830392508482106127ff576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b61280a8383876128f3565b979650505050505050565b606061286a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129639092919063ffffffff16565b8051909150156125945780806020019051602081101561288957600080fd5b50516125945760405162461bcd60e51b815260040180806020018281038252602a815260200180612c24602a913960400191505060405180910390fd5b60008080600019848609905083850292508281039150828110156128eb576001820391505b509250929050565b6000818103821680838161290357fe5b04925080858161290f57fe5b04945080816000038161291e57fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b6060612972848460008561297a565b949350505050565b606061298585612ae7565b6129d6576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612a155780518252601f1990920191602091820191016129f6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a77576040519150601f19603f3d011682016040523d82523d6000602084013e612a7c565b606091505b50915091508115612a905791506129729050565b805115612aa05780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156126cd5781810151838201526020016126b5565b3b151590565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7756657374696e67206d757374206265206c6f6e676572207468616e203320686f7572734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d61782070726963655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212206c3e285f8ee8c7141f7bb97a7bd47d23eb577c229f4dce81f660ef1cbb88c7ce64736f6c6343000705003300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d7490000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b448000000000000000000000000875c2540dae90c2153ce204ad41fc51a69aabae4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054441493434000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063839c278811610130578063c6b2c4cd116100b8578063d7ccfb0b1161007c578063d7ccfb0b1461064d578063e0176de814610655578063e392a2621461065d578063f5c2ab5b14610665578063fc7b9c181461066d57610227565b8063c6b2c4cd14610565578063cd1234b3146105b6578063cea55f5714610602578063d50256251461060a578063d79690601461064557610227565b8063904b3ece116100ff578063904b3ece1461050b5780639854278e1461051357806398fabd3a1461051b578063b4abccba14610523578063c5332b7c1461055d57610227565b8063839c2788146104a3578063844b5c7c146104ab5780638dbdbe6d146104b35780638ff39099146104e557610227565b806346f68ee9116101b35780635d0afda9116101825780635d0afda91461042d57806361d027b314610435578063715350081461043d578063759076e51461047e5780637927ebf81461048657610227565b806346f68ee9146103d15780634cf088d9146103f7578063507930ec146103ff5780635a96ac0a1461042557610227565b8063089208d8116101fa578063089208d81461030d5780631a3d0068146103175780631e321a0f146103485780631feed31f1461036e578063451ee4a11461039c57610227565b8063016a42841461022c57806301b88ee8146102505780630505c8c91461028857806306fdde0314610290575b600080fd5b610234610675565b604080516001600160a01b039092168252519081900360200190f35b6102766004803603602081101561026657600080fd5b50356001600160a01b0316610699565b60408051918252519081900360200190f35b610234610780565b610298610790565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d25781810151838201526020016102ba565b50505050905090810190601f1680156102ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610315610826565b005b6103156004803603608081101561032d57600080fd5b508035151590602081013590604081013590606001356108bd565b6103156004803603604081101561035e57600080fd5b5060ff8135169060200135610955565b6102766004803603604081101561038457600080fd5b506001600160a01b0381351690602001351515610b27565b6103a4610d9a565b60408051951515865260208601949094528484019290925260608401526080830152519081900360a00190f35b610315600480360360208110156103e757600080fd5b50356001600160a01b0316610db2565b610234610e9f565b6102766004803603602081101561041557600080fd5b50356001600160a01b0316610eae565b610315610f55565b610234610fff565b610234611023565b610315600480360360e081101561045357600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611047565b6102766110e6565b6102766004803603602081101561049c57600080fd5b5035611101565b610276611127565b61027661112d565b610276600480360360608110156104c957600080fd5b50803590602081013590604001356001600160a01b03166112c6565b610315600480360360208110156104fb57600080fd5b50356001600160a01b0316611b0f565b610276611b91565b610234611c8d565b610234611cb1565b6105496004803603602081101561053957600080fd5b50356001600160a01b0316611cd5565b604080519115158252519081900360200190f35b610234611e4a565b61058b6004803603602081101561057b57600080fd5b50356001600160a01b0316611e6e565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105dc600480360360208110156105cc57600080fd5b50356001600160a01b0316611e9d565b604080519485526020850193909352838301919091526060830152519081900360800190f35b610276611fa2565b61061261205a565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61054961206f565b610276612093565b6102766120d2565b61027661216e565b6102766121b3565b6102766121b9565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b6000806106a583610eae565b905060007f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f606001600160a01b0316637965d56d600e6000876001600160a01b03166001600160a01b03168152602001908152602001600020600001546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561073557600080fd5b505afa158015610749573d6000803e3d6000fd5b505050506040513d602081101561075f57600080fd5b50519050612710821061077457809250610779565b600092505b5050919050565b6000546001600160a01b03165b90565b60128054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b5050505050905090565b6000546001600160a01b03163314610873576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461090a576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6040805160a08101825294151580865260208601859052908501839052606085018290524360809095018590526009805460ff19169091179055600a92909255600b55600c55600d55565b6000546001600160a01b031633146109a2576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b60008260048111156109b057fe5b1415610a01576127108110156109f75760405162461bcd60e51b8152600401808060200182810382526023815260200180612bbe6023913960400191505060405180910390fd5b6004819055610b23565b6001826004811115610a0f57fe5b1415610a76576103e8811115610a6c576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b6006819055610b23565b6002826004811115610a8457fe5b1415610aeb57612710811115610ae1576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b6007819055610b23565b6003826004811115610af957fe5b1415610b09576008819055610b23565b6004826004811115610b1757fe5b1415610b235760058190555b5050565b6000610b31612aed565b506001600160a01b0383166000908152600e60209081526040808320815160a081018352815481526001820154938101939093526002810154918301919091526003810154606083015260040154608082015290610b8e85610eae565b9050612710811015610bde576040805162461bcd60e51b81526020600482015260146024820152731b9bdd081e595d08199d5b1b1e481d995cdd195960621b604482015290519081900360640190fd5b6001600160a01b038086166000908152600e60209081526040808320838155600181018490556002810184905560038101849055600490810184905586518251637965d56d60e01b815291820152905192937f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f601692637965d56d92602480840193919291829003018186803b158015610c7657600080fd5b505afa158015610c8a573d6000803e3d6000fd5b505050506040513d6020811015610ca057600080fd5b5051604080518281526000602082015281519293506001600160a01b038916927f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a27f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f606001600160a01b031663a9059cbb87836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b509093505050505b92915050565b600954600a54600b54600c54600d5460ff9094169385565b6000546001600160a01b03163314610dff576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6001600160a01b038116610e445760405162461bcd60e51b8152600401808060200182810382526026815260200180612b2f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610eb8612aed565b506001600160a01b0382166000908152600e60209081526040808320815160a081018352815481526001820154938101939093526002810154918301919091526003810154606083018190526004909101546080830152909190610f1d9043906121bf565b60408301519091508015610f4857610f4181610f3b84612710612208565b90612261565b9350610f4d565b600093505b505050919050565b6001546001600160a01b03163314610f9e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612b556022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f6081565b7f0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b44881565b6000546001600160a01b03163314611094576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905260a001829052600396909655600494909455600592909255600655600755600855600f5543601055565b60006110fc6110f361216e565b600f54906121bf565b905090565b6000610d94662386f26fc10000610f3b6111228561111d612093565b6122a3565b61241a565b60115481565b60007f00000000000000000000000000000000000000000000000000000000000000001561122b576112246064610f3b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156111ea57600080fd5b505afa1580156111fe573d6000803e3d6000fd5b505050506040513d602081101561121457600080fd5b505161121e612093565b90612208565b905061078d565b6110fc6064610f3b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561128c57600080fd5b505afa1580156112a0573d6000803e3d6000fd5b505050506040513d60208110156112b657600080fd5b505160ff16600a0a61121e612093565b60006001600160a01b038216611315576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b61131d612432565b600854600f54111561136d576040805162461bcd60e51b815260206004820152601460248201527313585e0818d85c1858da5d1e481c995858da195960621b604482015290519081900360640190fd5b600061137761112d565b9050611381612446565b8410156113bf5760405162461bcd60e51b8152600401808060200182810382526023815260200180612c016023913960400191505060405180910390fd5b60007f0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b4486001600160a01b0316631eec5a9a7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f886040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50519050600061148f82611101565b9050629896808110156114da576040805162461bcd60e51b815260206004820152600e60248201526d109bdb99081d1bdbc81cdb585b1b60921b604482015290519081900360640190fd5b6114e26120d2565b811115611527576040805162461bcd60e51b815260206004820152600e60248201526d426f6e6420746f6f206c6172676560901b604482015290519081900360640190fd5b6000611547612710610f3b6003600401548561220890919063ffffffff16565b9050600061155f8261155986866121bf565b906121bf565b90506115966001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f1633308c612488565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b031663095ea7b37f0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b4488b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561162d57600080fd5b505af1158015611641573d6000803e3d6000fd5b505050506040513d602081101561165757600080fd5b50506040805163bc157ac160e01b8152600481018b90526001600160a01b037f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f811660248301526044820184905291517f0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b4489092169163bc157ac1916064808201926020929091908290030181600087803b1580156116f457600080fd5b505af1158015611708573d6000803e3d6000fd5b505050506040513d602081101561171e57600080fd5b505060115461172d908a6124e8565b601155811561178a5761178a6001600160a01b037f000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d749167f000000000000000000000000875c2540dae90c2153ce204ad41fc51a69aabae484612542565b600f5461179790856124e8565b600f556002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810186905290517f000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d7499092169163095ea7b3916044808201926020929091908290030181600087803b15801561181157600080fd5b505af1158015611825573d6000803e3d6000fd5b505050506040513d602081101561183b57600080fd5b505060025460408051637acb775760e01b81526004810186905230602482015290516001600160a01b0390921691637acb7757916044808201926020929091908290030181600087803b15801561189157600080fd5b505af11580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b505060025460408051630f41a04d60e11b815230600482015290516001600160a01b0390921691631e83409a9160248082019260009290919082900301818387803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050505060007f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f606001600160a01b0316631bd39674856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d60208110156119b157600080fd5b50516040805160a0810182526001600160a01b038b166000908152600e60205291909120549192509081906119e690846124e8565b81526001600160a01b038a166000908152600e6020908152604090912060010154910190611a1490876124e8565b81526004805460208084019190915243604080850182905260609485018c90526001600160a01b038e166000908152600e84528190208651815592860151600184015585015160028301559284015160038201556080909301519281019290925590548791611a82916124e8565b604080518d8152905187917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611ac0611fa2565b611ac8612446565b611ad061112d565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a4611b01612599565b509198975050505050505050565b6000546001600160a01b03163314611b5c576040805162461bcd60e51b81526020600482018190526024820152600080516020612be1833981519152604482015290519081900360640190fd5b6001600160a01b038116611b6f57600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60007f000000000000000000000000000000000000000000000000000000000000000015611c8557611224633b9aca00610f3b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c5157600080fd5b505afa158015611c65573d6000803e3d6000fd5b505050506040513d6020811015611c7b57600080fd5b505161121e611fa2565b611224611fa2565b7f000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d74981565b7f000000000000000000000000875c2540dae90c2153ce204ad41fc51a69aabae481565b60007f000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d7496001600160a01b0316826001600160a01b03161415611d1657600080fd5b7f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f606001600160a01b0316826001600160a01b03161415611d5557600080fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316826001600160a01b03161415611d9457600080fd5b611e427f000000000000000000000000875c2540dae90c2153ce204ad41fc51a69aabae4836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e0557600080fd5b505afa158015611e19573d6000803e3d6000fd5b505050506040513d6020811015611e2f57600080fd5b50516001600160a01b0385169190612542565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b600080600080611eab612aed565b506001600160a01b038086166000908152600e6020908152604091829020825160a08101845281548082526001830154828501526002830154828601526003830154606083015260049283015460808301528451637965d56d60e01b815292830152925192937f0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f601692637965d56d92602480840193919291829003018186803b158015611f5757600080fd5b505afa158015611f6b573d6000803e3d6000fd5b505050506040513d6020811015611f8157600080fd5b50516040820151606083015160809093015191989097509195509350915050565b6000807f000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d7496001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ffe57600080fd5b505afa158015612012573d6000803e3d6000fd5b505050506040513d602081101561202857600080fd5b50519050612054670de0b6b3a7640000610f3b61112261204e633b9aca0061121e6110e6565b856122a3565b91505090565b60035460045460055460065460075460085486565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006120be62989680610f3b633b9aca006120b86120af611fa2565b60035490612208565b906124e8565b60055490915081101561078d575060055490565b60006110fc620186a0610f3b60038001547f000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d7496001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561213c57600080fd5b505afa158015612150573d6000803e3d6000fd5b505050506040513d602081101561216657600080fd5b505190612208565b600080612186601054436121bf90919063ffffffff16565b600454600f5491925061219d91610f3b9084612208565b9150600f548211156121af57600f5491505b5090565b60105481565b600f5481565b600061220183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612679565b9392505050565b60008261221757506000610d94565b8282028284828161222457fe5b04146122015760405162461bcd60e51b8152600401808060200182810382526021815260200180612b9d6021913960400191505060405180910390fd5b600061220183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612710565b6122ab612b1c565b600082116122ea5760405162461bcd60e51b8152600401808060200182810382526026815260200180612b776026913960400191505060405180910390fd5b826123045750604080516020810190915260008152610d94565b71ffffffffffffffffffffffffffffffffffff83116123ab57600082607085901b8161232c57fe5b0490506001600160e01b0381111561238b576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610d94565b60006123bc84600160701b85612775565b90506001600160e01b0381111561238b576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b61243d6110f361216e565b600f5543601055565b600061246262989680610f3b633b9aca006120b86120af611fa2565b600554909150811015612478575060055461078d565b6005541561078d57600060055590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526124e2908590612815565b50505050565b600082820183811015612201576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612594908490612815565b505050565b600c54600d546000916125ac91906124e8565b600a54909150158015906125c05750804310155b156126765760035460095460ff16156125fa57600a546003546125e2916124e8565b6003819055600b54116125f5576000600a555b61261c565b600a54600354612609916121bf565b6003819055600b541061261c576000600a555b43600d55600354600a546009546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a9181900360800190a1505b50565b600081848411156127085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361275f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156126cd5781810151838201526020016126b5565b50600083858161276b57fe5b0495945050505050565b600080600061278486866128c6565b915091506000848061279257fe5b8688099050828111156127a6576001820391505b80830392508482106127ff576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b61280a8383876128f3565b979650505050505050565b606061286a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129639092919063ffffffff16565b8051909150156125945780806020019051602081101561288957600080fd5b50516125945760405162461bcd60e51b815260040180806020018281038252602a815260200180612c24602a913960400191505060405180910390fd5b60008080600019848609905083850292508281039150828110156128eb576001820391505b509250929050565b6000818103821680838161290357fe5b04925080858161290f57fe5b04945080816000038161291e57fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b6060612972848460008561297a565b949350505050565b606061298585612ae7565b6129d6576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612a155780518252601f1990920191602091820191016129f6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612a77576040519150601f19603f3d011682016040523d82523d6000602084013e612a7c565b606091505b50915091508115612a905791506129729050565b805115612aa05780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156126cd5781810151838201526020016126b5565b3b151590565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7756657374696e67206d757374206265206c6f6e676572207468616e203320686f7572734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572536c697070616765206c696d69743a206d6f7265207468616e206d61782070726963655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212206c3e285f8ee8c7141f7bb97a7bd47d23eb577c229f4dce81f660ef1cbb88c7ce64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d7490000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f600000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b448000000000000000000000000875c2540dae90c2153ce204ad41fc51a69aabae4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054441493434000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): DAI44
Arg [1] : _HEC (address): 0xA634fd53F1129a410A3DA6DF586d2eE02541D749
Arg [2] : _sHEC (address): 0x1113320c50aB4eBA3cFe7A396D9c1Bdb6B8C2f60
Arg [3] : _principle (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [4] : _treasury (address): 0x6f788a46aBD6827F84B096F7Dff516eB4172b448
Arg [5] : _DAO (address): 0x875c2540Dae90c2153Ce204ad41fc51a69AABaE4
Arg [6] : _bondCalculator (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 000000000000000000000000a634fd53f1129a410a3da6df586d2ee02541d749
Arg [2] : 0000000000000000000000001113320c50ab4eba3cfe7a396d9c1bdb6b8c2f60
Arg [3] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [4] : 0000000000000000000000006f788a46abd6827f84b096f7dff516eb4172b448
Arg [5] : 000000000000000000000000875c2540dae90c2153ce204ad41fc51a69aabae4
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 4441493434000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21429:17269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22227:34;;;:::i;:::-;;;;-1:-1:-1;;;;;22227:34:0;;;;;;;;;;;;;;37617:394;;;;;;;;;;;;;;;;-1:-1:-1;37617:394:0;-1:-1:-1;;;;;37617:394:0;;:::i;:::-;;;;;;;;;;;;;;;;693:89;;;:::i;38118:::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;918:158;;;:::i;:::-;;27355:361;;;;;;;;;;;;;;;;-1:-1:-1;27355:361:0;;;;;;;;;;;;;;;;;;;:::i;26341:818::-;;;;;;;;;;;;;;;;-1:-1:-1;26341:818:0;;;;;;;;;:::i;31085:668::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31085:668:0;;;;;;;;;;:::i;22755:24::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;-1:-1:-1;1084:260:0;-1:-1:-1;;;;;1084:260:0;;:::i;22626:22::-;;;:::i;37017:428::-;;;;;;;;;;;;;;;;-1:-1:-1;37017:428:0;-1:-1:-1;;;;;37017:428:0;;:::i;1356:221::-;;;:::i;22156:29::-;;;:::i;22297:33::-;;;:::i;25500:585::-;;;;;;;;;;;;;;;;-1:-1:-1;25500:585:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36360:106::-;;;:::i;33428:161::-;;;;;;;;;;;;;;;;-1:-1:-1;33428:161:0;;:::i;23065:26::-;;;:::i;34532:331::-;;;:::i;28191:2676::-;;;;;;;;;;;;;;;;-1:-1:-1;28191:2676:0;;;;;;;;;;;-1:-1:-1;;;;;28191:2676:0;;:::i;27820:142::-;;;;;;;;;;;;;;;;-1:-1:-1;27820:142:0;-1:-1:-1;;;;;27820:142:0;;:::i;35986:275::-;;;:::i;22078:28::-;;;:::i;22374:::-;;;:::i;38391:304::-;;;;;;;;;;;;;;;;-1:-1:-1;38391:304:0;-1:-1:-1;;;;;38391:304:0;;:::i;:::-;;;;;;;;;;;;;;;;;;22545:39;;;:::i;22821:43::-;;;;;;;;;;;;;;;;-1:-1:-1;22821:43:0;-1:-1:-1;;;;;22821:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35131:340;;;;;;;;;;;;;;;;-1:-1:-1;35131:340:0;-1:-1:-1;;;;;35131:340:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35595:270;;;:::i;22700:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22446:37;;;:::i;33694:261::-;;;:::i;33159:140::-;;;:::i;36568:286::-;;;:::i;22997:21::-;;;:::i;22915:::-;;;:::i;22227:34::-;;;:::o;37617:394::-;37689:19;37722:18;37743:30;37761:10;37743:16;:30::i;:::-;37722:51;;37784:11;37804:4;-1:-1:-1;;;;;37798:26:0;;37825:9;:23;37836:10;-1:-1:-1;;;;;37825:23:0;-1:-1:-1;;;;;37825:23:0;;;;;;;;;;;;:34;;;37798:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37798:62:0;;-1:-1:-1;37895:5:0;37878:22;;37873:131;;37935:6;37918:23;;37873:131;;;37991:1;37974:18;;37873:131;37617:394;;;;;:::o;693:89::-;741:7;768:6;-1:-1:-1;;;;;768:6:0;693:89;;:::o;38118:::-;38194:5;38187:12;;;;;;;;-1:-1:-1;;38187:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38155:19;;38187:12;;38194:5;;38187:12;;38194:5;38187:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38118:89;:::o;918:158::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;1034:1:::1;1018:6:::0;;1001:37:::1;::::0;-1:-1:-1;;;;;1018:6:0;;::::1;::::0;1001:37:::1;::::0;1034:1;;1001:37:::1;1066:1;1049:19:::0;;-1:-1:-1;;;;;;1049:19:0::1;::::0;;918:158::o;27355:361::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;27531:177:::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;27684:12:::1;27531:177:::0;;;;;;;27518:10:::1;:190:::0;;-1:-1:-1;;27518:190:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;27355:361::o;26341:818::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;26453:17:::1;26439:10;:31;;;;;;;;;26434:718;;;26512:5;26502:6;:15;;26493:65;;;;-1:-1:-1::0;;;26493:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:17:::0;:26;;;26434:718:::1;;;26636:16;26622:10;:30;;;;;;;;;26617:535;;;26694:4;26684:6;:14;;26675:61;;;::::0;;-1:-1:-1;;;26675:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26751:15:::0;:24;;;26617:535:::1;;;26812:13;26798:10;:27;;;;;;;;;26793:359;;;26867:5;26857:6;:15;;26848:58;;;::::0;;-1:-1:-1;;;26848:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26921:9:::0;:18;;;26793:359:::1;;;26976:14;26962:10;:28;;;;;;;;;26957:195;;;27013:13:::0;:22;;;26957:195:::1;;;27072:18;27058:10;:32;;;;;;;;;27053:99;;;27113:18:::0;:27;;;27053:99:::1;26341:818:::0;;:::o;31085:668::-;31154:4;31180:16;;:::i;:::-;-1:-1:-1;;;;;;31199:23:0;;;;;;:9;:23;;;;;;;;31180:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31254:30;31210:10;31254:16;:30::i;:::-;31233:51;;31384:5;31367:13;:22;;31357:57;;;;;-1:-1:-1;;;31357:57:0;;;;;;;;;;;;-1:-1:-1;;;31357:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31452:23:0;;;;;;;:9;:23;;;;;;;;31445:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;31548:15;;31521:43;;-1:-1:-1;;;31521:43:0;;;;;;;;31452:23;;31527:4;31521:26;;;;:43;;;;;31452:23;;31521:43;;;;;;:26;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31521:43:0;31580:38;;;;;;31615:1;31521:43;31580:38;;;;;31521:43;;-1:-1:-1;;;;;;31580:38:0;;;;;;;;;;;;;;31655:4;-1:-1:-1;;;;;31647:23:0;;31672:10;31684:7;31647:46;;;;;;;;;;;;;-1:-1:-1;;;;;31647:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31738:7:0;;-1:-1:-1;;;;31085:668:0;;;;;:::o;22755:24::-;;;;;;;;;;;;;;;;;:::o;1084:260::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1186:23:0;::::1;1177:75;;;;-1:-1:-1::0;;;1177:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:6;::::0;;1268:36:::1;::::0;-1:-1:-1;;;;;1268:36:0;;::::1;::::0;1285:6;::::1;::::0;1268:36:::1;::::0;::::1;1315:9;:21:::0;;-1:-1:-1;;;;;;1315:21:0::1;-1:-1:-1::0;;;;;1315:21:0;;;::::1;::::0;;;::::1;::::0;;1084:260::o;22626:22::-;;;-1:-1:-1;;;;;22626:22:0;;:::o;37017:428::-;37087:19;37120:16;;:::i;:::-;-1:-1:-1;;;;;;37139:23:0;;;;;;:9;:23;;;;;;;;37120:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37139:23;37196:34;;:12;;:16;:34::i;:::-;37256:12;;;;37173:57;;-1:-1:-1;37286:11:0;;37281:157;;37332:43;37366:7;37332:28;:15;37353:5;37332:19;:28::i;:::-;:32;;:43::i;:::-;37315:60;;37281:157;;;37425:1;37408:18;;37281:157;37017:428;;;;;;:::o;1356:221::-;1440:9;;-1:-1:-1;;;;;1440:9:0;1426:10;:23;1417:71;;;;-1:-1:-1;;;1417:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:9;;;1521:6;;1504:36;;-1:-1:-1;;;;;1529:9:0;;;;1521:6;;;;1504:36;;;1560:9;;;1551:18;;-1:-1:-1;;;;;;1551:18:0;-1:-1:-1;;;;;1560:9:0;;;1551:18;;;;;;1356:221::o;22156:29::-;;;:::o;22297:33::-;;;:::o;25500:585::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;25766:241:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;25758:5:::1;:249:::0;;;;;;;;;;;;;;;;;;;;26018:9:::1;:24:::0;26065:12:::1;26053:9;:24:::0;25500:585::o;36360:106::-;36405:4;36430:28;36445:11;:9;:11::i;:::-;36430:9;;;:13;:28::i;:::-;36423:35;;36360:106;:::o;33428:161::-;33484:4;33509:72;33575:4;33509:60;:42;33530:6;33538:11;:9;:11::i;:::-;33509:19;:42::i;:::-;:58;:60::i;23065:26::-;;;;:::o;34532:331::-;34580:11;34609:15;34605:251;;;34651:85;34731:3;34651:74;34685:14;-1:-1:-1;;;;;34668:42:0;;34712:9;34668:55;;;;;;;;;;;;;-1:-1:-1;;;;;34668:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34668:55:0;34651:11;:9;:11::i;:::-;:15;;:74::i;:85::-;34642:94;;34605:251;;;34778:66;34839:3;34778:55;34809:9;-1:-1:-1;;;;;34801:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34801:30:0;34795:36;;:2;:36;34778:11;:9;:11::i;28191:2676::-;28313:4;-1:-1:-1;;;;;28340:24:0;;28331:54;;;;;-1:-1:-1;;;28331:54:0;;;;;;;;;;;;-1:-1:-1;;;28331:54:0;;;;;;;;;;;;;;;28398:11;:9;:11::i;:::-;28442:13;;28429:9;;:26;;28420:61;;;;;-1:-1:-1;;;28420:61:0;;;;;;;;;;;;-1:-1:-1;;;28420:61:0;;;;;;;;;;;;;;;28502:15;28520:16;:14;:16::i;:::-;28502:34;;28638:12;:10;:12::i;:::-;28625:9;:25;;28616:75;;;;-1:-1:-1;;;28616:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28727:10;28751:8;-1:-1:-1;;;;;28740:29:0;;28771:9;28782:7;28740:51;;;;;;;;;;;;;-1:-1:-1;;;;;28740:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28740:51:0;;-1:-1:-1;28802:11:0;28816:18;28740:51;28816:9;:18::i;:::-;28802:32;;28898:8;28888:6;:18;;28879:47;;;;;-1:-1:-1;;;28879:47:0;;;;;;;;;;;;-1:-1:-1;;;28879:47:0;;;;;;;;;;;;;;;29003:11;:9;:11::i;:::-;28993:6;:21;;28984:49;;;;;-1:-1:-1;;;28984:49:0;;;;;;;;;;;;-1:-1:-1;;;28984:49:0;;;;;;;;;;;;;;;29129:8;29140:36;29169:5;29140:23;29152:5;:9;;;29140:6;:10;;:23;;;;:::i;:36::-;29129:47;-1:-1:-1;29187:11:0;29201:30;29129:47;29201:19;:5;29212:6;29201:9;:19::i;:::-;:23;;:30::i;:::-;29187:44;-1:-1:-1;29412:74:0;-1:-1:-1;;;;;29420:9:0;29412:36;29450:10;29470:4;29477:7;29412:36;:74::i;:::-;29505:9;-1:-1:-1;;;;;29497:27:0;;29535:8;29547:7;29497:59;;;;;;;;;;;;;-1:-1:-1;;;;;29497:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29567:59:0;;;-1:-1:-1;;;29567:59:0;;;;;;;;-1:-1:-1;;;;;29607:9:0;29567:59;;;;;;;;;;;;;;29578:8;29567:29;;;;;;:59;;;;;29497;;29567;;;;;;;;-1:-1:-1;29567:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29662:14:0;;:27;;29681:7;29662:18;:27::i;:::-;29647:14;:42;29715:8;;29710:112;;29771:38;-1:-1:-1;;;;;29779:3:0;29771:26;29799:3;29804;29771:26;:38::i;:::-;29890:9;;:22;;29905:5;29890:13;:22::i;:::-;29878:9;:34;30013:7;;29990:40;;;-1:-1:-1;;;29990:40:0;;-1:-1:-1;;;;;30013:7:0;;;29990:40;;;;;;;;;;;;29998:3;29990:21;;;;;;:40;;;;;;;;;;;;;;;-1:-1:-1;29990:21:0;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30051:7:0;;30041:50;;;-1:-1:-1;;;30041:50:0;;;;;;;;30084:4;30041:50;;;;;;-1:-1:-1;;;;;30051:7:0;;;;30041:25;;:50;;;;;29990:40;;30041:50;;;;;;;;30051:7;;30041:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30112:7:0;;30102:42;;;-1:-1:-1;;;30102:42:0;;30137:4;30102:42;;;;;;-1:-1:-1;;;;;30112:7:0;;;;30102:25;;:42;;;;;30112:7;;30102:42;;;;;;;;30112:7;;30102:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30155:14;30176:4;-1:-1:-1;;;;;30170:26:0;;30197:6;30170:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30170:34:0;30280:284;;;;;;;;-1:-1:-1;;;;;30313:23:0;;-1:-1:-1;30313:23:0;;;:9;30170:34;30313:23;;;;;:34;30170;;-1:-1:-1;30280:284:0;;;30313:51;;30170:34;30313:38;:51::i;:::-;30280:284;;-1:-1:-1;;;;;30390:23:0;;;;;;:9;30280:284;30390:23;;;;;;;:33;;;30280:284;;;30390:47;;30429:6;30390:37;:47::i;:::-;30280:284;;30461:17;;;30280:284;;;;;;;;30504:12;30280:284;;;;;;;;;;;;;;-1:-1:-1;;;;;30254:23:0;;-1:-1:-1;30254:23:0;;;:9;:23;;;;;:310;;;;;;;;30461:17;30254:310;;;;;;;;;;;;;;30461:5;30254:310;;;;;;;;;;;;;;;30669:17;;30542:10;;30651:37;;:16;:37::i;:::-;30621:81;;;;;;;;30643:6;;30621:81;;;;;;;;;;30768:11;:9;:11::i;:::-;30754:12;:10;:12::i;:::-;30736:16;:14;:16::i;:::-;30718:63;;;;;;;30794:8;:6;:8::i;:::-;-1:-1:-1;30852:6:0;;28191:2676;-1:-1:-1;;;;;;;;28191:2676:0:o;27820:142::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;823:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27901:22:0;::::1;27892:33;;;::::0;::::1;;27936:7;:18:::0;;-1:-1:-1;;;;;;27936:18:0::1;-1:-1:-1::0;;;;;27936:18:0;;;::::1;::::0;;;::::1;::::0;;27820:142::o;35986:275::-;36043:4;36066:15;36061:193;;;36106:85;36186:3;36106:74;36140:14;-1:-1:-1;;;;;36123:42:0;;36167:9;36123:55;;;;;;;;;;;;;-1:-1:-1;;;;;36123:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36123:55:0;36106:11;:9;:11::i;36061:193::-;36231:11;:9;:11::i;22078:28::-;;;:::o;22374:::-;;;:::o;38391:304::-;38454:4;38491:3;-1:-1:-1;;;;;38481:13:0;:6;-1:-1:-1;;;;;38481:13:0;;;38472:24;;;;;;38526:4;-1:-1:-1;;;;;38516:14:0;:6;-1:-1:-1;;;;;38516:14:0;;;38507:25;;;;;;38562:9;-1:-1:-1;;;;;38552:19:0;:6;-1:-1:-1;;;;;38552:19:0;;;38543:30;;;;;;38584:81;38615:3;38628:6;-1:-1:-1;;;;;38620:26:0;;38656:4;38620:43;;;;;;;;;;;;;-1:-1:-1;;;;;38620:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38620:43:0;-1:-1:-1;;;;;38584:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;38683:4:0;38391:304;;;:::o;22545:39::-;;;:::o;22821:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35131:340::-;35191:11;35203:12;35216:14;35231;35259:16;;:::i;:::-;-1:-1:-1;;;;;;35278:23:0;;;;;;;:9;:23;;;;;;;;;35259:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35319:43;;-1:-1:-1;;;35319:43:0;;;;;;;;35259:42;;35325:4;35319:26;;;;:43;;;;;35278:23;;35319:43;;;;;;:26;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35319:43:0;35381:12;;;;35414:14;;;;35449;;;;;35319:43;;35381:12;;-1:-1:-1;35414:14:0;;-1:-1:-1;35449:14:0;-1:-1:-1;35131:340:0;-1:-1:-1;;35131:340:0:o;35595:270::-;35638:15;35670:11;35692:3;-1:-1:-1;;;;;35684:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35684:27:0;;-1:-1:-1;35735:122:0;35851:4;35735:110;:92;35770:24;35789:3;35770:13;:11;:13::i;:24::-;35810:6;35735:19;:92::i;:122::-;35722:135;;35595:270;;:::o;22700:18::-;;;;;;;;;;;;;;:::o;22446:37::-;;;:::o;33694:261::-;33737:11;33779:69;33843:3;33779:58;33825:10;33779:40;33806:11;:9;:11::i;:::-;33779:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;33873:18;;33770:78;;-1:-1:-1;33864:27:0;;33859:89;;;-1:-1:-1;33918:18:0;;33694:261;:::o;33159:140::-;33202:4;33227:64;33283:6;33227:50;33260:5;:15;;;33235:3;-1:-1:-1;;;;;33227:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33227:27:0;;:31;:50::i;36568:286::-;36611:11;36636:20;36659:29;36677:9;;36659:12;:16;;:29;;;;:::i;:::-;36746:17;;36708:9;;36636:52;;-1:-1:-1;36708:57:0;;:32;;36636:52;36708:13;:32::i;:57::-;36699:66;;36790:9;;36781:6;:18;36776:71;;;36826:9;;36817:18;;36776:71;36568:286;;:::o;22997:21::-;;;;:::o;22915:::-;;;;:::o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1877:50;1799:136;-1:-1:-1;;;1799:136:0:o;2143:250::-;2201:7;2225:6;2221:47;;-1:-1:-1;2255:1:0;2248:8;;2221:47;2292:5;;;2296:1;2292;:5;:1;2316:5;;;;;:10;2308:56;;;;-1:-1:-1;;;2308:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2401:132;2459:7;2486:39;2490:1;2493;2486:39;;;;;;;;;;;;;;;;;:3;:39::i;19956:719::-;20037:16;;:::i;:::-;20088:1;20074:11;:15;20066:66;;;;-1:-1:-1;;;20066:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20147:14;20143:50;;-1:-1:-1;20170:23:0;;;;;;;;;-1:-1:-1;20170:23:0;;20163:30;;20143:50;20210:24;;;20206:462;;20251:14;20296:11;19382:3;20269:23;;;20296:11;20268:39;;;;;;-1:-1:-1;;;;;;20330:21:0;;;20322:64;;;;;-1:-1:-1;;;20322:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20408:26;;;;;;;;20426:6;-1:-1:-1;;;;;20408:26:0;;;;20401:33;;;;;20206:462;20467:14;20484:45;20500:9;-1:-1:-1;;;20517:11:0;20484:15;:45::i;:::-;20467:62;-1:-1:-1;;;;;;20552:21:0;;;20544:64;;;;;-1:-1:-1;;;20544:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19811:137;19913:7;19924:16;-1:-1:-1;;;;;19908:13:0;;;:32;;19811:137::o;32890:124::-;32943:28;32958:11;:9;:11::i;32943:28::-;32931:9;:40;32994:12;32982:9;:24;32890:124::o;34082:345::-;34123:11;34157:69;34221:3;34157:58;34203:10;34157:40;34184:11;:9;:11::i;34157:69::-;34251:18;;34148:78;;-1:-1:-1;34242:27:0;;34237:183;;;-1:-1:-1;34296:18:0;;34237:183;;;34345:18;;:23;34340:80;;34407:1;34386:18;:22;34082:345;:::o;16493:205::-;16621:68;;;-1:-1:-1;;;;;16621:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16621:68:0;-1:-1:-1;;;16621:68:0;;;16594:96;;16614:5;;16594:19;:96::i;:::-;16493:205;;;;:::o;1610:181::-;1668:7;1700:5;;;1724:6;;;;1716:46;;;;;-1:-1:-1;;;1716:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16308:177;16418:58;;;-1:-1:-1;;;;;16418:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16418:58:0;-1:-1:-1;;;16418:58:0;;;16391:86;;16411:5;;16391:19;:86::i;:::-;16308:177;;;:::o;31912:917::-;31998:17;;31972:20;;31950:19;;31972:45;;:20;:24;:45::i;:::-;32032:15;;31950:67;;-1:-1:-1;32032:20:0;;;;:54;;;32072:14;32056:12;:30;;32032:54;32028:794;;;32119:5;:21;32160:10;:14;;;32155:494;;;32247:15;;32220:5;:21;:44;;:25;:44::i;:::-;32196:5;:68;;;32313:17;;-1:-1:-1;32283:112:0;;32374:1;32356:15;:19;32283:112;32155:494;;;32486:15;;32459:5;:21;:44;;:25;:44::i;:::-;32435:5;:68;;;32552:17;;-1:-1:-1;32522:112:0;;32613:1;32595:15;:19;32522:112;32686:12;32663:20;:35;32754:5;:21;32777:15;;32663:10;32794:14;32718:92;;;;;;;;;;;;;;;;;;;;32794:14;;32718:92;;;;;;;;;;;;;;;;32028:794;;31912:917;:::o;1943:192::-;2029:7;2065:12;2057:6;;;;2049:29;;;;-1:-1:-1;;;2049:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2101:5:0;;;1943:192::o;2541:189::-;2627:7;2662:12;2655:5;2647:28;;;;-1:-1:-1;;;2647:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:9;2702:1;2698;:5;;;;;;;2541:189;-1:-1:-1;;;;;2541:189:0:o;18856:347::-;18962:7;18983:9;18994;19007:13;19015:1;19018;19007:7;:13::i;:::-;18982:38;;;;19031:10;19057:1;19044:15;;;;;19054:1;19051;19044:15;19031:28;;19079:1;19074:2;:6;19070:18;;;19087:1;19082:6;;;;19070:18;19104:2;19099:7;;;;19129:1;19125;:5;19117:44;;;;;-1:-1:-1;;;19117:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19179:16;19187:1;19190;19193;19179:7;:16::i;:::-;19172:23;18856:347;-1:-1:-1;;;;;;;18856:347:0:o;17697:420::-;17780:23;17806:69;17834:4;17806:69;;;;;;;;;;;;;;;;;17814:5;-1:-1:-1;;;;;17806:27:0;;;:69;;;;;:::i;:::-;17890:17;;17780:95;;-1:-1:-1;17890:21:0;17886:224;;18032:10;18021:30;;;;;;;;;;;;;;;-1:-1:-1;18021:30:0;18013:85;;;;-1:-1:-1;;;18013:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18148:210;18209:9;;;-1:-1:-1;;18265:1:0;18262;18255:25;18242:38;;18299:1;18295;:5;18291:9;;18320:1;18315:2;:6;18311:10;;18341:1;18336:2;:6;18332:18;;;18349:1;18344:6;;;;18332:18;18148:210;;;;;;:::o;18366:482::-;18472:7;18511:2;;;18507:6;;;18512:1;18507:6;18524:9;;;;;;;18549:4;18544:9;;;;;;;;;18584:4;18576;18575:5;;18574:14;;;;;18633:1;:9;;;18662:5;;;18658:9;;18653:14;18687:5;;;18683:9;;18678:14;18712:5;;;18708:9;;18703:14;18737:5;;;18733:9;;18728:14;18762:5;;;18758:9;;18753:14;18787:5;;;18783:9;;18778:14;18812:5;;;18808:9;;18803:14;;;18574;;18591:1;18574:18;18569:24;;;;18564:29;;;;18835:5;;18366:482;-1:-1:-1;;18366:482:0:o;4242:196::-;4345:12;4377:53;4400:6;4408:4;4414:1;4417:12;4377:22;:53::i;:::-;4370:60;4242:196;-1:-1:-1;;;;4242:196:0:o;5218:979::-;5348:12;5381:18;5392:6;5381:10;:18::i;:::-;5373:60;;;;;-1:-1:-1;;;5373:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5507:12;5521:23;5548:6;-1:-1:-1;;;;;5548:11:0;5568:8;5579:4;5548:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5548:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5506:78;;;;5599:7;5595:595;;;5630:10;-1:-1:-1;5623:17:0;;-1:-1:-1;5623:17:0;5595:595;5744:17;;:21;5740:439;;6007:10;6001:17;6068:15;6055:10;6051:2;6047:19;6040:44;5955:148;6143:20;;-1:-1:-1;;;6143:20:0;;;;;;;;;;;;;;;;;6150:12;;6143:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3415:233;3593:20;3632:8;;;3415:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://6c3e285f8ee8c7141f7bb97a7bd47d23eb577c229f4dce81f660ef1cbb88c7ce
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.