Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EasyStaking
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)Audit Report
/** *Submitted for verification at Etherscan.io on 2020-08-04 */ pragma solidity 0.5.16; library ExtendedMath { /** * @return The given number raised to the power of 2 */ function pow2(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * a; require(c / a == a, "ExtendedMath: squaring overflow"); return c; } /** * @return The square root of the given number */ function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } contract Sacrifice { constructor(address payable _recipient) public payable { selfdestruct(_recipient); } } interface IERC20Mintable { function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 _value) external returns (bool); function mint(address _to, uint256 _value) external returns (bool); function balanceOf(address _account) external view returns (uint256); function totalSupply() external view returns (uint256); } /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initialize(address sender) public initializer { _owner = sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * > Note: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[50] private ______gap; } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ 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 { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length 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)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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"); } } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ReentrancyGuard is Initializable { // counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; function initialize() public initializer { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } uint256[50] private ______gap; } library Sigmoid { using SafeMath for uint256; using ExtendedMath for uint256; // The period after which the new value of the parameter is set uint256 public constant PARAM_UPDATE_DELAY = 7 days; struct Params { uint256 a; int256 b; uint256 c; } struct State { Params oldParams; Params newParams; uint256 timestamp; } /** * @dev Sets sigmoid parameters * @param _a Sigmoid parameter A. * @param _b Sigmoid parameter B. * @param _c Sigmoid parameter C. */ function setParameters(State storage self, uint256 _a, int256 _b, uint256 _c) internal { require(_c != 0, "should be greater than 0"); // prevent division by zero uint256 currentTimestamp = _now(); if (self.timestamp == 0) { self.oldParams = Params(_a, _b, _c); } else if (currentTimestamp > self.timestamp.add(PARAM_UPDATE_DELAY)) { self.oldParams = self.newParams; } self.newParams = Params(_a, _b, _c); self.timestamp = currentTimestamp; } /** * @return Sigmoid parameters */ function getParameters(State storage self) internal view returns (uint256, int256, uint256) { bool isUpdated = _now() > self.timestamp.add(PARAM_UPDATE_DELAY); return isUpdated ? (self.newParams.a, self.newParams.b, self.newParams.c) : (self.oldParams.a, self.oldParams.b, self.oldParams.c); } /** * @return The corresponding Y value for a given X value */ function calculate(State storage self, int256 _x) internal view returns (uint256) { (uint256 a, int256 b, uint256 c) = getParameters(self); int256 k = _x - b; if (k < 0) return 0; uint256 uk = uint256(k); return a.mul(uk).div(uk.pow2().add(c).sqrt()); } /** * @return Returns current timestamp. */ function _now() internal view returns (uint256) { // Note that the timestamp can have a 900-second error: // https://github.com/ethereum/wiki/blob/c02254611f218f43cbb07517ca8e5d00fd6d6d75/Block-Protocol-2.0.md return now; // solium-disable-line security/no-block-members } } /** * @title EasyStaking * * Note: all percentage values are between 0 (0%) and 1 (100%) * and represented as fixed point numbers containing 18 decimals like with Ether * 100% == 1 ether */ contract EasyStaking is Ownable, ReentrancyGuard { using Address for address; using SafeMath for uint256; using SafeERC20 for IERC20; using Sigmoid for Sigmoid.State; /** * @dev Emitted when a user deposits tokens. * @param sender User address. * @param id User's unique deposit ID. * @param amount The amount of deposited tokens. * @param balance Current user balance. * @param accruedEmission User's accrued emission. * @param prevDepositDuration Duration of the previous deposit in seconds. */ event Deposited( address indexed sender, uint256 indexed id, uint256 amount, uint256 balance, uint256 accruedEmission, uint256 prevDepositDuration ); /** * @dev Emitted when a user requests withdrawal. * @param sender User address. * @param id User's unique deposit ID. */ event WithdrawalRequested(address indexed sender, uint256 indexed id); /** * @dev Emitted when a user withdraws tokens. * @param sender User address. * @param id User's unique deposit ID. * @param amount The amount of withdrawn tokens. * @param fee The withdrawal fee. * @param balance Current user balance. * @param accruedEmission User's accrued emission. * @param lastDepositDuration Duration of the last deposit in seconds. */ event Withdrawn( address indexed sender, uint256 indexed id, uint256 amount, uint256 fee, uint256 balance, uint256 accruedEmission, uint256 lastDepositDuration ); /** * @dev Emitted when a new fee value is set. * @param value A new fee value. * @param sender The owner address at the moment of fee changing. */ event FeeSet(uint256 value, address sender); /** * @dev Emitted when a new withdrawal lock duration value is set. * @param value A new withdrawal lock duration value. * @param sender The owner address at the moment of value changing. */ event WithdrawalLockDurationSet(uint256 value, address sender); /** * @dev Emitted when a new withdrawal unlock duration value is set. * @param value A new withdrawal unlock duration value. * @param sender The owner address at the moment of value changing. */ event WithdrawalUnlockDurationSet(uint256 value, address sender); /** * @dev Emitted when a new total supply factor value is set. * @param value A new total supply factor value. * @param sender The owner address at the moment of value changing. */ event TotalSupplyFactorSet(uint256 value, address sender); /** * @dev Emitted when new sigmoid parameters values are set. * @param a A new parameter A value. * @param b A new parameter B value. * @param c A new parameter C value. * @param sender The owner address at the moment of value changing. */ event SigmoidParametersSet(uint256 a, int256 b, uint256 c, address sender); /** * @dev Emitted when a new Liquidity Providers Reward address value is set. * @param value A new address value. * @param sender The owner address at the moment of address changing. */ event LiquidityProvidersRewardAddressSet(address value, address sender); uint256 private constant YEAR = 365 days; // The maximum emission rate (in percentage) uint256 public constant MAX_EMISSION_RATE = 150 finney; // 15%, 0.15 ether // The period after which the new value of the parameter is set uint256 public constant PARAM_UPDATE_DELAY = 7 days; // STAKE token IERC20Mintable public token; struct UintParam { uint256 oldValue; uint256 newValue; uint256 timestamp; } struct AddressParam { address oldValue; address newValue; uint256 timestamp; } // The address for the Liquidity Providers reward AddressParam public liquidityProvidersRewardAddressParam; // The fee of the forced withdrawal (in percentage) UintParam public feeParam; // The time from the request after which the withdrawal will be available (in seconds) UintParam public withdrawalLockDurationParam; // The time during which the withdrawal will be available from the moment of unlocking (in seconds) UintParam public withdrawalUnlockDurationParam; // Total supply factor for calculating emission rate (in percentage) UintParam public totalSupplyFactorParam; // The deposit balances of users mapping (address => mapping (uint256 => uint256)) public balances; // The dates of users' deposits mapping (address => mapping (uint256 => uint256)) public depositDates; // The dates of users' withdrawal requests mapping (address => mapping (uint256 => uint256)) public withdrawalRequestsDates; // The last deposit id mapping (address => uint256) public lastDepositIds; // The total staked amount uint256 public totalStaked; // Variable that prevents _deposit method from being called 2 times bool private locked; // The library that is used to calculate user's current emission rate Sigmoid.State private sigmoid; /** * @dev Initializes the contract. * @param _owner The owner of the contract. * @param _tokenAddress The address of the STAKE token contract. * @param _liquidityProvidersRewardAddress The address for the Liquidity Providers reward. * @param _fee The fee of the forced withdrawal (in percentage). * @param _withdrawalLockDuration The time from the request after which the withdrawal will be available (in seconds). * @param _withdrawalUnlockDuration The time during which the withdrawal will be available from the moment of unlocking (in seconds). * @param _totalSupplyFactor Total supply factor for calculating emission rate (in percentage). * @param _sigmoidParamA Sigmoid parameter A. * @param _sigmoidParamB Sigmoid parameter B. * @param _sigmoidParamC Sigmoid parameter C. */ function initialize( address _owner, address _tokenAddress, address _liquidityProvidersRewardAddress, uint256 _fee, uint256 _withdrawalLockDuration, uint256 _withdrawalUnlockDuration, uint256 _totalSupplyFactor, uint256 _sigmoidParamA, int256 _sigmoidParamB, uint256 _sigmoidParamC ) external initializer { require(_owner != address(0), "zero address"); require(_tokenAddress.isContract(), "not a contract address"); Ownable.initialize(msg.sender); ReentrancyGuard.initialize(); token = IERC20Mintable(_tokenAddress); setFee(_fee); setWithdrawalLockDuration(_withdrawalLockDuration); setWithdrawalUnlockDuration(_withdrawalUnlockDuration); setTotalSupplyFactor(_totalSupplyFactor); setSigmoidParameters(_sigmoidParamA, _sigmoidParamB, _sigmoidParamC); setLiquidityProvidersRewardAddress(_liquidityProvidersRewardAddress); Ownable.transferOwnership(_owner); } /** * @dev This method is used to deposit tokens to a new deposit. * It generates a new deposit ID and calls another public "deposit" method. See its description. * @param _amount The amount to deposit. */ function deposit(uint256 _amount) external { deposit(++lastDepositIds[msg.sender], _amount); } /** * @dev This method is used to deposit tokens to the deposit opened before. * It calls the internal "_deposit" method and transfers tokens from sender to contract. * Sender must approve tokens first. * * Instead this, user can use the simple "transfer" method of STAKE token contract to make a deposit. * Sender's approval is not needed in this case. * * Note: each call updates the deposit date so be careful if you want to make a long staking. * * @param _depositId User's unique deposit ID. * @param _amount The amount to deposit. */ function deposit(uint256 _depositId, uint256 _amount) public { require(_depositId > 0 && _depositId <= lastDepositIds[msg.sender], "wrong deposit id"); _deposit(msg.sender, _depositId, _amount); _setLocked(true); require(token.transferFrom(msg.sender, address(this), _amount), "transfer failed"); _setLocked(false); } /** * @dev This method is called when STAKE tokens are transferred to this contract. * using "transfer", "transferFrom", or "transferAndCall" method of STAKE token contract. * It generates a new deposit ID and calls the internal "_deposit" method. * @param _sender The sender of tokens. * @param _amount The transferred amount. * @return true if successful */ function onTokenTransfer(address _sender, uint256 _amount, bytes calldata) external returns (bool) { require(msg.sender == address(token), "only token contract is allowed"); if (!locked) { _deposit(_sender, ++lastDepositIds[_sender], _amount); } return true; } /** * @dev This method is used to make a forced withdrawal with a fee. * It calls the internal "_withdraw" method. * @param _depositId User's unique deposit ID. * @param _amount The amount to withdraw (0 - to withdraw all). */ function makeForcedWithdrawal(uint256 _depositId, uint256 _amount) external { _withdraw(msg.sender, _depositId, _amount, true); } /** * @dev This method is used to request a withdrawal without a fee. * It sets the date of the request. * * Note: each call updates the date of the request so don't call this method twice during the lock. * * @param _depositId User's unique deposit ID. */ function requestWithdrawal(uint256 _depositId) external { require(_depositId > 0 && _depositId <= lastDepositIds[msg.sender], "wrong deposit id"); withdrawalRequestsDates[msg.sender][_depositId] = _now(); emit WithdrawalRequested(msg.sender, _depositId); } /** * @dev This method is used to make a requested withdrawal. * It calls the internal "_withdraw" method and resets the date of the request. * * If sender didn't call this method during the unlock period (if timestamp >= lockEnd + withdrawalUnlockDuration) * they have to call "requestWithdrawal" one more time. * * @param _depositId User's unique deposit ID. * @param _amount The amount to withdraw (0 - to withdraw all). */ function makeRequestedWithdrawal(uint256 _depositId, uint256 _amount) external { uint256 requestDate = withdrawalRequestsDates[msg.sender][_depositId]; require(requestDate > 0, "withdrawal wasn't requested"); uint256 timestamp = _now(); uint256 lockEnd = requestDate.add(withdrawalLockDuration()); require(timestamp >= lockEnd, "too early"); require(timestamp < lockEnd.add(withdrawalUnlockDuration()), "too late"); withdrawalRequestsDates[msg.sender][_depositId] = 0; _withdraw(msg.sender, _depositId, _amount, false); } /** * @dev This method is used to claim unsupported tokens accidentally sent to the contract. * It can only be called by the owner. * @param _token The address of the token contract (zero address for claiming native coins). * @param _to The address of the tokens/coins receiver. * @param _amount Amount to claim. */ function claimTokens(address _token, address payable _to, uint256 _amount) external onlyOwner { require(_to != address(0) && _to != address(this), "not a valid recipient"); require(_amount > 0, "amount should be greater than 0"); if (_token == address(0)) { if (!_to.send(_amount)) { // solium-disable-line security/no-send (new Sacrifice).value(_amount)(_to); } } else if (_token == address(token)) { uint256 availableAmount = token.balanceOf(address(this)).sub(totalStaked); require(availableAmount >= _amount, "insufficient funds"); require(token.transfer(_to, _amount), "transfer failed"); } else { IERC20 customToken = IERC20(_token); customToken.safeTransfer(_to, _amount); } } /** * @dev Sets the fee for forced withdrawals. Can only be called by owner. * @param _value The new fee value (in percentage). */ function setFee(uint256 _value) public onlyOwner { require(_value <= 1 ether, "should be less than or equal to 1 ether"); _updateUintParam(feeParam, _value); emit FeeSet(_value, msg.sender); } /** * @dev Sets the time from the request after which the withdrawal will be available. * Can only be called by owner. * @param _value The new duration value (in seconds). */ function setWithdrawalLockDuration(uint256 _value) public onlyOwner { require(_value <= 30 days, "shouldn't be greater than 30 days"); _updateUintParam(withdrawalLockDurationParam, _value); emit WithdrawalLockDurationSet(_value, msg.sender); } /** * @dev Sets the time during which the withdrawal will be available from the moment of unlocking. * Can only be called by owner. * @param _value The new duration value (in seconds). */ function setWithdrawalUnlockDuration(uint256 _value) public onlyOwner { require(_value >= 1 hours, "shouldn't be less than 1 hour"); _updateUintParam(withdrawalUnlockDurationParam, _value); emit WithdrawalUnlockDurationSet(_value, msg.sender); } /** * @dev Sets total supply factor for calculating emission rate. * Can only be called by owner. * @param _value The new factor value (in percentage). */ function setTotalSupplyFactor(uint256 _value) public onlyOwner { require(_value <= 1 ether, "should be less than or equal to 1 ether"); _updateUintParam(totalSupplyFactorParam, _value); emit TotalSupplyFactorSet(_value, msg.sender); } /** * @dev Sets parameters of the sigmoid that is used to calculate the user's current emission rate. * Can only be called by owner. * @param _a Sigmoid parameter A. Unsigned integer. * @param _b Sigmoid parameter B. Signed integer. * @param _c Sigmoid parameter C. Unsigned integer. Cannot be zero. */ function setSigmoidParameters(uint256 _a, int256 _b, uint256 _c) public onlyOwner { require(_a <= MAX_EMISSION_RATE.div(2), "should be less than or equal to a half of the maximum emission rate"); sigmoid.setParameters(_a, _b, _c); emit SigmoidParametersSet(_a, _b, _c, msg.sender); } /** * @dev Sets the address for the Liquidity Providers reward. * Can only be called by owner. * @param _address The new address. */ function setLiquidityProvidersRewardAddress(address _address) public onlyOwner { require(_address != address(0), "zero address"); require(_address != address(this), "wrong address"); AddressParam memory param = liquidityProvidersRewardAddressParam; if (param.timestamp == 0) { param.oldValue = _address; } else if (_paramUpdateDelayElapsed(param.timestamp)) { param.oldValue = param.newValue; } param.newValue = _address; param.timestamp = _now(); liquidityProvidersRewardAddressParam = param; emit LiquidityProvidersRewardAddressSet(_address, msg.sender); } /** * @return Returns current fee. */ function fee() public view returns (uint256) { return _getUintParamValue(feeParam); } /** * @return Returns current withdrawal lock duration. */ function withdrawalLockDuration() public view returns (uint256) { return _getUintParamValue(withdrawalLockDurationParam); } /** * @return Returns current withdrawal unlock duration. */ function withdrawalUnlockDuration() public view returns (uint256) { return _getUintParamValue(withdrawalUnlockDurationParam); } /** * @return Returns current total supply factor. */ function totalSupplyFactor() public view returns (uint256) { return _getUintParamValue(totalSupplyFactorParam); } /** * @return Returns current liquidity providers reward address. */ function liquidityProvidersRewardAddress() public view returns (address) { AddressParam memory param = liquidityProvidersRewardAddressParam; return _paramUpdateDelayElapsed(param.timestamp) ? param.newValue : param.oldValue; } /** * @return Emission rate based on the ratio of total staked to total supply. */ function getSupplyBasedEmissionRate() public view returns (uint256) { uint256 totalSupply = token.totalSupply(); uint256 factor = totalSupplyFactor(); if (factor == 0) return 0; uint256 target = totalSupply.mul(factor).div(1 ether); uint256 maxSupplyBasedEmissionRate = MAX_EMISSION_RATE.div(2); // 7.5% if (totalStaked >= target) { return maxSupplyBasedEmissionRate; } return maxSupplyBasedEmissionRate.mul(totalStaked).div(target); } /** * @param _depositDate Deposit date. * @param _amount Amount based on which emission is calculated and accrued. * @return Total accrued emission (for the user and Liquidity Providers), user share, and seconds passed since the previous deposit started. */ function getAccruedEmission( uint256 _depositDate, uint256 _amount ) public view returns (uint256 total, uint256 userShare, uint256 timePassed) { if (_amount == 0 || _depositDate == 0) return (0, 0, 0); timePassed = _now().sub(_depositDate); if (timePassed == 0) return (0, 0, 0); uint256 userEmissionRate = sigmoid.calculate(int256(timePassed)); userEmissionRate = userEmissionRate.add(getSupplyBasedEmissionRate()); if (userEmissionRate == 0) return (0, 0, timePassed); assert(userEmissionRate <= MAX_EMISSION_RATE); total = _amount.mul(MAX_EMISSION_RATE).mul(timePassed).div(YEAR * 1 ether); userShare = _amount.mul(userEmissionRate).mul(timePassed).div(YEAR * 1 ether); } /** * @return Sigmoid parameters. */ function getSigmoidParameters() public view returns (uint256 a, int256 b, uint256 c) { return sigmoid.getParameters(); } /** * @dev Calls internal "_mint" method, increases the user balance, and updates the deposit date. * @param _sender The address of the sender. * @param _id User's unique deposit ID. * @param _amount The amount to deposit. */ function _deposit(address _sender, uint256 _id, uint256 _amount) internal nonReentrant { require(_amount > 0, "deposit amount should be more than 0"); (uint256 sigmoidParamA,,) = getSigmoidParameters(); if (sigmoidParamA == 0 && totalSupplyFactor() == 0) revert("emission stopped"); (uint256 userShare, uint256 timePassed) = _mint(_sender, _id, 0); uint256 newBalance = balances[_sender][_id].add(_amount); balances[_sender][_id] = newBalance; totalStaked = totalStaked.add(_amount); depositDates[_sender][_id] = _now(); emit Deposited(_sender, _id, _amount, newBalance, userShare, timePassed); } /** * @dev Calls internal "_mint" method and then transfers tokens to the sender. * @param _sender The address of the sender. * @param _id User's unique deposit ID. * @param _amount The amount to withdraw (0 - to withdraw all). * @param _forced Defines whether to apply fee (true), or not (false). */ function _withdraw(address _sender, uint256 _id, uint256 _amount, bool _forced) internal nonReentrant { require(_id > 0 && _id <= lastDepositIds[_sender], "wrong deposit id"); require(balances[_sender][_id] > 0 && balances[_sender][_id] >= _amount, "insufficient funds"); (uint256 accruedEmission, uint256 timePassed) = _mint(_sender, _id, _amount); uint256 amount = _amount == 0 ? balances[_sender][_id] : _amount.add(accruedEmission); balances[_sender][_id] = balances[_sender][_id].sub(amount); totalStaked = totalStaked.sub(amount); if (balances[_sender][_id] == 0) { depositDates[_sender][_id] = 0; } uint256 feeValue = 0; if (_forced) { feeValue = amount.mul(fee()).div(1 ether); amount = amount.sub(feeValue); require(token.transfer(liquidityProvidersRewardAddress(), feeValue), "transfer failed"); } require(token.transfer(_sender, amount), "transfer failed"); emit Withdrawn(_sender, _id, amount, feeValue, balances[_sender][_id], accruedEmission, timePassed); } /** * @dev Mints MAX_EMISSION_RATE per annum and distributes the emission between the user and Liquidity Providers in proportion. * @param _user User's address. * @param _id User's unique deposit ID. * @param _amount Amount based on which emission is calculated and accrued. When 0, current deposit balance is used. */ function _mint(address _user, uint256 _id, uint256 _amount) internal returns (uint256, uint256) { uint256 currentBalance = balances[_user][_id]; uint256 amount = _amount == 0 ? currentBalance : _amount; (uint256 total, uint256 userShare, uint256 timePassed) = getAccruedEmission(depositDates[_user][_id], amount); if (total > 0) { require(token.mint(address(this), total), "minting failed"); balances[_user][_id] = currentBalance.add(userShare); totalStaked = totalStaked.add(userShare); require(token.transfer(liquidityProvidersRewardAddress(), total.sub(userShare)), "transfer failed"); } return (userShare, timePassed); } /** * @dev Sets the next value of the parameter and the timestamp of this setting. */ function _updateUintParam(UintParam storage _param, uint256 _newValue) internal { if (_param.timestamp == 0) { _param.oldValue = _newValue; } else if (_paramUpdateDelayElapsed(_param.timestamp)) { _param.oldValue = _param.newValue; } _param.newValue = _newValue; _param.timestamp = _now(); } /** * @return Returns the current value of the parameter. */ function _getUintParamValue(UintParam memory _param) internal view returns (uint256) { return _paramUpdateDelayElapsed(_param.timestamp) ? _param.newValue : _param.oldValue; } /** * @return Returns true if param update delay elapsed. */ function _paramUpdateDelayElapsed(uint256 _paramTimestamp) internal view returns (bool) { return _now() > _paramTimestamp.add(PARAM_UPDATE_DELAY); } /** * @dev Sets lock to prevent reentrance. */ function _setLocked(bool _locked) internal { locked = _locked; } /** * @return Returns current timestamp. */ function _now() internal view returns (uint256) { // Note that the timestamp can have a 900-second error: // https://github.com/ethereum/wiki/blob/c02254611f218f43cbb07517ca8e5d00fd6d6d75/Block-Protocol-2.0.md return now; // solium-disable-line security/no-block-members } }
Contract Security Audit
- Quantstamp - August 3rd, 2020 - Security Audit Report
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accruedEmission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"prevDepositDuration","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"FeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"value","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"LiquidityProvidersRewardAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"a","type":"uint256"},{"indexed":false,"internalType":"int256","name":"b","type":"int256"},{"indexed":false,"internalType":"uint256","name":"c","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"SigmoidParametersSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"TotalSupplyFactorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"WithdrawalLockDurationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"WithdrawalRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"WithdrawalUnlockDurationSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accruedEmission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositDuration","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"MAX_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PARAM_UPDATE_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"depositDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeParam","outputs":[{"internalType":"uint256","name":"oldValue","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_depositDate","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getAccruedEmission","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"userShare","type":"uint256"},{"internalType":"uint256","name":"timePassed","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSigmoidParameters","outputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"int256","name":"b","type":"int256"},{"internalType":"uint256","name":"c","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSupplyBasedEmissionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_liquidityProvidersRewardAddress","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_withdrawalLockDuration","type":"uint256"},{"internalType":"uint256","name":"_withdrawalUnlockDuration","type":"uint256"},{"internalType":"uint256","name":"_totalSupplyFactor","type":"uint256"},{"internalType":"uint256","name":"_sigmoidParamA","type":"uint256"},{"internalType":"int256","name":"_sigmoidParamB","type":"int256"},{"internalType":"uint256","name":"_sigmoidParamC","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDepositIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidityProvidersRewardAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidityProvidersRewardAddressParam","outputs":[{"internalType":"address","name":"oldValue","type":"address"},{"internalType":"address","name":"newValue","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"makeForcedWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"makeRequestedWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_depositId","type":"uint256"}],"name":"requestWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setLiquidityProvidersRewardAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_a","type":"uint256"},{"internalType":"int256","name":"_b","type":"int256"},{"internalType":"uint256","name":"_c","type":"uint256"}],"name":"setSigmoidParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setTotalSupplyFactor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setWithdrawalLockDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setWithdrawalUnlockDuration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20Mintable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupplyFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupplyFactorParam","outputs":[{"internalType":"uint256","name":"oldValue","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"withdrawalLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawalLockDurationParam","outputs":[{"internalType":"uint256","name":"oldValue","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawalRequestsDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawalUnlockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawalUnlockDurationParam","outputs":[{"internalType":"uint256","name":"oldValue","type":"uint256"},{"internalType":"uint256","name":"newValue","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052613144806100136000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80638da5cb5b11610146578063c4d66de8116100c3578063db51ef9211610087578063db51ef9214610694578063ddca3f431461069c578063e0648a28146106a4578063e2bbb158146106d0578063f2fde38b146106f3578063fc0c546a1461071957610253565b8063c4d66de8146105b1578063c5401ce3146105d7578063cbf1304d146105df578063d64631511461060b578063d7004cc61461063157610253565b80639fc314c81161010a5780639fc314c8146104ab578063a4c0ed36146104e1578063b4a86c4814610566578063b6b55f251461056e578063c3bd8fd01461058b57610253565b80638da5cb5b146104235780638df67680146104475780638f32d59b1461044f57806394967fa11461046b5780639ee679e81461048e57610253565b806360c251c1116101d45780638129fc1c116101985780638129fc1c146103c2578063817b1cd2146103ca5780638235c378146103d2578063868867b5146103da5780638b53ccb3146103f757610253565b806360c251c11461036a57806360d4ffb01461037257806369fe0e2d14610395578063715018a6146103b257806375fa901b146103ba57610253565b8063416829901161021b578063416829901461031b578063436cc3d61461033857806347e318de14610352578063522ea5e21461035a5780635e9e230d1461036257610253565b8063181943591461025857806318cca7a61461028a578063224313fa146102af578063294a5b04146102cc5780632c3144da146102f5575b600080fd5b610260610721565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b6102ad600480360360408110156102a057600080fd5b508035906020013561073d565b005b6102ad600480360360208110156102c557600080fd5b503561089b565b6102ad600480360360608110156102e257600080fd5b508035906020810135906040013561096c565b6102fd610a68565b60408051938452602084019290925282820152519081900360600190f35b6102ad6004803603602081101561033157600080fd5b5035610a74565b610340610b4a565b60408051918252519081900360200190f35b6102fd610b56565b610340610b62565b6102fd610b95565b610340610ba1565b6102fd6004803603604081101561038857600080fd5b5080359060200135610bce565b6102ad600480360360208110156103ab57600080fd5b5035610cd6565b6102ad610dac565b6102fd610e3d565b6102ad610e57565b610340610efe565b610340610f04565b6102ad600480360360208110156103f057600080fd5b5035611012565b6103406004803603604081101561040d57600080fd5b506001600160a01b0381351690602001356110f8565b61042b611115565b604080516001600160a01b039092168252519081900360200190f35b610340611124565b610457611151565b604080519115158252519081900360200190f35b6102ad6004803603604081101561048157600080fd5b5080359060200135611177565b6102ad600480360360208110156104a457600080fd5b5035611188565b6102ad600480360360608110156104c157600080fd5b506001600160a01b0381358116916020810135909116906040013561123c565b610457600480360360608110156104f757600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561052757600080fd5b82018360208201111561053957600080fd5b8035906020019184600183028401116401000000008311171561055b57600080fd5b50909250905061159a565b6102fd61163e565b6102ad6004803603602081101561058457600080fd5b503561164a565b610340600480360360208110156105a157600080fd5b50356001600160a01b031661166c565b6102ad600480360360208110156105c757600080fd5b50356001600160a01b031661167e565b61042b61176f565b610340600480360360408110156105f557600080fd5b506001600160a01b0381351690602001356117c7565b6102ad6004803603602081101561062157600080fd5b50356001600160a01b03166117e4565b6102ad600480360361014081101561064857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012001356119ca565b610340611b89565b610340611b90565b610340600480360360408110156106ba57600080fd5b506001600160a01b038135169060200135611bbd565b6102ad600480360360408110156106e657600080fd5b5080359060200135611bda565b6102ad6004803603602081101561070957600080fd5b50356001600160a01b0316611d25565b61042b611d75565b609a54609b54609c546001600160a01b03928316929091169083565b33600090815260ab60209081526040808320858452909152902054806107aa576040805162461bcd60e51b815260206004820152601b60248201527f7769746864726177616c207761736e2774207265717565737465640000000000604482015290519081900360640190fd5b60006107b4611d84565b905060006107d06107c3610ba1565b849063ffffffff611d8816565b905080821015610813576040805162461bcd60e51b8152602060048201526009602482015268746f6f206561726c7960b81b604482015290519081900360640190fd5b61082b61081e611124565b829063ffffffff611d8816565b8210610869576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b33600081815260ab602090815260408083208984529091528120819055610894919087908790611deb565b5050505050565b6108a3611151565b6108e2576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b62278d008111156109245760405162461bcd60e51b81526004018080602001828103825260218152602001806130ef6021913960400191505060405180910390fd5b61092f60a0826122ba565b6040805182815233602082015281517fb1effbb8dc5cfa97751137110a061198891986f1567677e11ec9449743180f74929181900390910190a150565b610974611151565b6109b3576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6109cc670214e8348c4f0000600263ffffffff61230016565b831115610a0a5760405162461bcd60e51b8152600401808060200182810382526043815260200180612fec6043913960600191505060405180910390fd5b610a1d60af84848463ffffffff61234216565b604080518481526020810184905280820183905233606082015290517fddf30262673035378258d8aab83a68d6d8b8e45e5510d3b295fcc7cd65c6378a9181900360800190a1505050565b60a05460a15460a25483565b610a7c611151565b610abb576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b670de0b6b3a7640000811115610b025760405162461bcd60e51b815260040180806020018281038252602781526020018061309e6027913960400191505060405180910390fd5b610b0d60a6826122ba565b6040805182815233602082015281517fb7b23f70fe41cd9debaaa54902f2492c79f94d7582d587844dc12fdc8fc42a2b929181900390910190a150565b670214e8348c4f000081565b609d54609e54609f5483565b6040805160608101825260a654815260a754602082015260a85491810191909152600090610b8f9061244b565b90505b90565b60a35460a45460a55483565b6040805160608101825260a054815260a154602082015260a25491810191909152600090610b8f9061244b565b60008080831580610bdd575084155b15610bf057506000915081905080610ccf565b610c0885610bfc611d84565b9063ffffffff61247316565b905080610c1d57506000915081905080610ccf565b6000610c3060af8363ffffffff6124b516565b9050610c3d61081e610f04565b905080610c51575060009250829150610ccf565b670214e8348c4f0000811115610c6357fe5b610ca66a1a1601fc4ea7109e000000610c9a84610c8e89670214e8348c4f000063ffffffff61252516565b9063ffffffff61252516565b9063ffffffff61230016565b9350610ccb6a1a1601fc4ea7109e000000610c9a84610c8e898663ffffffff61252516565b9250505b9250925092565b610cde611151565b610d1d576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b670de0b6b3a7640000811115610d645760405162461bcd60e51b815260040180806020018281038252602781526020018061309e6027913960400191505060405180910390fd5b610d6f609d826122ba565b6040805182815233602082015281517fc8242dc5446855370b781abbfc5d882af1d1a3cc29143216aba3558feb0ce925929181900390910190a150565b610db4611151565b610df3576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6000806000610e4c60af61257e565b925092509250909192565b600054610100900460ff1680610e705750610e706125dd565b80610e7e575060005460ff16155b610eb95760405162461bcd60e51b815260040180806020018281038252602e815260200180613070602e913960400191505060405180910390fd5b600054610100900460ff16158015610ee4576000805460ff1961ff0019909116610100171660011790555b60016066558015610efb576000805461ff00191690555b50565b60ad5481565b600080609960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5557600080fd5b505afa158015610f69573d6000803e3d6000fd5b505050506040513d6020811015610f7f57600080fd5b505190506000610f8d610b62565b905080610f9f57600092505050610b92565b6000610fbd670de0b6b3a7640000610c9a858563ffffffff61252516565b90506000610fda670214e8348c4f0000600263ffffffff61230016565b90508160ad5410610ff0579350610b9292505050565b61100982610c9a60ad548461252590919063ffffffff16565b94505050505090565b61101a611151565b611059576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b610e108110156110b0576040805162461bcd60e51b815260206004820152601d60248201527f73686f756c646e2774206265206c657373207468616e203120686f7572000000604482015290519081900360640190fd5b6110bb60a3826122ba565b6040805182815233602082015281517f3a963fa1d1d0da205f1ae9869aa14bf4ff7a4585efa819b0c94326b4a3e1e228929181900390910190a150565b60aa60209081526000928352604080842090915290825290205481565b6033546001600160a01b031690565b6040805160608101825260a354815260a454602082015260a55491810191909152600090610b8f9061244b565b6033546000906001600160a01b03166111686125e3565b6001600160a01b031614905090565b6111843383836001611deb565b5050565b6000811180156111a7575033600090815260ac60205260409020548111155b6111eb576040805162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c819195c1bdcda5d081a5960821b604482015290519081900360640190fd5b6111f3611d84565b33600081815260ab6020908152604080832086845290915280822093909355915183927fe670e4e82118d22a1f9ee18920455ebc958bae26a90a05d31d3378788b1b0e4491a350565b611244611151565b611283576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6001600160a01b038216158015906112a457506001600160a01b0382163014155b6112ed576040805162461bcd60e51b81526020600482015260156024820152741b9bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b60008111611342576040805162461bcd60e51b815260206004820152601f60248201527f616d6f756e742073686f756c642062652067726561746572207468616e203000604482015290519081900360640190fd5b6001600160a01b0383166113bc576040516001600160a01b0383169082156108fc029083906000818181858888f193505050506113b757808260405161138790612f43565b6001600160a01b039091168152604051908190036020019082f0801580156113b3573d6000803e3d6000fd5b5050505b611595565b6099546001600160a01b03848116911614156115785760ad54609954604080516370a0823160e01b815230600482015290516000936114619390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561142957600080fd5b505afa15801561143d573d6000803e3d6000fd5b505050506040513d602081101561145357600080fd5b50519063ffffffff61247316565b9050818110156114ad576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b6099546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b505050506040513d602081101561152d57600080fd5b5051611572576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b50611595565b826115936001600160a01b038216848463ffffffff6125e716565b505b505050565b6099546000906001600160a01b031633146115fc576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c7920746f6b656e20636f6e747261637420697320616c6c6f7765640000604482015290519081900360640190fd5b60ae5460ff16611633576001600160a01b038516600090815260ac6020526040902080546001019081905561163390869086612639565b506001949350505050565b60a65460a75460a85483565b33600090815260ac60205260409020805460010190819055610efb9082611bda565b60ac6020526000908152604090205481565b600054610100900460ff168061169757506116976125dd565b806116a5575060005460ff16155b6116e05760405162461bcd60e51b815260040180806020018281038252602e815260200180613070602e913960400191505060405180910390fd5b600054610100900460ff1615801561170b576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015611184576000805461ff00191690555050565b6000611779612f4f565b5060408051606081018252609a546001600160a01b039081168252609b54166020820152609c54918101829052906117b090612841565b6117bb5780516117c1565b80602001515b91505090565b60a960209081526000928352604080842090915290825290205481565b6117ec611151565b61182b576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6001600160a01b038116611875576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b6001600160a01b0381163014156118c3576040805162461bcd60e51b815260206004820152600d60248201526c77726f6e67206164647265737360981b604482015290519081900360640190fd5b6118cb612f4f565b5060408051606081018252609a546001600160a01b039081168252609b54166020820152609c549181018290529061190e576001600160a01b0382168152611931565b61191b8160400151612841565b156119315760208101516001600160a01b031681525b6001600160a01b0382166020820152611948611d84565b60408281018290528251609a80546001600160a01b03199081166001600160a01b0393841617909155602080860151609b805490931690841617909155609c9390935581519085168152339281019290925280517f26a68c9d9649fb5e7a060a37b211ffd1d9a4fe6eb068bfb33decba647d4ed5399281900390910190a15050565b600054610100900460ff16806119e357506119e36125dd565b806119f1575060005460ff16155b611a2c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613070602e913960400191505060405180910390fd5b600054610100900460ff16158015611a57576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038b16611aa1576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b611ab38a6001600160a01b0316612865565b611afd576040805162461bcd60e51b81526020600482015260166024820152756e6f74206120636f6e7472616374206164647265737360501b604482015290519081900360640190fd5b611b063361167e565b611b0e610e57565b609980546001600160a01b0319166001600160a01b038c16179055611b3288610cd6565b611b3b8761089b565b611b4486611012565b611b4d85610a74565b611b5884848461096c565b611b61896117e4565b611b6a8b611d25565b8015611b7c576000805461ff00191690555b5050505050505050505050565b62093a8081565b60408051606081018252609d548152609e546020820152609f5491810191909152600090610b8f9061244b565b60ab60209081526000928352604080842090915290825290205481565b600082118015611bf9575033600090815260ac60205260409020548211155b611c3d576040805162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c819195c1bdcda5d081a5960821b604482015290519081900360640190fd5b611c48338383612639565b611c5260016128a1565b609954604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b5051611d1b576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b61118460006128a1565b611d2d611151565b611d6c576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b610efb816128b4565b6099546001600160a01b031681565b4290565b600082820183811015611de2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60668054600101908190558315801590611e1d57506001600160a01b038516600090815260ac60205260409020548411155b611e61576040805162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c819195c1bdcda5d081a5960821b604482015290519081900360640190fd5b6001600160a01b038516600090815260a96020908152604080832087845290915290205415801590611eb657506001600160a01b038516600090815260a9602090815260408083208784529091529020548311155b611efc576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b600080611f0a878787612955565b91509150600085600014611f2d57611f28868463ffffffff611d8816565b611f52565b6001600160a01b038816600090815260a9602090815260408083208a84529091529020545b6001600160a01b038916600090815260a9602090815260408083208b8452909152902054909150611f89908263ffffffff61247316565b6001600160a01b038916600090815260a9602090815260408083208b845290915290205560ad54611fc0908263ffffffff61247316565b60ad556001600160a01b038816600090815260a9602090815260408083208a8452909152902054612010576001600160a01b038816600090815260aa602090815260408083208a84529091528120555b600085156121295761203c670de0b6b3a7640000610c9a61202f611b90565b859063ffffffff61252516565b905061204e828263ffffffff61247316565b6099549092506001600160a01b031663a9059cbb61206a61176f565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156120ba57600080fd5b505af11580156120ce573d6000803e3d6000fd5b505050506040513d60208110156120e457600080fd5b5051612129576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6099546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561217f57600080fd5b505af1158015612193573d6000803e3d6000fd5b505050506040513d60208110156121a957600080fd5b50516121ee576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038916600081815260a9602090815260408083208c845282529182902054825186815291820185905281830152606081018790526080810186905290518a92917f6b4651e8f4162f82274a25e57a29f7ed9156d17078e76dd4d05f04ba08831aa4919081900360a00190a3505050506066548114610894576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60028201546122cb578082556122e5565b6122d88260020154612841565b156122e557600182015482555b600182018190556122f4611d84565b82600201819055505050565b6000611de283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612bcf565b80612394576040805162461bcd60e51b815260206004820152601860248201527f73686f756c642062652067726561746572207468616e20300000000000000000604482015290519081900360640190fd5b600061239e611d84565b90508460060154600014156123db576040805160608101825285815260208101859052018290528385556001850183905560028501829055612416565b60068501546123f39062093a8063ffffffff611d8816565b811115612416576003850154855560048501546001860155600585015460028601555b604080516060810182528581526020810185905201829052600385019390935560048401919091556005830155600690910155565b600061245a8260400151612841565b61246557815161246b565b81602001515b90505b919050565b6000611de283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c71565b6000806000806124c48661257e565b9194509250905081850360008112156124e4576000945050505050611de5565b80612519612509612504856124f885612ccb565b9063ffffffff611d8816565b612d3a565b610c9a878463ffffffff61252516565b98975050505050505050565b60008261253457506000611de5565b8282028284828161254157fe5b0414611de25760405162461bcd60e51b815260040180806020018281038252602181526020018061302f6021913960400191505060405180910390fd5b60008060008061259e62093a808660060154611d8890919063ffffffff16565b6125a6611d84565b119050806125bf578454600186015460028701546125cf565b6003850154600486015460058701545b935093509350509193909250565b303b1590565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611595908490612d8b565b6066805460010190819055816126805760405162461bcd60e51b8152600401808060200182810382526024815260200180612fc86024913960400191505060405180910390fd5b600061268a610e3d565b505090508060001480156126a357506126a1610b62565b155b156126e8576040805162461bcd60e51b815260206004820152601060248201526f195b5a5cdcda5bdb881cdd1bdc1c195960821b604482015290519081900360640190fd5b6000806126f787876000612955565b6001600160a01b038916600090815260a9602090815260408083208b845290915281205492945090925090612732908763ffffffff611d8816565b6001600160a01b038916600090815260a9602090815260408083208b8452909152902081905560ad5490915061276e908763ffffffff611d8816565b60ad55612779611d84565b6001600160a01b038916600081815260aa602090815260408083208c8452825291829020939093558051898152928301849052828101869052606083018590525189927f0a5c854539f6e93fcd4a8397bfae8bdb751b4e819840f1c8681e6ad7ff19c5b5919081900360800190a3505050506066548114611593576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60006128568262093a8063ffffffff611d8816565b61285e611d84565b1192915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061289957508115155b949350505050565b60ae805460ff1916911515919091179055565b6001600160a01b0381166128f95760405162461bcd60e51b8152600401808060200182810382526026815260200180612fa26026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260a9602090815260408083208584529091528120548190818415612988578461298a565b815b6001600160a01b038816600090815260aa602090815260408083208a845290915281205491925090819081906129c09085610bce565b919450925090508215612bc057609954604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b158015612a2157600080fd5b505af1158015612a35573d6000803e3d6000fd5b505050506040513d6020811015612a4b57600080fd5b5051612a8f576040805162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c819985a5b195960921b604482015290519081900360640190fd5b612a9f858363ffffffff611d8816565b6001600160a01b038b16600090815260a9602090815260408083208d845290915290205560ad54612ad6908363ffffffff611d8816565b60ad556099546001600160a01b031663a9059cbb612af261176f565b612b02868663ffffffff61247316565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b5157600080fd5b505af1158015612b65573d6000803e3d6000fd5b505050506040513d6020811015612b7b57600080fd5b5051612bc0576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b90999098509650505050505050565b60008183612c5b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c20578181015183820152602001612c08565b50505050905090810190601f168015612c4d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c6757fe5b0495945050505050565b60008184841115612cc35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612c20578181015183820152602001612c08565b505050900390565b600081612cda5750600061246e565b81800282808281612ce757fe5b041461246b576040805162461bcd60e51b815260206004820152601f60248201527f457874656e6465644d6174683a207371756172696e67206f766572666c6f7700604482015290519081900360640190fd5b60006003821115612d7d575080600160028204015b81811015612d7757809150600281828581612d6657fe5b040181612d6f57fe5b049050612d4f565b5061246e565b811561246e57506001919050565b612d9d826001600160a01b0316612865565b612dee576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310612e2c5780518252601f199092019160209182019101612e0d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612e8e576040519150601f19603f3d011682016040523d82523d6000602084013e612e93565b606091505b509150915081612eea576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561159357808060200190516020811015612f0657600080fd5b50516115935760405162461bcd60e51b815260040180806020018281038252602a8152602001806130c5602a913960400191505060405180910390fd5b603280612f7083390190565b60408051606081018252600080825260208201819052918101919091529056fe60806040526040516032380380603283398181016040526020811015602357600080fd5b50516001600160a01b038116fffe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736465706f73697420616d6f756e742073686f756c64206265206d6f7265207468616e203073686f756c64206265206c657373207468616e206f7220657175616c20746f20612068616c66206f6620746865206d6178696d756d20656d697373696f6e2072617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656473686f756c64206265206c657373207468616e206f7220657175616c20746f20312065746865725361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656473686f756c646e27742062652067726561746572207468616e2033302064617973a265627a7a72315820a804559cde042b4f71d8d54f5b8311d3a5d7e4c6e39b57e7756638151e90c16064736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80638da5cb5b11610146578063c4d66de8116100c3578063db51ef9211610087578063db51ef9214610694578063ddca3f431461069c578063e0648a28146106a4578063e2bbb158146106d0578063f2fde38b146106f3578063fc0c546a1461071957610253565b8063c4d66de8146105b1578063c5401ce3146105d7578063cbf1304d146105df578063d64631511461060b578063d7004cc61461063157610253565b80639fc314c81161010a5780639fc314c8146104ab578063a4c0ed36146104e1578063b4a86c4814610566578063b6b55f251461056e578063c3bd8fd01461058b57610253565b80638da5cb5b146104235780638df67680146104475780638f32d59b1461044f57806394967fa11461046b5780639ee679e81461048e57610253565b806360c251c1116101d45780638129fc1c116101985780638129fc1c146103c2578063817b1cd2146103ca5780638235c378146103d2578063868867b5146103da5780638b53ccb3146103f757610253565b806360c251c11461036a57806360d4ffb01461037257806369fe0e2d14610395578063715018a6146103b257806375fa901b146103ba57610253565b8063416829901161021b578063416829901461031b578063436cc3d61461033857806347e318de14610352578063522ea5e21461035a5780635e9e230d1461036257610253565b8063181943591461025857806318cca7a61461028a578063224313fa146102af578063294a5b04146102cc5780632c3144da146102f5575b600080fd5b610260610721565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b6102ad600480360360408110156102a057600080fd5b508035906020013561073d565b005b6102ad600480360360208110156102c557600080fd5b503561089b565b6102ad600480360360608110156102e257600080fd5b508035906020810135906040013561096c565b6102fd610a68565b60408051938452602084019290925282820152519081900360600190f35b6102ad6004803603602081101561033157600080fd5b5035610a74565b610340610b4a565b60408051918252519081900360200190f35b6102fd610b56565b610340610b62565b6102fd610b95565b610340610ba1565b6102fd6004803603604081101561038857600080fd5b5080359060200135610bce565b6102ad600480360360208110156103ab57600080fd5b5035610cd6565b6102ad610dac565b6102fd610e3d565b6102ad610e57565b610340610efe565b610340610f04565b6102ad600480360360208110156103f057600080fd5b5035611012565b6103406004803603604081101561040d57600080fd5b506001600160a01b0381351690602001356110f8565b61042b611115565b604080516001600160a01b039092168252519081900360200190f35b610340611124565b610457611151565b604080519115158252519081900360200190f35b6102ad6004803603604081101561048157600080fd5b5080359060200135611177565b6102ad600480360360208110156104a457600080fd5b5035611188565b6102ad600480360360608110156104c157600080fd5b506001600160a01b0381358116916020810135909116906040013561123c565b610457600480360360608110156104f757600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561052757600080fd5b82018360208201111561053957600080fd5b8035906020019184600183028401116401000000008311171561055b57600080fd5b50909250905061159a565b6102fd61163e565b6102ad6004803603602081101561058457600080fd5b503561164a565b610340600480360360208110156105a157600080fd5b50356001600160a01b031661166c565b6102ad600480360360208110156105c757600080fd5b50356001600160a01b031661167e565b61042b61176f565b610340600480360360408110156105f557600080fd5b506001600160a01b0381351690602001356117c7565b6102ad6004803603602081101561062157600080fd5b50356001600160a01b03166117e4565b6102ad600480360361014081101561064857600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012001356119ca565b610340611b89565b610340611b90565b610340600480360360408110156106ba57600080fd5b506001600160a01b038135169060200135611bbd565b6102ad600480360360408110156106e657600080fd5b5080359060200135611bda565b6102ad6004803603602081101561070957600080fd5b50356001600160a01b0316611d25565b61042b611d75565b609a54609b54609c546001600160a01b03928316929091169083565b33600090815260ab60209081526040808320858452909152902054806107aa576040805162461bcd60e51b815260206004820152601b60248201527f7769746864726177616c207761736e2774207265717565737465640000000000604482015290519081900360640190fd5b60006107b4611d84565b905060006107d06107c3610ba1565b849063ffffffff611d8816565b905080821015610813576040805162461bcd60e51b8152602060048201526009602482015268746f6f206561726c7960b81b604482015290519081900360640190fd5b61082b61081e611124565b829063ffffffff611d8816565b8210610869576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b33600081815260ab602090815260408083208984529091528120819055610894919087908790611deb565b5050505050565b6108a3611151565b6108e2576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b62278d008111156109245760405162461bcd60e51b81526004018080602001828103825260218152602001806130ef6021913960400191505060405180910390fd5b61092f60a0826122ba565b6040805182815233602082015281517fb1effbb8dc5cfa97751137110a061198891986f1567677e11ec9449743180f74929181900390910190a150565b610974611151565b6109b3576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6109cc670214e8348c4f0000600263ffffffff61230016565b831115610a0a5760405162461bcd60e51b8152600401808060200182810382526043815260200180612fec6043913960600191505060405180910390fd5b610a1d60af84848463ffffffff61234216565b604080518481526020810184905280820183905233606082015290517fddf30262673035378258d8aab83a68d6d8b8e45e5510d3b295fcc7cd65c6378a9181900360800190a1505050565b60a05460a15460a25483565b610a7c611151565b610abb576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b670de0b6b3a7640000811115610b025760405162461bcd60e51b815260040180806020018281038252602781526020018061309e6027913960400191505060405180910390fd5b610b0d60a6826122ba565b6040805182815233602082015281517fb7b23f70fe41cd9debaaa54902f2492c79f94d7582d587844dc12fdc8fc42a2b929181900390910190a150565b670214e8348c4f000081565b609d54609e54609f5483565b6040805160608101825260a654815260a754602082015260a85491810191909152600090610b8f9061244b565b90505b90565b60a35460a45460a55483565b6040805160608101825260a054815260a154602082015260a25491810191909152600090610b8f9061244b565b60008080831580610bdd575084155b15610bf057506000915081905080610ccf565b610c0885610bfc611d84565b9063ffffffff61247316565b905080610c1d57506000915081905080610ccf565b6000610c3060af8363ffffffff6124b516565b9050610c3d61081e610f04565b905080610c51575060009250829150610ccf565b670214e8348c4f0000811115610c6357fe5b610ca66a1a1601fc4ea7109e000000610c9a84610c8e89670214e8348c4f000063ffffffff61252516565b9063ffffffff61252516565b9063ffffffff61230016565b9350610ccb6a1a1601fc4ea7109e000000610c9a84610c8e898663ffffffff61252516565b9250505b9250925092565b610cde611151565b610d1d576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b670de0b6b3a7640000811115610d645760405162461bcd60e51b815260040180806020018281038252602781526020018061309e6027913960400191505060405180910390fd5b610d6f609d826122ba565b6040805182815233602082015281517fc8242dc5446855370b781abbfc5d882af1d1a3cc29143216aba3558feb0ce925929181900390910190a150565b610db4611151565b610df3576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6000806000610e4c60af61257e565b925092509250909192565b600054610100900460ff1680610e705750610e706125dd565b80610e7e575060005460ff16155b610eb95760405162461bcd60e51b815260040180806020018281038252602e815260200180613070602e913960400191505060405180910390fd5b600054610100900460ff16158015610ee4576000805460ff1961ff0019909116610100171660011790555b60016066558015610efb576000805461ff00191690555b50565b60ad5481565b600080609960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5557600080fd5b505afa158015610f69573d6000803e3d6000fd5b505050506040513d6020811015610f7f57600080fd5b505190506000610f8d610b62565b905080610f9f57600092505050610b92565b6000610fbd670de0b6b3a7640000610c9a858563ffffffff61252516565b90506000610fda670214e8348c4f0000600263ffffffff61230016565b90508160ad5410610ff0579350610b9292505050565b61100982610c9a60ad548461252590919063ffffffff16565b94505050505090565b61101a611151565b611059576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b610e108110156110b0576040805162461bcd60e51b815260206004820152601d60248201527f73686f756c646e2774206265206c657373207468616e203120686f7572000000604482015290519081900360640190fd5b6110bb60a3826122ba565b6040805182815233602082015281517f3a963fa1d1d0da205f1ae9869aa14bf4ff7a4585efa819b0c94326b4a3e1e228929181900390910190a150565b60aa60209081526000928352604080842090915290825290205481565b6033546001600160a01b031690565b6040805160608101825260a354815260a454602082015260a55491810191909152600090610b8f9061244b565b6033546000906001600160a01b03166111686125e3565b6001600160a01b031614905090565b6111843383836001611deb565b5050565b6000811180156111a7575033600090815260ac60205260409020548111155b6111eb576040805162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c819195c1bdcda5d081a5960821b604482015290519081900360640190fd5b6111f3611d84565b33600081815260ab6020908152604080832086845290915280822093909355915183927fe670e4e82118d22a1f9ee18920455ebc958bae26a90a05d31d3378788b1b0e4491a350565b611244611151565b611283576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6001600160a01b038216158015906112a457506001600160a01b0382163014155b6112ed576040805162461bcd60e51b81526020600482015260156024820152741b9bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b60008111611342576040805162461bcd60e51b815260206004820152601f60248201527f616d6f756e742073686f756c642062652067726561746572207468616e203000604482015290519081900360640190fd5b6001600160a01b0383166113bc576040516001600160a01b0383169082156108fc029083906000818181858888f193505050506113b757808260405161138790612f43565b6001600160a01b039091168152604051908190036020019082f0801580156113b3573d6000803e3d6000fd5b5050505b611595565b6099546001600160a01b03848116911614156115785760ad54609954604080516370a0823160e01b815230600482015290516000936114619390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561142957600080fd5b505afa15801561143d573d6000803e3d6000fd5b505050506040513d602081101561145357600080fd5b50519063ffffffff61247316565b9050818110156114ad576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b6099546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561150357600080fd5b505af1158015611517573d6000803e3d6000fd5b505050506040513d602081101561152d57600080fd5b5051611572576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b50611595565b826115936001600160a01b038216848463ffffffff6125e716565b505b505050565b6099546000906001600160a01b031633146115fc576040805162461bcd60e51b815260206004820152601e60248201527f6f6e6c7920746f6b656e20636f6e747261637420697320616c6c6f7765640000604482015290519081900360640190fd5b60ae5460ff16611633576001600160a01b038516600090815260ac6020526040902080546001019081905561163390869086612639565b506001949350505050565b60a65460a75460a85483565b33600090815260ac60205260409020805460010190819055610efb9082611bda565b60ac6020526000908152604090205481565b600054610100900460ff168061169757506116976125dd565b806116a5575060005460ff16155b6116e05760405162461bcd60e51b815260040180806020018281038252602e815260200180613070602e913960400191505060405180910390fd5b600054610100900460ff1615801561170b576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015611184576000805461ff00191690555050565b6000611779612f4f565b5060408051606081018252609a546001600160a01b039081168252609b54166020820152609c54918101829052906117b090612841565b6117bb5780516117c1565b80602001515b91505090565b60a960209081526000928352604080842090915290825290205481565b6117ec611151565b61182b576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b6001600160a01b038116611875576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b6001600160a01b0381163014156118c3576040805162461bcd60e51b815260206004820152600d60248201526c77726f6e67206164647265737360981b604482015290519081900360640190fd5b6118cb612f4f565b5060408051606081018252609a546001600160a01b039081168252609b54166020820152609c549181018290529061190e576001600160a01b0382168152611931565b61191b8160400151612841565b156119315760208101516001600160a01b031681525b6001600160a01b0382166020820152611948611d84565b60408281018290528251609a80546001600160a01b03199081166001600160a01b0393841617909155602080860151609b805490931690841617909155609c9390935581519085168152339281019290925280517f26a68c9d9649fb5e7a060a37b211ffd1d9a4fe6eb068bfb33decba647d4ed5399281900390910190a15050565b600054610100900460ff16806119e357506119e36125dd565b806119f1575060005460ff16155b611a2c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613070602e913960400191505060405180910390fd5b600054610100900460ff16158015611a57576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038b16611aa1576040805162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015290519081900360640190fd5b611ab38a6001600160a01b0316612865565b611afd576040805162461bcd60e51b81526020600482015260166024820152756e6f74206120636f6e7472616374206164647265737360501b604482015290519081900360640190fd5b611b063361167e565b611b0e610e57565b609980546001600160a01b0319166001600160a01b038c16179055611b3288610cd6565b611b3b8761089b565b611b4486611012565b611b4d85610a74565b611b5884848461096c565b611b61896117e4565b611b6a8b611d25565b8015611b7c576000805461ff00191690555b5050505050505050505050565b62093a8081565b60408051606081018252609d548152609e546020820152609f5491810191909152600090610b8f9061244b565b60ab60209081526000928352604080842090915290825290205481565b600082118015611bf9575033600090815260ac60205260409020548211155b611c3d576040805162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c819195c1bdcda5d081a5960821b604482015290519081900360640190fd5b611c48338383612639565b611c5260016128a1565b609954604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b5051611d1b576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b61118460006128a1565b611d2d611151565b611d6c576040805162461bcd60e51b81526020600482018190526024820152600080516020613050833981519152604482015290519081900360640190fd5b610efb816128b4565b6099546001600160a01b031681565b4290565b600082820183811015611de2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60668054600101908190558315801590611e1d57506001600160a01b038516600090815260ac60205260409020548411155b611e61576040805162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c819195c1bdcda5d081a5960821b604482015290519081900360640190fd5b6001600160a01b038516600090815260a96020908152604080832087845290915290205415801590611eb657506001600160a01b038516600090815260a9602090815260408083208784529091529020548311155b611efc576040805162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b604482015290519081900360640190fd5b600080611f0a878787612955565b91509150600085600014611f2d57611f28868463ffffffff611d8816565b611f52565b6001600160a01b038816600090815260a9602090815260408083208a84529091529020545b6001600160a01b038916600090815260a9602090815260408083208b8452909152902054909150611f89908263ffffffff61247316565b6001600160a01b038916600090815260a9602090815260408083208b845290915290205560ad54611fc0908263ffffffff61247316565b60ad556001600160a01b038816600090815260a9602090815260408083208a8452909152902054612010576001600160a01b038816600090815260aa602090815260408083208a84529091528120555b600085156121295761203c670de0b6b3a7640000610c9a61202f611b90565b859063ffffffff61252516565b905061204e828263ffffffff61247316565b6099549092506001600160a01b031663a9059cbb61206a61176f565b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156120ba57600080fd5b505af11580156120ce573d6000803e3d6000fd5b505050506040513d60208110156120e457600080fd5b5051612129576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6099546040805163a9059cbb60e01b81526001600160a01b038c81166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561217f57600080fd5b505af1158015612193573d6000803e3d6000fd5b505050506040513d60208110156121a957600080fd5b50516121ee576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b038916600081815260a9602090815260408083208c845282529182902054825186815291820185905281830152606081018790526080810186905290518a92917f6b4651e8f4162f82274a25e57a29f7ed9156d17078e76dd4d05f04ba08831aa4919081900360a00190a3505050506066548114610894576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60028201546122cb578082556122e5565b6122d88260020154612841565b156122e557600182015482555b600182018190556122f4611d84565b82600201819055505050565b6000611de283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612bcf565b80612394576040805162461bcd60e51b815260206004820152601860248201527f73686f756c642062652067726561746572207468616e20300000000000000000604482015290519081900360640190fd5b600061239e611d84565b90508460060154600014156123db576040805160608101825285815260208101859052018290528385556001850183905560028501829055612416565b60068501546123f39062093a8063ffffffff611d8816565b811115612416576003850154855560048501546001860155600585015460028601555b604080516060810182528581526020810185905201829052600385019390935560048401919091556005830155600690910155565b600061245a8260400151612841565b61246557815161246b565b81602001515b90505b919050565b6000611de283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c71565b6000806000806124c48661257e565b9194509250905081850360008112156124e4576000945050505050611de5565b80612519612509612504856124f885612ccb565b9063ffffffff611d8816565b612d3a565b610c9a878463ffffffff61252516565b98975050505050505050565b60008261253457506000611de5565b8282028284828161254157fe5b0414611de25760405162461bcd60e51b815260040180806020018281038252602181526020018061302f6021913960400191505060405180910390fd5b60008060008061259e62093a808660060154611d8890919063ffffffff16565b6125a6611d84565b119050806125bf578454600186015460028701546125cf565b6003850154600486015460058701545b935093509350509193909250565b303b1590565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611595908490612d8b565b6066805460010190819055816126805760405162461bcd60e51b8152600401808060200182810382526024815260200180612fc86024913960400191505060405180910390fd5b600061268a610e3d565b505090508060001480156126a357506126a1610b62565b155b156126e8576040805162461bcd60e51b815260206004820152601060248201526f195b5a5cdcda5bdb881cdd1bdc1c195960821b604482015290519081900360640190fd5b6000806126f787876000612955565b6001600160a01b038916600090815260a9602090815260408083208b845290915281205492945090925090612732908763ffffffff611d8816565b6001600160a01b038916600090815260a9602090815260408083208b8452909152902081905560ad5490915061276e908763ffffffff611d8816565b60ad55612779611d84565b6001600160a01b038916600081815260aa602090815260408083208c8452825291829020939093558051898152928301849052828101869052606083018590525189927f0a5c854539f6e93fcd4a8397bfae8bdb751b4e819840f1c8681e6ad7ff19c5b5919081900360800190a3505050506066548114611593576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60006128568262093a8063ffffffff611d8816565b61285e611d84565b1192915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061289957508115155b949350505050565b60ae805460ff1916911515919091179055565b6001600160a01b0381166128f95760405162461bcd60e51b8152600401808060200182810382526026815260200180612fa26026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260a9602090815260408083208584529091528120548190818415612988578461298a565b815b6001600160a01b038816600090815260aa602090815260408083208a845290915281205491925090819081906129c09085610bce565b919450925090508215612bc057609954604080516340c10f1960e01b81523060048201526024810186905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b158015612a2157600080fd5b505af1158015612a35573d6000803e3d6000fd5b505050506040513d6020811015612a4b57600080fd5b5051612a8f576040805162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c819985a5b195960921b604482015290519081900360640190fd5b612a9f858363ffffffff611d8816565b6001600160a01b038b16600090815260a9602090815260408083208d845290915290205560ad54612ad6908363ffffffff611d8816565b60ad556099546001600160a01b031663a9059cbb612af261176f565b612b02868663ffffffff61247316565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b5157600080fd5b505af1158015612b65573d6000803e3d6000fd5b505050506040513d6020811015612b7b57600080fd5b5051612bc0576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b90999098509650505050505050565b60008183612c5b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c20578181015183820152602001612c08565b50505050905090810190601f168015612c4d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c6757fe5b0495945050505050565b60008184841115612cc35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612c20578181015183820152602001612c08565b505050900390565b600081612cda5750600061246e565b81800282808281612ce757fe5b041461246b576040805162461bcd60e51b815260206004820152601f60248201527f457874656e6465644d6174683a207371756172696e67206f766572666c6f7700604482015290519081900360640190fd5b60006003821115612d7d575080600160028204015b81811015612d7757809150600281828581612d6657fe5b040181612d6f57fe5b049050612d4f565b5061246e565b811561246e57506001919050565b612d9d826001600160a01b0316612865565b612dee576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310612e2c5780518252601f199092019160209182019101612e0d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612e8e576040519150601f19603f3d011682016040523d82523d6000602084013e612e93565b606091505b509150915081612eea576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561159357808060200190516020811015612f0657600080fd5b50516115935760405162461bcd60e51b815260040180806020018281038252602a8152602001806130c5602a913960400191505060405180910390fd5b603280612f7083390190565b60408051606081018252600080825260208201819052918101919091529056fe60806040526040516032380380603283398181016040526020811015602357600080fd5b50516001600160a01b038116fffe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736465706f73697420616d6f756e742073686f756c64206265206d6f7265207468616e203073686f756c64206265206c657373207468616e206f7220657175616c20746f20612068616c66206f6620746865206d6178696d756d20656d697373696f6e2072617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656473686f756c64206265206c657373207468616e206f7220657175616c20746f20312065746865725361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656473686f756c646e27742062652067726561746572207468616e2033302064617973a265627a7a72315820a804559cde042b4f71d8d54f5b8311d3a5d7e4c6e39b57e7756638151e90c16064736f6c63430005100032
Deployed Bytecode Sourcemap
26013:24187:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26013:24187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30100:56;;;:::i;:::-;;;;-1:-1:-1;;;;;30100:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;36901:598;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36901:598:0;;;;;;;:::i;:::-;;39312:275;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39312:275:0;;:::i;40899:315::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40899:315:0;;;;;;;;;;;;:::i;30344:44::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;40281:266;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40281:266:0;;:::i;29547:54::-;;;:::i;:::-;;;;;;;;;;;;;;;;30220:25;;;:::i;42752:127::-;;;:::i;30500:46::-;;;:::i;42309:137::-;;;:::i;44150:784::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44150:784:0;;;;;;;:::i;38876:224::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38876:224:0;;:::i;14617:140::-;;;:::i;44996:134::-;;;:::i;22637:218::-;;;:::i;31150:26::-;;;:::i;43330:525::-;;;:::i;39812:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39812:277:0;;:::i;30822:69::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30822:69:0;;;;;;;;:::i;13804:79::-;;;:::i;:::-;;;;-1:-1:-1;;;;;13804:79:0;;;;;;;;;;;;;;42532:141;;;:::i;14170:94::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;35664:143;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35664:143:0;;;;;;;:::i;36119:288::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36119:288:0;;:::i;37864:850::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37864:850:0;;;;;;;;;;;;;;;;;:::i;35080:314::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;35080:314:0;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;35080:314:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;35080:314:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;35080:314:0;;-1:-1:-1;35080:314:0;-1:-1:-1;35080:314:0;:::i;30627:39::-;;;:::i;33565:108::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33565:108:0;;:::i;31061:50::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31061:50:0;-1:-1:-1;;;;;31061:50:0;;:::i;13578:145::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13578:145:0;-1:-1:-1;;;;;13578:145:0;;:::i;42973:249::-;;;:::i;30713:65::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30713:65:0;;;;;;;;:::i;41384:679::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41384:679:0;-1:-1:-1;;;;;41384:679:0;;:::i;32256:1066::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32256:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29696:51::-;;;:::i;42126:99::-;;;:::i;30946:80::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30946:80:0;;;;;;;;:::i;34298:367::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34298:367:0;;;;;;;:::i;14912:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14912:109:0;-1:-1:-1;;;;;14912:109:0;;:::i;29776:27::-;;;:::i;30100:56::-;;;;;;;-1:-1:-1;;;;;30100:56:0;;;;;;;;;:::o;36901:598::-;37037:10;36991:19;37013:35;;;:23;:35;;;;;;;;:47;;;;;;;;;37079:15;37071:55;;;;;-1:-1:-1;;;37071:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37137:17;37157:6;:4;:6::i;:::-;37137:26;;37174:15;37192:41;37208:24;:22;:24::i;:::-;37192:11;;:41;:15;:41;:::i;:::-;37174:59;;37265:7;37252:9;:20;;37244:42;;;;;-1:-1:-1;;;37244:42:0;;;;;;;;;;;;-1:-1:-1;;;37244:42:0;;;;;;;;;;;;;;;37317:39;37329:26;:24;:26::i;:::-;37317:7;;:39;:11;:39;:::i;:::-;37305:9;:51;37297:72;;;;;-1:-1:-1;;;37297:72:0;;;;;;;;;;;;-1:-1:-1;;;37297:72:0;;;;;;;;;;;;;;;37404:10;37430:1;37380:35;;;:23;:35;;;;;;;;:47;;;;;;;;:51;;;37442:49;;37404:10;37416;;37476:7;;37442:9;:49::i;:::-;36901:598;;;;;:::o;39312:275::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;39409:7;39399:6;:17;;39391:63;;;;-1:-1:-1;;;39391:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39465:53;39482:27;39511:6;39465:16;:53::i;:::-;39534:45;;;;;;39568:10;39534:45;;;;;;;;;;;;;;;;;39312:275;:::o;40899:315::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;41006:24;29591:10;41028:1;41006:24;:21;:24;:::i;:::-;41000:2;:30;;40992:110;;;;-1:-1:-1;;;40992:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41113:33;:7;41135:2;41139;41143;41113:33;:21;:33;:::i;:::-;41162:44;;;;;;;;;;;;;;;;;;41195:10;41162:44;;;;;;;;;;;;;;;40899:315;;;:::o;30344:44::-;;;;;;;;:::o;40281:266::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;40373:7;40363:6;:17;;40355:69;;;;-1:-1:-1;;;40355:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40435:48;40452:22;40476:6;40435:16;:48::i;:::-;40499:40;;;;;;40528:10;40499:40;;;;;;;;;;;;;;;;;40281:266;:::o;29547:54::-;29591:10;29547:54;:::o;30220:25::-;;;;;;;;:::o;42752:127::-;42829:42;;;;;;;;42848:22;42829:42;;;;;;;;;;;;;;;;;;42802:7;;42829:42;;:18;:42::i;:::-;42822:49;;42752:127;;:::o;30500:46::-;;;;;;;;:::o;42309:137::-;42391:47;;;;;;;;42410:27;42391:47;;;;;;;;;;;;;;;;;;42364:7;;42391:47;;:18;:47::i;44150:784::-;44263:13;;;44332:12;;;:33;;-1:-1:-1;44348:17:0;;44332:33;44328:55;;;-1:-1:-1;44375:1:0;;-1:-1:-1;44375:1:0;;-1:-1:-1;44375:1:0;44367:16;;44328:55;44407:24;44418:12;44407:6;:4;:6::i;:::-;:10;:24;:10;:24;:::i;:::-;44394:37;-1:-1:-1;44446:15:0;44442:37;;-1:-1:-1;44471:1:0;;-1:-1:-1;44471:1:0;;-1:-1:-1;44471:1:0;44463:16;;44442:37;44490:24;44517:37;:7;44542:10;44517:37;:17;:37;:::i;:::-;44490:64;;44584:50;44605:28;:26;:28::i;44584:50::-;44565:69;-1:-1:-1;44649:21:0;44645:52;;-1:-1:-1;44680:1:0;;-1:-1:-1;44680:1:0;;-1:-1:-1;44672:25:0;;44645:52;29591:10;44715:16;:37;;44708:45;;;;44772:66;44823:14;44772:46;44807:10;44772:30;:7;29591:10;44772:30;:11;:30;:::i;:::-;:34;:46;:34;:46;:::i;:::-;:50;:66;:50;:66;:::i;:::-;44764:74;-1:-1:-1;44861:65:0;44911:14;44861:45;44895:10;44861:29;:7;44873:16;44861:29;:11;:29;:::i;:65::-;44849:77;;44150:784;;;;;;;:::o;38876:224::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;38954:7;38944:6;:17;;38936:69;;;;-1:-1:-1;;;38936:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39016:34;39033:8;39043:6;39016:16;:34::i;:::-;39066:26;;;;;;39081:10;39066:26;;;;;;;;;;;;;;;;;38876:224;:::o;14617:140::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;14700:6;;14679:40;;14716:1;;-1:-1:-1;;;;;14700:6:0;;14679:40;;14716:1;;14679:40;14730:6;:19;;-1:-1:-1;;;;;;14730:19:0;;;14617:140::o;44996:134::-;45049:9;45060:8;45070:9;45099:23;:7;:21;:23::i;:::-;45092:30;;;;;;44996:134;;;:::o;22637:218::-;10767:12;;;;;;;;:31;;;10783:15;:13;:15::i;:::-;10767:47;;;-1:-1:-1;10803:11:0;;;;10802:12;10767:47;10759:106;;;;-1:-1:-1;;;10759:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10874:19;10897:12;;;;;;10896:13;10916:83;;;;10945:12;:19;;-1:-1:-1;;;;10945:19:0;;;;;10973:18;10960:4;10973:18;;;10916:83;22846:1;22830:13;:17;11017:57;;;;11061:5;11046:20;;-1:-1:-1;;11046:20:0;;;11017:57;22637:218;:::o;31150:26::-;;;;:::o;43330:525::-;43389:7;43409:19;43431:5;;;;;;;;;-1:-1:-1;;;;;43431:5:0;-1:-1:-1;;;;;43431:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43431:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43431:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43431:19:0;;-1:-1:-1;43461:14:0;43478:19;:17;:19::i;:::-;43461:36;-1:-1:-1;43512:11:0;43508:25;;43532:1;43525:8;;;;;;43508:25;43544:14;43561:36;43589:7;43561:23;:11;43577:6;43561:23;:15;:23;:::i;:36::-;43544:53;-1:-1:-1;43608:34:0;43645:24;29591:10;43667:1;43645:24;:21;:24;:::i;:::-;43608:61;;43707:6;43692:11;;:21;43688:87;;43737:26;-1:-1:-1;43730:33:0;;-1:-1:-1;;;43730:33:0;43688:87;43792:55;43840:6;43792:43;43823:11;;43792:26;:30;;:43;;;;:::i;:55::-;43785:62;;;;;;43330:525;:::o;39812:277::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;39911:7;39901:6;:17;;39893:59;;;;;-1:-1:-1;;;39893:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39963:55;39980:29;40011:6;39963:16;:55::i;:::-;40034:47;;;;;;40070:10;40034:47;;;;;;;;;;;;;;;;;39812:277;:::o;30822:69::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;13804:79::-;13869:6;;-1:-1:-1;;;;;13869:6:0;13804:79;:::o;42532:141::-;42616:49;;;;;;;;42635:29;42616:49;;;;;;;;;;;;;;;;;;42589:7;;42616:49;;:18;:49::i;14170:94::-;14250:6;;14210:4;;-1:-1:-1;;;;;14250:6:0;14234:12;:10;:12::i;:::-;-1:-1:-1;;;;;14234:22:0;;14227:29;;14170:94;:::o;35664:143::-;35751:48;35761:10;35773;35785:7;35794:4;35751:9;:48::i;:::-;35664:143;;:::o;36119:288::-;36207:1;36194:10;:14;:58;;;;-1:-1:-1;36241:10:0;36226:26;;;;:14;:26;;;;;;36212:40;;;36194:58;36186:87;;;;;-1:-1:-1;;;36186:87:0;;;;;;;;;;;;-1:-1:-1;;;36186:87:0;;;;;;;;;;;;;;;36334:6;:4;:6::i;:::-;36308:10;36284:35;;;;:23;:35;;;;;;;;:47;;;;;;;;;:56;;;;36356:43;;36320:10;;36356:43;;;36119:288;:::o;37864:850::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37977:17:0;;;;;;:41;;-1:-1:-1;;;;;;37998:20:0;;38013:4;37998:20;;37977:41;37969:75;;;;;-1:-1:-1;;;37969:75:0;;;;;;;;;;;;-1:-1:-1;;;37969:75:0;;;;;;;;;;;;;;;38073:1;38063:7;:11;38055:55;;;;;-1:-1:-1;;;38055:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38125:20:0;;38121:586;;38167:17;;-1:-1:-1;;;;;38167:8:0;;;:17;;;;;38176:7;;38167:17;;;;38176:7;38167:8;:17;;;;;;;38162:134;;38267:7;38276:3;38245:35;;;;;:::i;:::-;-1:-1:-1;;;;;38245:35:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;38162:134:0;38121:586;;;38335:5;;-1:-1:-1;;;;;38317:24:0;;;38335:5;;38317:24;38313:394;;;38419:11;;38384:5;;:30;;;-1:-1:-1;;;38384:30:0;;38408:4;38384:30;;;;;;38358:23;;38384:47;;38419:11;;-1:-1:-1;;;;;38384:5:0;;;;:15;;:30;;;;;;;;;;;;;;;:5;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;38384:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38384:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38384:30:0;;:47;:34;:47;:::i;:::-;38358:73;;38473:7;38454:15;:26;;38446:57;;;;;-1:-1:-1;;;38446:57:0;;;;;;;;;;;;-1:-1:-1;;;38446:57:0;;;;;;;;;;;;;;;38526:5;;:28;;;-1:-1:-1;;;38526:28:0;;-1:-1:-1;;;;;38526:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;:5;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;38526:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38526:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38526:28:0;38518:56;;;;;-1:-1:-1;;;38518:56:0;;;;;;;;;;;;-1:-1:-1;;;38518:56:0;;;;;;;;;;;;;;;38313:394;;;;38635:6;38657:38;-1:-1:-1;;;;;38657:24:0;;38682:3;38687:7;38657:38;:24;:38;:::i;:::-;38313:394;;37864:850;;;:::o;35080:314::-;35220:5;;35173:4;;-1:-1:-1;;;;;35220:5:0;35198:10;:28;35190:71;;;;;-1:-1:-1;;;35190:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35277:6;;;;35272:93;;-1:-1:-1;;;;;35320:23:0;;;;;;:14;:23;;;;;35318:25;;;;;;;;35300:53;;35309:7;;35345;35300:8;:53::i;:::-;-1:-1:-1;35382:4:0;35080:314;;;;;;:::o;30627:39::-;;;;;;;;:::o;33565:108::-;33644:10;33629:26;;;;:14;:26;;;;;33627:28;;;;;;;;33619:46;;33657:7;33619;:46::i;31061:50::-;;;;;;;;;;;;;:::o;13578:145::-;10767:12;;;;;;;;:31;;;10783:15;:13;:15::i;:::-;10767:47;;;-1:-1:-1;10803:11:0;;;;10802:12;10767:47;10759:106;;;;-1:-1:-1;;;10759:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10874:19;10897:12;;;;;;10896:13;10916:83;;;;10945:12;:19;;-1:-1:-1;;;;10945:19:0;;;;;10973:18;10960:4;10973:18;;;10916:83;13644:6;:15;;-1:-1:-1;;;;;;13644:15:0;-1:-1:-1;;;;;13644:15:0;;;;;;;;;;;13675:40;;13708:6;;;-1:-1:-1;;13675:40:0;;-1:-1:-1;;13675:40:0;11021:14;11017:57;;;11061:5;11046:20;;-1:-1:-1;;11046:20:0;;;13578:145;;:::o;42973:249::-;43037:7;43057:25;;:::i;:::-;-1:-1:-1;43057:64:0;;;;;;;;43085:36;43057:64;-1:-1:-1;;;;;43057:64:0;;;;;;;;;;;;;;;;;;;;;43139:41;;:24;:41::i;:::-;:75;;43200:14;;43139:75;;;43183:5;:14;;;43139:75;43132:82;;;42973:249;:::o;30713:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;41384:679::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41482:22:0;;41474:47;;;;;-1:-1:-1;;;41474:47:0;;;;;;;;;;;;-1:-1:-1;;;41474:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41540:25:0;;41560:4;41540:25;;41532:51;;;;;-1:-1:-1;;;41532:51:0;;;;;;;;;;;;-1:-1:-1;;;41532:51:0;;;;;;;;;;;;;;;41594:25;;:::i;:::-;-1:-1:-1;41594:64:0;;;;;;;;41622:36;41594:64;-1:-1:-1;;;;;41594:64:0;;;;;;;;;;;;;;;;;;;;;41669:189;;-1:-1:-1;;;;;41710:25:0;;;;41669:189;;;41757:41;41782:5;:15;;;41757:24;:41::i;:::-;41753:105;;;41832:14;;;;-1:-1:-1;;;;;41815:31:0;;;41753:105;-1:-1:-1;;;;;41868:25:0;;:14;;;:25;41922:6;:4;:6::i;:::-;41904:15;;;;:24;;;41939:44;;:36;:44;;-1:-1:-1;;;;;;41939:44:0;;;-1:-1:-1;;;;;41939:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41999:56;;;;;;;42044:10;41999:56;;;;;;;;;;;;;;;;;;;14073:1;41384:679;:::o;32256:1066::-;10767:12;;;;;;;;:31;;;10783:15;:13;:15::i;:::-;10767:47;;;-1:-1:-1;10803:11:0;;;;10802:12;10767:47;10759:106;;;;-1:-1:-1;;;10759:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10874:19;10897:12;;;;;;10896:13;10916:83;;;;10945:12;:19;;-1:-1:-1;;;;10945:19:0;;;;;10973:18;10960:4;10973:18;;;10916:83;-1:-1:-1;;;;;32675:20:0;;32667:45;;;;;-1:-1:-1;;;32667:45:0;;;;;;;;;;;;-1:-1:-1;;;32667:45:0;;;;;;;;;;;;;;;32731:26;:13;-1:-1:-1;;;;;32731:24:0;;:26::i;:::-;32723:61;;;;;-1:-1:-1;;;32723:61:0;;;;;;;;;;;;-1:-1:-1;;;32723:61:0;;;;;;;;;;;;;;;32795:30;32814:10;32795:18;:30::i;:::-;32836:28;:26;:28::i;:::-;32875:5;:37;;-1:-1:-1;;;;;;32875:37:0;-1:-1:-1;;;;;32875:37:0;;;;;32923:12;32930:4;32923:6;:12::i;:::-;32946:50;32972:23;32946:25;:50::i;:::-;33007:54;33035:25;33007:27;:54::i;:::-;33072:40;33093:18;33072:20;:40::i;:::-;33123:68;33144:14;33160;33176;33123:20;:68::i;:::-;33202;33237:32;33202:34;:68::i;:::-;33281:33;33307:6;33281:25;:33::i;:::-;11021:14;11017:57;;;11061:5;11046:20;;-1:-1:-1;;11046:20:0;;;11017:57;32256:1066;;;;;;;;;;;:::o;29696:51::-;29741:6;29696:51;:::o;42126:99::-;42189:28;;;;;;;;42208:8;42189:28;;;;;;;;;;;;;;;;;;42162:7;;42189:28;;:18;:28::i;30946:80::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;34298:367::-;34391:1;34378:10;:14;:58;;;;-1:-1:-1;34425:10:0;34410:26;;;;:14;:26;;;;;;34396:40;;;34378:58;34370:87;;;;;-1:-1:-1;;;34370:87:0;;;;;;;;;;;;-1:-1:-1;;;34370:87:0;;;;;;;;;;;;;;;34468:41;34477:10;34489;34501:7;34468:8;:41::i;:::-;34520:16;34531:4;34520:10;:16::i;:::-;34555:5;;:54;;;-1:-1:-1;;;34555:54:0;;34574:10;34555:54;;;;34594:4;34555:54;;;;;;;;;;;;-1:-1:-1;;;;;34555:5:0;;;;:18;;:54;;;;;;;;;;;;;;;:5;;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;34555:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34555:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34555:54:0;34547:82;;;;;-1:-1:-1;;;34547:82:0;;;;;;;;;;;;-1:-1:-1;;;34547:82:0;;;;;;;;;;;;;;;34640:17;34651:5;34640:10;:17::i;14912:109::-;14016:9;:7;:9::i;:::-;14008:54;;;;;-1:-1:-1;;;14008:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14008:54:0;;;;;;;;;;;;;;;14985:28;15004:8;14985:18;:28::i;29776:27::-;;;-1:-1:-1;;;;;29776:27:0;;:::o;49893:304::-;50137:3;49893:304;:::o;4589:181::-;4647:7;4679:5;;;4703:6;;;;4695:46;;;;;-1:-1:-1;;;4695:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4761:1;-1:-1:-1;4589:181:0;;;;;:::o;46431:1145::-;23274:13;:18;;23291:1;23274:18;;;;;46552:7;;;;;:41;;-1:-1:-1;;;;;;46570:23:0;;;;;;:14;:23;;;;;;46563:30;;;46552:41;46544:70;;;;;-1:-1:-1;;;46544:70:0;;;;;;;;;;;;-1:-1:-1;;;46544:70:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46633:17:0;;46658:1;46633:17;;;:8;:17;;;;;;;;:22;;;;;;;;;:26;;;;:63;;-1:-1:-1;;;;;;46663:17:0;;;;;;:8;:17;;;;;;;;:22;;;;;;;;;:33;-1:-1:-1;46663:33:0;46633:63;46625:94;;;;;-1:-1:-1;;;46625:94:0;;;;;;;;;;;;-1:-1:-1;;;46625:94:0;;;;;;;;;;;;;;;46731:23;46756:18;46778:28;46784:7;46793:3;46798:7;46778:5;:28::i;:::-;46730:76;;;;46817:14;46834:7;46845:1;46834:12;:68;;46874:28;:7;46886:15;46874:28;:11;:28;:::i;:::-;46834:68;;;-1:-1:-1;;;;;46849:17:0;;;;;;:8;:17;;;;;;;;:22;;;;;;;;;46834:68;-1:-1:-1;;;;;46938:17:0;;;;;;:8;:17;;;;;;;;:22;;;;;;;;;46817:85;;-1:-1:-1;46938:34:0;;46817:85;46938:34;:26;:34;:::i;:::-;-1:-1:-1;;;;;46913:17:0;;;;;;:8;:17;;;;;;;;:22;;;;;;;;:59;46997:11;;:23;;47013:6;46997:23;:15;:23;:::i;:::-;46983:11;:37;-1:-1:-1;;;;;47035:17:0;;;;;;:8;:17;;;;;;;;:22;;;;;;;;;47031:90;;-1:-1:-1;;;;;47079:21:0;;47108:1;47079:21;;;:12;:21;;;;;;;;:26;;;;;;;;:30;47031:90;47131:16;47162:227;;;;47201:30;47223:7;47201:17;47212:5;:3;:5::i;:::-;47201:6;;:17;:10;:17;:::i;:30::-;47190:41;-1:-1:-1;47255:20:0;:6;47190:41;47255:20;:10;:20;:::i;:::-;47298:5;;47246:29;;-1:-1:-1;;;;;;47298:5:0;:14;47313:33;:31;:33::i;:::-;47348:8;47298:59;;;;;;;;;;;;;-1:-1:-1;;;;;47298:59:0;-1:-1:-1;;;;;47298:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47298:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47298:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47298:59:0;47290:87;;;;;-1:-1:-1;;;47290:87:0;;;;;;;;;;;;-1:-1:-1;;;47290:87:0;;;;;;;;;;;;;;;47407:5;;:31;;;-1:-1:-1;;;47407:31:0;;-1:-1:-1;;;;;47407:31:0;;;;;;;;;;;;;;;:5;;;;;:14;;:31;;;;;;;;;;;;;;:5;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;47407:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47407:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47407:31:0;47399:59;;;;;-1:-1:-1;;;47399:59:0;;;;;;;;;;;;-1:-1:-1;;;47399:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47474:94:0;;47516:17;;;;:8;:17;;;;;;;;:22;;;;;;;;;;47474:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47493:3;;47474:94;;;;;;;;;;;23350:1;;;;23386:13;;23370:12;:29;23362:73;;;;;-1:-1:-1;;;23362:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;48784:367;48879:16;;;;48875:195;;48917:27;;;48875:195;;;48966:42;48991:6;:16;;;48966:24;:42::i;:::-;48962:108;;;49043:15;;;;49025:33;;48962:108;49080:15;;;:27;;;49137:6;:4;:6::i;:::-;49118;:16;;:25;;;;48784:367;;:::o;6900:132::-;6958:7;6985:39;6989:1;6992;6985:39;;;;;;;;;;;;;;;;;:3;:39::i;24098:536::-;24204:7;24196:44;;;;;-1:-1:-1;;;24196:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24279:24;24306:6;:4;:6::i;:::-;24279:33;;24327:4;:14;;;24345:1;24327:19;24323:214;;;24380:18;;;;;;;;;;;;;;;;;;;;;24363:35;;;;;;;;;;;;;;;24323:214;;;24439:14;;;;:38;;23711:6;24439:38;:18;:38;:::i;:::-;24420:16;:57;24416:121;;;24511:14;;;24494:31;;;;;;;;;;;;;;;-1:-1:-1;24494:31:0;;;24416:121;24564:18;;;;;;;;;;;;;;;;;;;;;24547:14;;;:35;;;;;;;;;;;;;;;24593:14;;;;:33;24098:536::o;49237:189::-;49313:7;49340:42;49365:6;:16;;;49340:24;:42::i;:::-;:78;;49403:15;;49340:78;;;49385:6;:15;;;49340:78;49333:85;;49237:189;;;;:::o;5045:136::-;5103:7;5130:43;5134:1;5137;5130:43;;;;;;;;;;;;;;;;;:3;:43::i;25125:303::-;25198:7;25219:9;25230:8;25240:9;25253:19;25267:4;25253:13;:19::i;:::-;25218:54;;-1:-1:-1;25218:54:0;-1:-1:-1;25218:54:0;-1:-1:-1;25294:6:0;;;25283:8;25315:5;;25311:19;;;25329:1;25322:8;;;;;;;;25311:19;25362:1;25382:38;25396:23;:16;25410:1;25396:9;25362:1;25396:7;:9::i;:::-;:13;:16;:13;:16;:::i;:::-;:21;:23::i;:::-;25382:9;:1;25388:2;25382:9;:5;:9;:::i;:38::-;25375:45;25125:303;-1:-1:-1;;;;;;;;25125:303:0:o;5961:471::-;6019:7;6264:6;6260:47;;-1:-1:-1;6294:1:0;6287:8;;6260:47;6331:5;;;6335:1;6331;:5;:1;6355:5;;;;;:10;6347:56;;;;-1:-1:-1;;;6347:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24695:342;24761:7;24770:6;24778:7;24798:14;24824:38;23711:6;24824:4;:14;;;:18;;:38;;;;:::i;:::-;24815:6;:4;:6::i;:::-;:47;24798:64;;24880:9;:149;;24976:16;;24994;;;;25012;;;;24880:149;;;24906:14;;;:16;24924;;;;24942;;;;24880:149;24873:156;;;;;;;24695:342;;;;;:::o;11168:508::-;11585:4;11631:17;11663:7;11168:508;:::o;12597:98::-;12677:10;12597:98;:::o;18771:176::-;18880:58;;;-1:-1:-1;;;;;18880:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18880:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;18854:85:0;;18873:5;;18854:18;:85::i;45399:682::-;23274:13;:18;;23291:1;23274:18;;;;;45505:11;45497:60;;;;-1:-1:-1;;;45497:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45569:21;45596:22;:20;:22::i;:::-;45568:50;;;;45633:13;45650:1;45633:18;:46;;;;;45655:19;:17;:19::i;:::-;:24;45633:46;45629:78;;;45681:26;;;-1:-1:-1;;;45681:26:0;;;;;;;;;;;;-1:-1:-1;;;45681:26:0;;;;;;;;;;;;;;45629:78;45719:17;45738:18;45760:22;45766:7;45775:3;45780:1;45760:5;:22::i;:::-;-1:-1:-1;;;;;45814:17:0;;45793:18;45814:17;;;:8;:17;;;;;;;;:22;;;;;;;;;45718:64;;-1:-1:-1;45718:64:0;;-1:-1:-1;45793:18:0;45814:35;;45841:7;45814:35;:26;:35;:::i;:::-;-1:-1:-1;;;;;45860:17:0;;;;;;:8;:17;;;;;;;;:22;;;;;;;;:35;;;45920:11;;45793:56;;-1:-1:-1;45920:24:0;;45936:7;45920:24;:15;:24;:::i;:::-;45906:11;:38;45984:6;:4;:6::i;:::-;-1:-1:-1;;;;;45955:21:0;;;;;;:12;:21;;;;;;;;:26;;;;;;;;;:35;;;;46006:67;;;;;;;;;;;;;;;;;;;;;;;;45977:3;;46006:67;;;;;;;;;;23350:1;;;;23386:13;;23370:12;:29;23362:73;;;;;-1:-1:-1;;;23362:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49512:162;49594:4;49627:39;:15;29741:6;49627:39;:19;:39;:::i;:::-;49618:6;:4;:6::i;:::-;:48;;49512:162;-1:-1:-1;;49512:162:0:o;1437:619::-;1497:4;1965:20;;1808:66;2005:23;;;;;;:42;;-1:-1:-1;2032:15:0;;;2005:42;1997:51;1437:619;-1:-1:-1;;;;1437:619:0:o;49746:78::-;49800:6;:16;;-1:-1:-1;;49800:16:0;;;;;;;;;;49746:78::o;15127:229::-;-1:-1:-1;;;;;15201:22:0;;15193:73;;;;-1:-1:-1;;;15193:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15303:6;;15282:38;;-1:-1:-1;;;;;15282:38:0;;;;15303:6;;15282:38;;15303:6;;15282:38;15331:6;:17;;-1:-1:-1;;;;;;15331:17:0;-1:-1:-1;;;;;15331:17:0;;;;;;;;;;15127:229::o;47938:735::-;-1:-1:-1;;;;;48070:15:0;;48016:7;48070:15;;;:8;:15;;;;;;;;:20;;;;;;;;;48016:7;;;48118:12;;:39;;48150:7;48118:39;;;48133:14;48118:39;-1:-1:-1;;;;;48244:19:0;;48169:13;48244:19;;;:12;:19;;;;;;;;:24;;;;;;;;;48101:56;;-1:-1:-1;48169:13:0;;;;;48225:52;;48101:56;48225:18;:52::i;:::-;48168:109;;-1:-1:-1;48168:109:0;-1:-1:-1;48168:109:0;-1:-1:-1;48292:9:0;;48288:337;;48326:5;;:32;;;-1:-1:-1;;;48326:32:0;;48345:4;48326:32;;;;;;;;;;;;-1:-1:-1;;;;;48326:5:0;;;;:10;;:32;;;;;;;;;;;;;;;:5;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;48326:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48326:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48326:32:0;48318:59;;;;;-1:-1:-1;;;48318:59:0;;;;;;;;;;;;-1:-1:-1;;;48318:59:0;;;;;;;;;;;;;;;48415:29;:14;48434:9;48415:29;:18;:29;:::i;:::-;-1:-1:-1;;;;;48392:15:0;;;;;;:8;:15;;;;;;;;:20;;;;;;;;:52;48473:11;;:26;;48489:9;48473:26;:15;:26;:::i;:::-;48459:11;:40;48522:5;;-1:-1:-1;;;;;48522:5:0;:14;48537:33;:31;:33::i;:::-;48572:20;:5;48582:9;48572:20;:9;:20;:::i;:::-;48522:71;;;;;;;;;;;;;-1:-1:-1;;;;;48522:71:0;-1:-1:-1;;;;;48522:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48522:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48522:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48522:71:0;48514:99;;;;;-1:-1:-1;;;48514:99:0;;;;;;;;;;;;-1:-1:-1;;;48514:99:0;;;;;;;;;;;;;;;48643:9;;;;-1:-1:-1;47938:735:0;-1:-1:-1;;;;;;;47938:735:0:o;7562:345::-;7648:7;7750:12;7743:5;7735:28;;;;-1:-1:-1;;;7735:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7735:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7774:9;7790:1;7786;:5;;;;;;;7562:345;-1:-1:-1;;;;;7562:345:0:o;5518:192::-;5604:7;5640:12;5632:6;;;;5624:29;;;;-1:-1:-1;;;5624:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;5624:29:0;-1:-1:-1;;;5676:5:0;;;5518:192::o;131:234::-;179:7;203:6;199:47;;-1:-1:-1;233:1:0;226:8;;199:47;268:5;;;272:1;;268:5;272:1;292:5;;;;;:10;284:54;;;;;-1:-1:-1;;;284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;443:303;488:6;515:1;511;:5;507:232;;;-1:-1:-1;537:1:0;570;566;562:5;;:9;586:92;597:1;593;:5;586:92;;;623:1;619:5;;661:1;656;652;648;:5;;;;;;:9;647:15;;;;;;643:19;;586:92;;;507:232;;;;699:6;;695:44;;-1:-1:-1;726:1:0;443:303;;;:::o;20810:1114::-;21414:27;21422:5;-1:-1:-1;;;;;21414:25:0;;:27::i;:::-;21406:71;;;;;-1:-1:-1;;;21406:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21551:12;21565:23;21600:5;-1:-1:-1;;;;;21592:19:0;21612:4;21592:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21592:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21550:67:0;;;;21636:7;21628:52;;;;;-1:-1:-1;;;21628:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21697:17;;:21;21693:224;;21839:10;21828:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21828:30:0;21820:85;;;;-1:-1:-1;;;21820:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26013:24187;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;26013:24187:0;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://a804559cde042b4f71d8d54f5b8311d3a5d7e4c6e39b57e7756638151e90c160
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.