My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
SolarVault
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2021-10-28 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /* * @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 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. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { 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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the 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 virtual onlyOwner { _setOwner(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 virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface ISolarERC20 is IERC20 { function mint(address to, uint256 amount) external; } contract SolarVault is Ownable, ReentrancyGuard { address constant _trustedForwarder = 0x0D0b4862F5FfA3A47D04DDf0351356d20C830460; //Trusted forwarder using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. uint256 lastInteraction; // Last time when user deposited or claimed rewards, renewing the lock } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract uint256 allocPoint; // How many allocation points assigned to this pool. Solar to distribute per block. uint256 lastRewardBlock; // Last block number that Solar distribution occurs. uint256 accSolarPerShare; // Accumulated Solar per share, times 1e12. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds uint256 totalLp; // Total token in Pool uint256 lockupDuration; // Amount of time the participant will be locked in the pool after depositing or claiming rewards } ISolarERC20 public solar; // The operator can only update EmissionRate and AllocPoint to protect tokenomics //i.e some wrong setting and a pools get too much allocation accidentally address private _operator; // Dev address. address public devAddress; // Deposit Fee address address public feeAddress; // Solar tokens created per block uint256 public solarPerBlock; // Max harvest interval: 14 days uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days; // Maximum deposit fee rate: 10% uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 1000; // Info of each pool PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when Solar mining starts. uint256 public startBlock; // Total locked up rewards uint256 public totalLockedUpRewards; // Total Solar in Solar Pools (can be multiple pools) uint256 public totalSolarInPools = 0; // Control support for EIP-2771 Meta Transactions bool public metaTxnsEnabled = false; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event EmissionRateUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event RewardLockedUp( address indexed user, uint256 indexed pid, uint256 amountLockedUp ); event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); event DevAddressChanged( address indexed caller, address oldAddress, address newAddress ); event FeeAddressChanged( address indexed caller, address oldAddress, address newAddress ); event AllocPointsUpdated( address indexed caller, uint256 previousAmount, uint256 newAmount ); event MetaTxnsEnabled(address indexed caller); event MetaTxnsDisabled(address indexed caller); modifier onlyOperator() { require( _operator == msg.sender, "Operator: caller is not the operator" ); _; } constructor(ISolarERC20 _solar, uint256 _solarPerBlock) { //StartBlock always many years later from contract construct, will be set later in StartFarming function startBlock = block.number + (10 * 365 * 24 * 60 * 60); solar = _solar; solarPerBlock = _solarPerBlock; devAddress = msg.sender; feeAddress = msg.sender; _operator = msg.sender; emit OperatorTransferred(address(0), _operator); } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return metaTxnsEnabled && forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } function operator() public view returns (address) { return _operator; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } function transferOperator(address newOperator) public onlyOperator { require( newOperator != address(0), "TransferOperator: new operator is the zero address" ); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } // Set farming start, can call only once function startFarming() public onlyOwner { require(block.number < startBlock, "Error: farm started already"); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardBlock = block.number; } startBlock = block.number; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp function add( uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, uint256 _lockupDuration, bool _withUpdate ) public onlyOwner { require( _depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE, "Add: deposit fee too high" ); require( _harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "Add: invalid harvest interval" ); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accSolarPerShare: 0, depositFeeBP: _depositFeeBP, harvestInterval: _harvestInterval, totalLp: 0, lockupDuration: _lockupDuration }) ); } // View function to see pending Solar on frontend. function pendingSolar(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSolarPerShare = pool.accSolarPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier( pool.lastRewardBlock, block.number ); uint256 solarReward = multiplier .mul(solarPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); accSolarPerShare = accSolarPerShare.add( solarReward.mul(1e12).div(lpSupply) ); } uint256 pending = user.amount.mul(accSolarPerShare).div(1e12).sub( user.rewardDebt ); return pending.add(user.rewardLockedUp); } // View function to see when user will be unlocked from pool function userLockedUntil(uint256 _pid, address _user) public view returns (uint256) { UserInfo storage user = userInfo[_pid][_user]; PoolInfo storage pool = poolInfo[_pid]; return user.lastInteraction + pool.lockupDuration; } // View function to see if user can harvest Solar. function canHarvest(uint256 _pid, address _user) public view returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.number >= startBlock && block.timestamp >= user.nextHarvestUntil; } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.totalLp; if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 solarReward = multiplier .mul(solarPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); solar.mint(devAddress, solarReward.div(10)); solar.mint(address(this), solarReward); pool.accSolarPerShare = pool.accSolarPerShare.add( solarReward.mul(1e12).div(pool.totalLp) ); pool.lastRewardBlock = block.number; } // Deposit LP tokens to SolarVault for Solar allocation function deposit(uint256 _pid, uint256 _amount) public nonReentrant { require( block.number >= startBlock, "SolarVault: cannot deposit before farming start" ); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; updatePool(_pid); payOrLockupPendingSolar(_pid); if (_amount > 0) { uint256 beforeDeposit = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(_msgSender(), address(this), _amount); uint256 afterDeposit = pool.lpToken.balanceOf(address(this)); _amount = afterDeposit.sub(beforeDeposit); if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); pool.lpToken.safeTransfer(feeAddress, depositFee); _amount = _amount.sub(depositFee); } user.amount = user.amount.add(_amount); pool.totalLp = pool.totalLp.add(_amount); if (address(pool.lpToken) == address(solar)) { totalSolarInPools = totalSolarInPools.add(_amount); } } user.rewardDebt = user.amount.mul(pool.accSolarPerShare).div(1e12); user.lastInteraction = block.timestamp; emit Deposit(_msgSender(), _pid, _amount); } // Withdraw tokens function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; //this will make sure that user can only withdraw from his pool require(user.amount >= _amount, "Withdraw: user amount is not enough"); //Cannot withdraw more than pool's balance require(pool.totalLp >= _amount, "Withdraw: pool total is not enough"); //Cannot withdraw before lock time require( block.timestamp > user.lastInteraction + pool.lockupDuration, "Withdraw: you cannot withdraw yet" ); updatePool(_pid); payOrLockupPendingSolar(_pid); if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.totalLp = pool.totalLp.sub(_amount); if (address(pool.lpToken) == address(solar)) { totalSolarInPools = totalSolarInPools.sub(_amount); } pool.lpToken.safeTransfer(_msgSender(), _amount); } user.rewardDebt = user.amount.mul(pool.accSolarPerShare).div(1e12); user.lastInteraction = block.timestamp; emit Withdraw(_msgSender(), _pid, _amount); } // Pay or lockup pending Solar. function payOrLockupPendingSolar(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; if (user.nextHarvestUntil == 0 && block.number >= startBlock) { user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); } uint256 pending = user.amount.mul(pool.accSolarPerShare).div(1e12).sub( user.rewardDebt ); if (canHarvest(_pid, _msgSender())) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 totalRewards = pending.add(user.rewardLockedUp); // reset lockup totalLockedUpRewards = totalLockedUpRewards.sub( user.rewardLockedUp ); user.rewardLockedUp = 0; user.lastInteraction = block.timestamp; user.nextHarvestUntil = block.timestamp.add( pool.harvestInterval ); // send rewards safeSolarTransfer(_msgSender(), totalRewards); } } else if (pending > 0) { user.rewardLockedUp = user.rewardLockedUp.add(pending); user.lastInteraction = block.timestamp; totalLockedUpRewards = totalLockedUpRewards.add(pending); emit RewardLockedUp(_msgSender(), _pid, pending); } } // Safe Solar transfer function, just in case if rounding error causes pool do not have enough Solar. function safeSolarTransfer(address _to, uint256 _amount) internal { if (solar.balanceOf(address(this)) > totalSolarInPools) { //SolarBal = total Solar in SolarVault - total Solar in Solar pools, this will make sure that SolarVault never transfer rewards from deposited Solar pools uint256 SolarBal = solar.balanceOf(address(this)).sub( totalSolarInPools ); if (_amount >= SolarBal) { solar.transfer(_to, SolarBal); } else if (_amount > 0) { solar.transfer(_to, _amount); } } } // Update dev address by the previous dev. function setDevAddress(address _devAddress) public { require(_msgSender() == devAddress, "setDevAddress: FORBIDDEN"); require(_devAddress != address(0), "setDevAddress: ZERO"); emit DevAddressChanged(_msgSender(), devAddress, _devAddress); devAddress = _devAddress; } function setFeeAddress(address _feeAddress) public { require(_msgSender() == feeAddress, "setFeeAddress: FORBIDDEN"); require(_feeAddress != address(0), "setFeeAddress: ZERO"); emit FeeAddressChanged(_msgSender(), feeAddress, _feeAddress); feeAddress = _feeAddress; } // Pancake has to add hidden dummy pools in order to alter the emission, here we make it simple and transparent to all. function updateEmissionRate(uint256 _solarPerBlock) public onlyOperator { massUpdatePools(); emit EmissionRateUpdated(msg.sender, solarPerBlock, _solarPerBlock); solarPerBlock = _solarPerBlock; } function updateAllocPoint( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOperator { if (_withUpdate) { massUpdatePools(); } emit AllocPointsUpdated( _msgSender(), poolInfo[_pid].allocPoint, _allocPoint ); totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } // Enable support for meta transactions function enableMetaTxns() public onlyOperator { require(!metaTxnsEnabled, "SolarVault: meta transactions are already enabled"); metaTxnsEnabled = true; emit MetaTxnsEnabled(_msgSender()); } // Disable support for meta transactions function disableMetaTxns() public onlyOperator { require(metaTxnsEnabled, "SolarVault: meta transactions are already disabled"); metaTxnsEnabled = false; emit MetaTxnsDisabled(_msgSender()); } }
[{"inputs":[{"internalType":"contract ISolarERC20","name":"_solar","type":"address"},{"internalType":"uint256","name":"_solarPerBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"DevAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"EmissionRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"FeeAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"MetaTxnsDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"MetaTxnsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"uint256","name":"_lockupDuration","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMetaTxns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableMetaTxns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metaTxnsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingSolar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accSolarPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"},{"internalType":"uint256","name":"lockupDuration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"solar","outputs":[{"internalType":"contract ISolarERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"solarPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSolarInPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_solarPerBlock","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"},{"internalType":"uint256","name":"lastInteraction","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"userLockedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006009819055600c55600d805460ff191690553480156200002557600080fd5b50604051620036b7380380620036b78339810160408190526200004891620001ba565b6200005c62000056620000f0565b6200012e565b6001805562000070436312cc0300620001f4565b600a55600280546001600160a01b038085166001600160a01b031992831617909255600683905560048054821633908117909155600580548316821790556003805490921617908190556040519116906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3505062000219565b6000620000fd336200017e565b1562000113575060131936013560601c6200012b565b62000128620001b660201b620027b41760201c565b90505b90565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600d5460009060ff168015620001b057506001600160a01b038216730d0b4862f5ffa3a47d04ddf0351356d20c830460145b92915050565b3390565b60008060408385031215620001cd578182fd5b82516001600160a01b0381168114620001e4578283fd5b6020939093015192949293505050565b600082198211156200021457634e487b7160e01b81526011600452602481fd5b500190565b61348e80620002296000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063630b5ba111610145578063afbcfea1116100bd578063d761595c1161008c578063e2bbb15811610071578063e2bbb15814610587578063e6fa6d6d1461059a578063f2fde38b146105ba5761025c565b8063d761595c14610574578063de73149d1461057d5761025c565b8063afbcfea114610533578063bde4aeca1461053b578063d0d41fe11461054e578063d1593bc8146105615761025c565b80638705fcd4116101145780638dbb1e3a116100f95780638dbb1e3a146104a357806393f1a40b146104b6578063a8c95dc0146105265761025c565b80638705fcd4146104725780638da5cb5b146104855761025c565b8063630b5ba1146104335780636f22d2c21461043b578063715018a61461044e578063812c64f1146104565761025c565b80633cb5ba9e116101d857806348cd4cb1116101a7578063570ca7351161018c578063570ca735146103fa578063572b6c0514610418578063578bb42d1461042b5761025c565b806348cd4cb1146103de57806351eb05a6146103e75761025c565b80633cb5ba9e1461039957806341275358146103a2578063441a3e70146103c2578063474fa630146103d55761025c565b806317caf6f11161022f5780632e6c998d116102145780632e6c998d1461031e578063330ae003146103415780633ad10ef6146103545761025c565b806317caf6f11461030257806329605e771461030b5761025c565b8063081e3eda14610261578063083836401461027c5780630ba84cd2146102865780631526fe2714610299575b600080fd5b6102696105cd565b6040519081526020015b60405180910390f35b6102846105d4565b005b61028461029436600461315e565b610785565b6102ac6102a736600461315e565b610876565b6040805173ffffffffffffffffffffffffffffffffffffffff9099168952602089019790975295870194909452606086019290925261ffff16608085015260a084015260c083015260e082015261010001610273565b61026960095481565b610284610319366004613126565b6108e8565b61033161032c36600461318e565b610abf565b6040519015158152602001610273565b61028461034f3660046131bd565b610b0c565b6004546103749073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610273565b61026960065481565b6005546103749073ffffffffffffffffffffffffffffffffffffffff1681565b6102846103d0366004613229565b610ed2565b610269600b5481565b610269600a5481565b6102846103f536600461315e565b6112e0565b60035473ffffffffffffffffffffffffffffffffffffffff16610374565b610331610426366004613126565b61151e565b610284611562565b610284611712565b61026961044936600461318e565b61173d565b610284611916565b61045f6103e881565b60405161ffff9091168152602001610273565b610284610480366004613126565b6119dc565b60005473ffffffffffffffffffffffffffffffffffffffff16610374565b6102696104b1366004613229565b611b9f565b6104fe6104c436600461318e565b6008602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a001610273565b600d546103319060ff1681565b610284611bb2565b61028461054936600461324a565b611d54565b61028461055c366004613126565b611f78565b61026961056f36600461318e565b61213b565b610269600c5481565b6102696212750081565b610284610595366004613229565b6121d5565b6002546103749073ffffffffffffffffffffffffffffffffffffffff1681565b6102846105c8366004613126565b61264e565b6007545b90565b60035473ffffffffffffffffffffffffffffffffffffffff16331461067f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f720000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600d5460ff16610711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f536f6c61725661756c743a206d657461207472616e73616374696f6e7320617260448201527f6520616c72656164792064697361626c656400000000000000000000000000006064820152608401610676565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556107416127b8565b73ffffffffffffffffffffffffffffffffffffffff167f096be170ccc67847e55535e7d8334b2afedd95805baedc160005addb9144745060405160405180910390a2565b60035473ffffffffffffffffffffffffffffffffffffffff16331461082b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610676565b610833611712565b600654604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600655565b6007818154811061088657600080fd5b60009182526020909120600890910201805460018201546002830154600384015460048501546005860154600687015460079097015473ffffffffffffffffffffffffffffffffffffffff909616975093959294919361ffff90911692909188565b60035473ffffffffffffffffffffffffffffffffffffffff16331461098e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610676565b73ffffffffffffffffffffffffffffffffffffffff8116610a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f5472616e736665724f70657261746f723a206e6577206f70657261746f72206960448201527f7320746865207a65726f206164647265737300000000000000000000000000006064820152608401610676565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff851684529091528120600a544310801590610b04575080600301544210155b949350505050565b610b146127b8565b73ffffffffffffffffffffffffffffffffffffffff16610b4960005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610676565b6103e861ffff85161115610c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610676565b62127500831115610ca3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610676565b8015610cb157610cb1611712565b6000600a544311610cc457600a54610cc6565b435b600954909150610cd690886127fc565b600955604080516101008101825273ffffffffffffffffffffffffffffffffffffffff97881681526020810198895290810191825260006060820181815261ffff9788166080840190815260a0840197885260c0840183815260e0850197885260078054600181018255945293517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600890940293840180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b161790995598517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68982015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a83015596517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b82015594517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c860180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016919095161790935590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68d84015592517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68e8301555090517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68f90910155565b60026001541415610f3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610676565b6002600181905550600060078381548110610f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906008020190506000600860008581526020019081526020016000206000610fb26127b8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f57697468647261773a207573657220616d6f756e74206973206e6f7420656e6f60448201527f75676800000000000000000000000000000000000000000000000000000000006064820152608401610676565b8282600601541015611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f57697468647261773a20706f6f6c20746f74616c206973206e6f7420656e6f7560448201527f67680000000000000000000000000000000000000000000000000000000000006064820152608401610676565b8160070154816004015461112a91906132ef565b42116111b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f57697468647261773a20796f752063616e6e6f7420776974686472617720796560448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610676565b6111c1846112e0565b6111ca84612808565b82156112525780546111dc9084612a3a565b815560068201546111ed9084612a3a565b6006830155600254825473ffffffffffffffffffffffffffffffffffffffff9081169116141561122857600c546112249084612a3a565b600c555b6112526112336127b8565b835473ffffffffffffffffffffffffffffffffffffffff169085612a46565b600382015481546112739164e8d4a510009161126d91612b1f565b90612b2b565b6001820155426004820155836112876127b8565b73ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568856040516112ce91815260200190565b60405180910390a35050600180555050565b60006007828154811061131c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906008020190508060020154431161133d575061151b565b600681015480158061135157506001820154155b1561136357504360029091015561151b565b6000611373836002015443611b9f565b905060006113a060095461126d866001015461139a60065487612b1f90919063ffffffff16565b90612b1f565b60025460045491925073ffffffffffffffffffffffffffffffffffffffff908116916340c10f1991166113d484600a612b2b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b15801561143f57600080fd5b505af1158015611453573d6000803e3d6000fd5b50506002546040517f40c10f190000000000000000000000000000000000000000000000000000000081523060048201526024810185905273ffffffffffffffffffffffffffffffffffffffff90911692506340c10f199150604401600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b505050600685015461150891506114fd9061126d8464e8d4a51000612b1f565b6003860154906127fc565b6003850155505043600290920191909155505b50565b600d5460009060ff16801561155c575073ffffffffffffffffffffffffffffffffffffffff8216730d0b4862f5ffa3a47d04ddf0351356d20c830460145b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff163314611608576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610676565b600d5460ff161561169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f536f6c61725661756c743a206d657461207472616e73616374696f6e7320617260448201527f6520616c726561647920656e61626c65640000000000000000000000000000006064820152608401610676565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556116ce6127b8565b73ffffffffffffffffffffffffffffffffffffffff167f92e4c08d47b71e8dc051232b8e475ec296489a67a4ba5cca88ff20fb6ac499e660405160405180910390a2565b60075460005b8181101561173957611729816112e0565b611732816133c0565b9050611718565b5050565b6000806007848154811061177a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600091825260208083208784526008808352604080862073ffffffffffffffffffffffffffffffffffffffff8a811688529452808620949091029091016003810154815492517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291965093949291909116906370a082319060240160206040518083038186803b15801561181557600080fd5b505afa158015611829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d9190613176565b905083600201544311801561186157508015155b156118c1576000611876856002015443611b9f565b9050600061189d60095461126d886001015461139a60065487612b1f90919063ffffffff16565b90506118bc6118b58461126d8464e8d4a51000612b1f565b85906127fc565b935050505b60006118f184600101546118eb64e8d4a5100061126d878960000154612b1f90919063ffffffff16565b90612a3a565b905061190a8460020154826127fc90919063ffffffff16565b98975050505050505050565b61191e6127b8565b73ffffffffffffffffffffffffffffffffffffffff1661195360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146119d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610676565b6119da6000612b37565b565b60055473ffffffffffffffffffffffffffffffffffffffff166119fd6127b8565b73ffffffffffffffffffffffffffffffffffffffff1614611a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e00000000000000006044820152606401610676565b73ffffffffffffffffffffffffffffffffffffffff8116611af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f736574466565416464726573733a205a45524f000000000000000000000000006044820152606401610676565b611aff6127b8565b6005546040805173ffffffffffffffffffffffffffffffffffffffff9283168152848316602082015292909116917f6690a53895b5691c039238b384bd857e65c42adcc727775381e02cb90a122613910160405180910390a2600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611bab8284612a3a565b9392505050565b611bba6127b8565b73ffffffffffffffffffffffffffffffffffffffff16611bef60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614611c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610676565b600a544310611cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4572726f723a206661726d207374617274656420616c726561647900000000006044820152606401610676565b60075460005b81811015611d4c57600060078281548110611d21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906008020190504381600201819055505080611d45906133c0565b9050611cdd565b505043600a55565b60035473ffffffffffffffffffffffffffffffffffffffff163314611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610676565b8015611e0857611e08611712565b611e106127b8565b73ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef360078581548110611e81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600802016001015484604051611eab929190918252602082015260400190565b60405180910390a2611f1d82611f1760078681548110611ef4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906008020160010154600954612a3a90919063ffffffff16565b906127fc565b6009819055508160078481548110611f5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906008020160010181905550505050565b60045473ffffffffffffffffffffffffffffffffffffffff16611f996127b8565b73ffffffffffffffffffffffffffffffffffffffff1614612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f736574446576416464726573733a20464f5242494444454e00000000000000006044820152606401610676565b73ffffffffffffffffffffffffffffffffffffffff8116612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f736574446576416464726573733a205a45524f000000000000000000000000006044820152606401610676565b61209b6127b8565b6004546040805173ffffffffffffffffffffffffffffffffffffffff9283168152848316602082015292909116917fd36d63f6c513a911d7912853de740af476b0fbb569aa769e1a4f5bfa37a325c4910160405180910390a2600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152812060078054839190869081106121a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600802019050806007015482600401546121cc91906132ef565b95945050505050565b60026001541415612242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610676565b6002600155600a544310156122d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f536f6c61725661756c743a2063616e6e6f74206465706f736974206265666f7260448201527f65206661726d696e6720737461727400000000000000000000000000000000006064820152608401610676565b600060078381548110612315577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060080201905060006008600085815260200190815260200160002060006123446127b8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612389846112e0565b61239284612808565b82156125d85781546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561240157600080fd5b505afa158015612415573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124399190613176565b90506124666124466127b8565b845473ffffffffffffffffffffffffffffffffffffffff16903087612bac565b82546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156124cf57600080fd5b505afa1580156124e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125079190613176565b90506125138183612a3a565b600485015490955061ffff161561257d576004840154600090612543906127109061126d90899061ffff16612b1f565b600554865491925061256f9173ffffffffffffffffffffffffffffffffffffffff908116911683612a46565b6125798682612a3a565b9550505b825461258990866127fc565b8355600684015461259a90866127fc565b6006850155600254845473ffffffffffffffffffffffffffffffffffffffff908116911614156125d557600c546125d190866127fc565b600c555b50505b600382015481546125f39164e8d4a510009161126d91612b1f565b6001820155426004820155836126076127b8565b73ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516112ce91815260200190565b6126566127b8565b73ffffffffffffffffffffffffffffffffffffffff1661268b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614612708576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610676565b73ffffffffffffffffffffffffffffffffffffffff81166127ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610676565b61151b81612b37565b3390565b60006127c33361151e565b156127f557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c6105d1565b50336105d1565b6000611bab82846132ef565b600060078281548110612844577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060080201905060006008600084815260200190815260200160002060006128736127b8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806003015460001480156128c55750600a544310155b156128e05760058201546128da9042906127fc565b60038201555b600061290e82600101546118eb64e8d4a5100061126d87600301548760000154612b1f90919063ffffffff16565b905061291c8461032c6127b8565b156129ab576000811180612934575060008260020154115b156129a65760006129528360020154836127fc90919063ffffffff16565b905061296d8360020154600b54612a3a90919063ffffffff16565b600b55600060028401554260048401819055600585015461298e91906127fc565b60038401556129a461299e6127b8565b82612c0a565b505b612a34565b8015612a345760028201546129c090826127fc565b6002830155426004830155600b546129d890826127fc565b600b55836129e46127b8565b73ffffffffffffffffffffffffffffffffffffffff167fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c183604051612a2b91815260200190565b60405180910390a35b50505050565b6000611bab828461337d565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052612b1a9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612ece565b505050565b6000611bab8284613340565b6000611bab8284613307565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052612a349085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612a98565b600c546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015612c7657600080fd5b505afa158015612c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cae9190613176565b111561173957600c546002546040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600092612d6192909173ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015612d2957600080fd5b505afa158015612d3d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118eb9190613176565b9050808210612e1c576002546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e169190613142565b50612b1a565b8115612b1a576002546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b158015612e9657600080fd5b505af1158015612eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a349190613142565b6000612f30826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fda9092919063ffffffff16565b805190915015612b1a5780806020019051810190612f4e9190613142565b612b1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610676565b6060610b04848460008585843b61304d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610676565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516130769190613282565b60006040518083038185875af1925050503d80600081146130b3576040519150601f19603f3d011682016040523d82523d6000602084013e6130b8565b606091505b50915091506130c88282866130d3565b979650505050505050565b606083156130e2575081611bab565b8251156130f25782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610676919061329e565b600060208284031215613137578081fd5b8135611bab81613428565b600060208284031215613153578081fd5b8151611bab8161344a565b60006020828403121561316f578081fd5b5035919050565b600060208284031215613187578081fd5b5051919050565b600080604083850312156131a0578081fd5b8235915060208301356131b281613428565b809150509250929050565b60008060008060008060c087890312156131d5578182fd5b8635955060208701356131e781613428565b9450604087013561ffff811681146131fd578283fd5b9350606087013592506080870135915060a087013561321b8161344a565b809150509295509295509295565b6000806040838503121561323b578182fd5b50508035926020909101359150565b60008060006060848603121561325e578283fd5b833592506020840135915060408401356132778161344a565b809150509250925092565b60008251613294818460208701613394565b9190910192915050565b60006020825282518060208401526132bd816040850160208701613394565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115613302576133026133f9565b500190565b60008261333b577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613378576133786133f9565b500290565b60008282101561338f5761338f6133f9565b500390565b60005b838110156133af578181015183820152602001613397565b83811115612a345750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133f2576133f26133f9565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461151b57600080fd5b801515811461151b57600080fdfea264697066735822122036b80abf00b886dacd4a36776be87c6d1dbff77d13b852e726497f5939d3b84364736f6c634300080200330000000000000000000000006bd193ee6d2104f14f94e2ca6efefae561a4334b0000000000000000000000000000000000000000000000000de0b6b3a7640000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006bd193ee6d2104f14f94e2ca6efefae561a4334b0000000000000000000000000000000000000000000000000de0b6b3a7640000
-----Decoded View---------------
Arg [0] : _solar (address): 0x6bd193ee6d2104f14f94e2ca6efefae561a4334b
Arg [1] : _solarPerBlock (uint256): 1000000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006bd193ee6d2104f14f94e2ca6efefae561a4334b
Arg [1] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Deployed ByteCode Sourcemap
27008:18182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33556:95;;;:::i;:::-;;;14303:25:1;;;14291:2;14276:18;33556:95:0;;;;;;;;44961:226;;;:::i;:::-;;43898:229;;;;;;:::i;:::-;;:::i;29049:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;4833:42:1;4821:55;;;4803:74;;4908:2;4893:18;;4886:34;;;;4936:18;;;4929:34;;;;4994:2;4979:18;;4972:34;;;;5055:6;5043:19;5037:3;5022:19;;5015:48;5094:3;5079:19;;5072:35;5138:3;5123:19;;5116:35;5182:3;5167:19;;5160:35;4790:3;4775:19;29049:26:0;4757:444:1;29294:34:0;;;;;;32815:304;;;;;;:::i;:::-;;:::i;36537:286::-;;;;;;:::i;:::-;;:::i;:::-;;;4422:14:1;;4415:22;4397:41;;4385:2;4370:18;36537:286:0;4352:92:1;33864:1156:0;;;;;;:::i;:::-;;:::i;28641:25::-;;;;;;;;;;;;3165:42:1;3153:55;;;3135:74;;3123:2;3108:18;28641:25:0;3090:125:1;28776:28:0;;;;;;28703:25;;;;;;;;;39556:1286;;;;;;:::i;:::-;;:::i;29454:35::-;;;;;;29388:25;;;;;;37162:870;;;;;;:::i;:::-;;:::i;32493:85::-;32561:9;;;;32493:85;;31510:198;;;;;;:::i;:::-;;:::i;44684:223::-;;;:::i;36906:180::-;;;:::i;35084:1024::-;;;;;;:::i;:::-;;:::i;16742:94::-;;;:::i;28960:54::-;;29010:4;28960:54;;;;;14138:6:1;14126:19;;;14108:38;;14096:2;14081:18;28960:54:0;14063:89:1;43453:312:0;;;;;;:::i;:::-;;:::i;16091:87::-;16137:7;16164:6;;;16091:87;;32654:153;;;;;;:::i;:::-;;:::i;29133:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14851:25:1;;;14907:2;14892:18;;14885:34;;;;14935:18;;;14928:34;;;;14993:2;14978:18;;14971:34;15036:3;15021:19;;15014:35;14838:3;14823:19;29133:64:0;14805:250:1;29657:35:0;;;;;;;;;33173:375;;;:::i;44135:496::-;;;;;;:::i;:::-;;:::i;43133:312::-;;;;;;:::i;:::-;;:::i;36182:291::-;;;;;;:::i;:::-;;:::i;29557:36::-;;;;;;28851:58;;28902:7;28851:58;;38101:1423;;;;;;:::i;:::-;;:::i;28387:24::-;;;;;;;;;16991:192;;;;;;:::i;:::-;;:::i;33556:95::-;33628:8;:15;33556:95;;:::o;44961:226::-;30916:9;;:23;:9;30929:10;30916:23;30894:109;;;;;;;13761:2:1;30894:109:0;;;13743:21:1;13800:2;13780:18;;;13773:30;13839:34;13819:18;;;13812:62;13910:6;13890:18;;;13883:34;13934:19;;30894:109:0;;;;;;;;;45027:15:::1;::::0;::::1;;45019:78;;;::::0;::::1;::::0;;9544:2:1;45019:78:0::1;::::0;::::1;9526:21:1::0;9583:2;9563:18;;;9556:30;9622:34;9602:18;;;9595:62;9693:20;9673:18;;;9666:48;9731:19;;45019:78:0::1;9516:240:1::0;45019:78:0::1;45110:15;:23:::0;;;::::1;::::0;;45166:12:::1;:10;:12::i;:::-;45149:30;;;;;;;;;;;;44961:226::o:0;43898:229::-;30916:9;;:23;:9;30929:10;30916:23;30894:109;;;;;;;13761:2:1;30894:109:0;;;13743:21:1;13800:2;13780:18;;;13773:30;13839:34;13819:18;;;13812:62;13910:6;13890:18;;;13883:34;13934:19;;30894:109:0;13733:226:1;30894:109:0;43981:17:::1;:15;:17::i;:::-;44048:13;::::0;44016:62:::1;::::0;;14513:25:1;;;14569:2;14554:18;;14547:34;;;44036:10:0::1;::::0;44016:62:::1;::::0;14486:18:1;44016:62:0::1;;;;;;;44089:13;:30:::0;43898:229::o;29049:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29049:26:0;;;;;;;;;;;;;;:::o;32815:304::-;30916:9;;:23;:9;30929:10;30916:23;30894:109;;;;;;;13761:2:1;30894:109:0;;;13743:21:1;13800:2;13780:18;;;13773:30;13839:34;13819:18;;;13812:62;13910:6;13890:18;;;13883:34;13934:19;;30894:109:0;13733:226:1;30894:109:0;32915:25:::1;::::0;::::1;32893:125;;;::::0;::::1;::::0;;12571:2:1;32893:125:0::1;::::0;::::1;12553:21:1::0;12610:2;12590:18;;;12583:30;12649:34;12629:18;;;12622:62;12720:20;12700:18;;;12693:48;12758:19;;32893:125:0::1;12543:240:1::0;32893:125:0::1;33054:9;::::0;33034:43:::1;::::0;::::1;::::0;;::::1;::::0;33054:9:::1;::::0;33034:43:::1;::::0;33054:9:::1;::::0;33034:43:::1;33088:9;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;32815:304::o;36537:286::-;36634:4;36680:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;36748:10;;36732:12;:26;;;;:83;;;36794:4;:21;;;36775:15;:40;;36732:83;36712:103;36537:286;-1:-1:-1;;;;36537:286:0:o;33864:1156::-;16322:12;:10;:12::i;:::-;16311:23;;:7;16137;16164:6;;;16091:87;;16311:7;:23;;;16303:68;;;;;;;10381:2:1;16303:68:0;;;10363:21:1;;;10400:18;;;10393:30;10459:34;10439:18;;;10432:62;10511:18;;16303:68:0;10353:182:1;16303:68:0;29010:4:::1;34117:41;::::0;::::1;;;34095:116;;;::::0;::::1;::::0;;6925:2:1;34095:116:0::1;::::0;::::1;6907:21:1::0;6964:2;6944:18;;;6937:30;7003:27;6983:18;;;6976:55;7048:18;;34095:116:0::1;6897:175:1::0;34095:116:0::1;28902:7;34244:16;:44;;34222:123;;;::::0;::::1;::::0;;11502:2:1;34222:123:0::1;::::0;::::1;11484:21:1::0;11541:2;11521:18;;;11514:30;11580:31;11560:18;;;11553:59;11629:18;;34222:123:0::1;11474:179:1::0;34222:123:0::1;34360:11;34356:61;;;34388:17;:15;:17::i;:::-;34427:23;34468:10;;34453:12;:25;:79;;34522:10;;34453:79;;;34494:12;34453:79;34561:15;::::0;34427:105;;-1:-1:-1;34561:32:0::1;::::0;34581:11;34561:19:::1;:32::i;:::-;34543:15;:50:::0;34632:369:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;34632:369:0;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;34604:8:::1;:408:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;-1:-1:-1;34604:408:0;;;;;;;33864:1156::o;39556:1286::-;19024:1;19620:7;;:19;;19612:63;;;;;;;13401:2:1;19612:63:0;;;13383:21:1;13440:2;13420:18;;;13413:30;13479:33;13459:18;;;13452:61;13530:18;;19612:63:0;13373:181:1;19612:63:0;19024:1;19753:7;:18;;;;39636:21:::1;39660:8;39669:4;39660:14;;;;;;;;;;;;;;;;;;;;;;;;;;39636:38;;39685:21;39709:8;:14;39718:4;39709:14;;;;;;;;;;;:28;39724:12;:10;:12::i;:::-;39709:28;;;;;;;;;;;;;;;39685:52;;39846:7;39831:4;:11;;;:22;;39823:70;;;::::0;::::1;::::0;;11098:2:1;39823:70:0::1;::::0;::::1;11080:21:1::0;11137:2;11117:18;;;11110:30;11176:34;11156:18;;;11149:62;11247:5;11227:18;;;11220:33;11270:19;;39823:70:0::1;11070:225:1::0;39823:70:0::1;39982:7;39966:4;:12;;;:23;;39958:70;;;::::0;::::1;::::0;;6522:2:1;39958:70:0::1;::::0;::::1;6504:21:1::0;6561:2;6541:18;;;6534:30;6600:34;6580:18;;;6573:62;6671:4;6651:18;;;6644:32;6693:19;;39958:70:0::1;6494:224:1::0;39958:70:0::1;40148:4;:19;;;40125:4;:20;;;:42;;;;:::i;:::-;40107:15;:60;40085:143;;;::::0;::::1;::::0;;8735:2:1;40085:143:0::1;::::0;::::1;8717:21:1::0;8774:2;8754:18;;;8747:30;8813:34;8793:18;;;8786:62;8884:3;8864:18;;;8857:31;8905:19;;40085:143:0::1;8707:223:1::0;40085:143:0::1;40241:16;40252:4;40241:10;:16::i;:::-;40270:29;40294:4;40270:23;:29::i;:::-;40316:11:::0;;40312:344:::1;;40358:11:::0;;:24:::1;::::0;40374:7;40358:15:::1;:24::i;:::-;40344:38:::0;;40412:12:::1;::::0;::::1;::::0;:25:::1;::::0;40429:7;40412:16:::1;:25::i;:::-;40397:12;::::0;::::1;:40:::0;40489:5:::1;::::0;40464:12;;40489:5:::1;40464:12:::0;;::::1;40489:5:::0;::::1;40456:39;40452:130;;;40536:17;::::0;:30:::1;::::0;40558:7;40536:21:::1;:30::i;:::-;40516:17;:50:::0;40452:130:::1;40596:48;40622:12;:10;:12::i;:::-;40596::::0;;::::1;;::::0;40636:7;40596:25:::1;:48::i;:::-;40700:21;::::0;::::1;::::0;40684:11;;:48:::1;::::0;40727:4:::1;::::0;40684:38:::1;::::0;:15:::1;:38::i;:::-;:42:::0;::::1;:48::i;:::-;40666:15;::::0;::::1;:66:::0;40766:15:::1;40743:20;::::0;::::1;:38:::0;40820:4;40806:12:::1;:10;:12::i;:::-;40797:37;;;40826:7;40797:37;;;;14303:25:1::0;;14291:2;14276:18;;14258:76;40797:37:0::1;;;;;;;;-1:-1:-1::0;;18980:1:0;19932:22;;-1:-1:-1;;39556:1286:0:o;37162:870::-;37214:21;37238:8;37247:4;37238:14;;;;;;;;;;;;;;;;;;;;;;;;;;37214:38;;37283:4;:20;;;37267:12;:36;37263:75;;37320:7;;;37263:75;37369:12;;;;37396:13;;;:37;;-1:-1:-1;37413:15:0;;;;:20;37396:37;37392:126;;;-1:-1:-1;37473:12:0;37450:20;;;;:35;37500:7;;37392:126;37530:18;37551:49;37565:4;:20;;;37587:12;37551:13;:49::i;:::-;37530:70;;37611:19;37633:113;37730:15;;37633:78;37695:4;:15;;;37633:43;37662:13;;37633:10;:28;;:43;;;;:::i;:::-;:61;;:78::i;:113::-;37759:5;;37770:10;;37611:135;;-1:-1:-1;37759:5:0;;;;;:10;;37770;37782:19;37611:135;37798:2;37782:15;:19::i;:::-;37759:43;;;;;;;;;;4159:42:1;4147:55;;;37759:43:0;;;4129:74:1;4219:18;;;4212:34;4102:18;;37759:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37813:5:0;;:38;;;;;37832:4;37813:38;;;4129:74:1;4219:18;;;4212:34;;;37813:5:0;;;;;-1:-1:-1;37813:10:0;;-1:-1:-1;4102:18:1;;37813:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37954:12:0;;;;37888:90;;-1:-1:-1;37928:39:0;;:21;:11;37944:4;37928:15;:21::i;:39::-;37888:21;;;;;:25;:90::i;:::-;37864:21;;;:114;-1:-1:-1;;38012:12:0;37989:20;;;;:35;;;;-1:-1:-1;37162:870:0;;:::o;31510:198::-;31651:15;;31622:4;;31651:15;;:49;;;;-1:-1:-1;31670:30:0;;;27109:42;31670:30;31651:49;31644:56;31510:198;-1:-1:-1;;31510:198:0:o;44684:223::-;30916:9;;:23;:9;30929:10;30916:23;30894:109;;;;;;;13761:2:1;30894:109:0;;;13743:21:1;13800:2;13780:18;;;13773:30;13839:34;13819:18;;;13812:62;13910:6;13890:18;;;13883:34;13934:19;;30894:109:0;13733:226:1;30894:109:0;44750:15:::1;::::0;::::1;;44749:16;44741:78;;;::::0;::::1;::::0;;9963:2:1;44741:78:0::1;::::0;::::1;9945:21:1::0;10002:2;9982:18;;;9975:30;10041:34;10021:18;;;10014:62;10112:19;10092:18;;;10085:47;10149:19;;44741:78:0::1;9935:239:1::0;44741:78:0::1;44832:15;:22:::0;;;::::1;44850:4;44832:22;::::0;;44886:12:::1;:10;:12::i;:::-;44870:29;;;;;;;;;;;;44684:223::o:0;36906:180::-;36968:8;:15;36951:14;36994:85;37022:6;37016:3;:12;36994:85;;;37052:15;37063:3;37052:10;:15::i;:::-;37030:5;;;:::i;:::-;;;36994:85;;;;36906:180;:::o;35084:1024::-;35185:7;35210:21;35234:8;35243:4;35234:14;;;;;;;;;;;;;;;;;;;;;;;;35283;;;35234;35283;;;;;;;:21;;;;;;;;;;;35234:14;;;;;;;35342:21;;;;35393:12;;:37;;;;;35424:4;35393:37;;;3135:74:1;35234:14:0;;-1:-1:-1;35283:21:0;;35234:14;35393:12;;;;;:22;;3108:18:1;;35393:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35374:56;;35462:4;:20;;;35447:12;:35;:52;;;;-1:-1:-1;35486:13:0;;;35447:52;35443:489;;;35516:18;35537:98;35569:4;:20;;;35608:12;35537:13;:98::i;:::-;35516:119;;35650:19;35672:125;35781:15;;35672:86;35742:4;:15;;;35672:47;35705:13;;35672:10;:32;;:47;;;;:::i;:125::-;35650:147;-1:-1:-1;35831:89:0;35870:35;35896:8;35870:21;35650:147;35886:4;35870:15;:21::i;:35::-;35831:16;;:20;:89::i;:::-;35812:108;;35443:489;;;35944:15;35962:88;36024:4;:15;;;35962:43;36000:4;35962:33;35978:16;35962:4;:11;;;:15;;:33;;;;:::i;:43::-;:47;;:88::i;:::-;35944:106;;36068:32;36080:4;:19;;;36068:7;:11;;:32;;;;:::i;:::-;36061:39;35084:1024;-1:-1:-1;;;;;;;;35084:1024:0:o;16742:94::-;16322:12;:10;:12::i;:::-;16311:23;;:7;16137;16164:6;;;16091:87;;16311:7;:23;;;16303:68;;;;;;;10381:2:1;16303:68:0;;;10363:21:1;;;10400:18;;;10393:30;10459:34;10439:18;;;10432:62;10511:18;;16303:68:0;10353:182:1;16303:68:0;16807:21:::1;16825:1;16807:9;:21::i;:::-;16742:94::o:0;43453:312::-;43539:10;;;;43523:12;:10;:12::i;:::-;:26;;;43515:63;;;;;;;12218:2:1;43515:63:0;;;12200:21:1;12257:2;12237:18;;;12230:30;12296:26;12276:18;;;12269:54;12340:18;;43515:63:0;12190:174:1;43515:63:0;43597:25;;;43589:57;;;;;;;8387:2:1;43589:57:0;;;8369:21:1;8426:2;8406:18;;;8399:30;8465:21;8445:18;;;8438:49;8504:18;;43589:57:0;8359:169:1;43589:57:0;43682:12;:10;:12::i;:::-;43696:10;;43664:56;;;;43696:10;;;3455:34:1;;3525:15;;;3520:2;3505:18;;3498:43;43664:56:0;;;;;;;3367:18:1;43664:56:0;;;;;;;43733:10;:24;;;;;;;;;;;;;;;43453:312::o;32654:153::-;32753:7;32785:14;:3;32793:5;32785:7;:14::i;:::-;32778:21;32654:153;-1:-1:-1;;;32654:153:0:o;33173:375::-;16322:12;:10;:12::i;:::-;16311:23;;:7;16137;16164:6;;;16091:87;;16311:7;:23;;;16303:68;;;;;;;10381:2:1;16303:68:0;;;10363:21:1;;;10400:18;;;10393:30;10459:34;10439:18;;;10432:62;10511:18;;16303:68:0;10353:182:1;16303:68:0;33248:10:::1;;33233:12;:25;33225:65;;;::::0;::::1;::::0;;10742:2:1;33225:65:0::1;::::0;::::1;10724:21:1::0;10781:2;10761:18;;;10754:30;10820:29;10800:18;;;10793:57;10867:18;;33225:65:0::1;10714:177:1::0;33225:65:0::1;33320:8;:15:::0;33303:14:::1;33346:157;33374:6;33368:3;:12;33346:157;;;33404:21;33428:8;33437:3;33428:13;;;;;;;;;;;;;;;;;;;;;;;;;;33404:37;;33479:12;33456:4;:20;;:35;;;;33346:157;33382:5;;;;:::i;:::-;;;33346:157;;;-1:-1:-1::0;;33528:12:0::1;33515:10;:25:::0;33173:375::o;44135:496::-;30916:9;;:23;:9;30929:10;30916:23;30894:109;;;;;;;13761:2:1;30894:109:0;;;13743:21:1;13800:2;13780:18;;;13773:30;13839:34;13819:18;;;13812:62;13910:6;13890:18;;;13883:34;13934:19;;30894:109:0;13733:226:1;30894:109:0;44283:11:::1;44279:61;;;44311:17;:15;:17::i;:::-;44390:12;:10;:12::i;:::-;44357:122;;;44417:8;44426:4;44417:14;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;44457:11;44357:122;;;;;;14513:25:1::0;;;14569:2;14554:18;;14547:34;14501:2;14486:18;;14468:119;44357:122:0::1;;;;;;;;44510:63;44561:11;44510:46;44530:8;44539:4;44530:14;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;;44510:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;44492:15;:81;;;;44612:11;44584:8;44593:4;44584:14;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:39;;;;44135:496:::0;;;:::o;43133:312::-;43219:10;;;;43203:12;:10;:12::i;:::-;:26;;;43195:63;;;;;;;7279:2:1;43195:63:0;;;7261:21:1;7318:2;7298:18;;;7291:30;7357:26;7337:18;;;7330:54;7401:18;;43195:63:0;7251:174:1;43195:63:0;43277:25;;;43269:57;;;;;;;8039:2:1;43269:57:0;;;8021:21:1;8078:2;8058:18;;;8051:30;8117:21;8097:18;;;8090:49;8156:18;;43269:57:0;8011:169:1;43269:57:0;43362:12;:10;:12::i;:::-;43376:10;;43344:56;;;;43376:10;;;3455:34:1;;3525:15;;;3520:2;3505:18;;3498:43;43344:56:0;;;;;;;3367:18:1;43344:56:0;;;;;;;43413:10;:24;;;;;;;;;;;;;;;43133:312::o;36182:291::-;36284:7;36333:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;36389:8;:14;;36284:7;;36389:8;36342:4;;36389:14;;;;;;;;;;;;;;;;;;;;;;;;36365:38;;36446:4;:19;;;36423:4;:20;;;:42;;;;:::i;:::-;36416:49;36182:291;-1:-1:-1;;;;;36182:291:0:o;38101:1423::-;19024:1;19620:7;;:19;;19612:63;;;;;;;13401:2:1;19612:63:0;;;13383:21:1;13440:2;13420:18;;;13413:30;13479:33;13459:18;;;13452:61;13530:18;;19612:63:0;13373:181:1;19612:63:0;19024:1;19753:7;:18;38218:10:::1;::::0;38202:12:::1;:26;;38180:123;;;::::0;::::1;::::0;;6106:2:1;38180:123:0::1;::::0;::::1;6088:21:1::0;6145:2;6125:18;;;6118:30;6184:34;6164:18;;;6157:62;6255:17;6235:18;;;6228:45;6290:19;;38180:123:0::1;6078:237:1::0;38180:123:0::1;38316:21;38340:8;38349:4;38340:14;;;;;;;;;;;;;;;;;;;;;;;;;;38316:38;;38365:21;38389:8;:14;38398:4;38389:14;;;;;;;;;;;:28;38404:12;:10;:12::i;:::-;38389:28;;;;;;;;;;;;;;;38365:52;;38430:16;38441:4;38430:10;:16::i;:::-;38459:29;38483:4;38459:23;:29::i;:::-;38505:11:::0;;38501:838:::1;;38557:12:::0;;:37:::1;::::0;;;;38588:4:::1;38557:37;::::0;::::1;3135:74:1::0;38533:21:0::1;::::0;38557:12:::1;;::::0;:22:::1;::::0;3108:18:1;;38557:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38533:61;;38609:67;38639:12;:10;:12::i;:::-;38609::::0;;::::1;;::::0;38661:4:::1;38668:7:::0;38609:29:::1;:67::i;:::-;38714:12:::0;;:37:::1;::::0;;;;38745:4:::1;38714:37;::::0;::::1;3135:74:1::0;38691:20:0::1;::::0;38714:12:::1;;::::0;:22:::1;::::0;3108:18:1;;38714:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38691:60:::0;-1:-1:-1;38778:31:0::1;38691:60:::0;38795:13;38778:16:::1;:31::i;:::-;38830:17;::::0;::::1;::::0;38768:41;;-1:-1:-1;38830:17:0::1;;:21:::0;38826:246:::1;;38905:17;::::0;::::1;::::0;38872:18:::1;::::0;38893:41:::1;::::0;38928:5:::1;::::0;38893:30:::1;::::0;:7;;38905:17:::1;;38893:11;:30::i;:41::-;38979:10;::::0;38953:12;;38872:62;;-1:-1:-1;38953:49:0::1;::::0;38979:10:::1;38953:12:::0;;::::1;::::0;38979:10:::1;38872:62:::0;38953:25:::1;:49::i;:::-;39033:23;:7:::0;39045:10;39033:11:::1;:23::i;:::-;39023:33;;38826:246;;39102:11:::0;;:24:::1;::::0;39118:7;39102:15:::1;:24::i;:::-;39088:38:::0;;39156:12:::1;::::0;::::1;::::0;:25:::1;::::0;39173:7;39156:16:::1;:25::i;:::-;39141:12;::::0;::::1;:40:::0;39235:5:::1;::::0;39210:12;;39235:5:::1;39210:12:::0;;::::1;39235:5:::0;::::1;39202:39;39198:130;;;39282:17;::::0;:30:::1;::::0;39304:7;39282:21:::1;:30::i;:::-;39262:17;:50:::0;39198:130:::1;38501:838;;;39383:21;::::0;::::1;::::0;39367:11;;:48:::1;::::0;39410:4:::1;::::0;39367:38:::1;::::0;:15:::1;:38::i;:48::-;39349:15;::::0;::::1;:66:::0;39449:15:::1;39426:20;::::0;::::1;:38:::0;39502:4;39488:12:::1;:10;:12::i;:::-;39480:36;;;39508:7;39480:36;;;;14303:25:1::0;;14291:2;14276:18;;14258:76;16991:192:0;16322:12;:10;:12::i;:::-;16311:23;;:7;16137;16164:6;;;16091:87;;16311:7;:23;;;16303:68;;;;;;;10381:2:1;16303:68:0;;;10363:21:1;;;10400:18;;;10393:30;10459:34;10439:18;;;10432:62;10511:18;;16303:68:0;10353:182:1;16303:68:0;17080:22:::1;::::0;::::1;17072:73;;;::::0;::::1;::::0;;7632:2:1;17072:73:0::1;::::0;::::1;7614:21:1::0;7671:2;7651:18;;;7644:30;7710:34;7690:18;;;7683:62;7781:8;7761:18;;;7754:36;7807:19;;17072:73:0::1;7604:228:1::0;17072:73:0::1;17156:19;17166:8;17156:9;:19::i;14965:98::-:0;15045:10;14965:98;:::o;31716:460::-;31823:14;31859:30;31878:10;31859:18;:30::i;:::-;31855:314;;;-1:-1:-1;32060:23:0;32064:14;32060:23;32047:37;32043:2;32039:46;32010:90;;;-1:-1:-1;15045:10:0;32132:25;;22670:98;22728:7;22755:5;22759:1;22755;:5;:::i;40887:1447::-;40954:21;40978:8;40987:4;40978:14;;;;;;;;;;;;;;;;;;;;;;;;;;40954:38;;41003:21;41027:8;:14;41036:4;41027:14;;;;;;;;;;;:28;41042:12;:10;:12::i;:::-;41027:28;;;;;;;;;;;;;;;41003:52;;41072:4;:21;;;41097:1;41072:26;:56;;;;;41118:10;;41102:12;:26;;41072:56;41068:154;;;41189:20;;;;41169:41;;:15;;:19;:41::i;:::-;41145:21;;;:65;41068:154;41234:15;41252:93;41319:4;:15;;;41252:48;41295:4;41252:38;41268:4;:21;;;41252:4;:11;;;:15;;:38;;;;:::i;:93::-;41234:111;;41360:30;41371:4;41377:12;:10;:12::i;41360:30::-;41356:971;;;41421:1;41411:7;:11;:38;;;;41448:1;41426:4;:19;;;:23;41411:38;41407:618;;;41470:20;41493:32;41505:4;:19;;;41493:7;:11;;:32;;;;:::i;:::-;41470:55;;41602:85;41649:4;:19;;;41602:20;;:24;;:85;;;;:::i;:::-;41579:20;:108;41728:1;41706:19;;;:23;41771:15;41748:20;;;:38;;;41871:20;;;;41829:81;;41771:15;41829:19;:81::i;:::-;41805:21;;;:105;41964:45;41982:12;:10;:12::i;:::-;41996;41964:17;:45::i;:::-;41407:618;;41356:971;;;42046:11;;42042:285;;42096:19;;;;:32;;42120:7;42096:23;:32::i;:::-;42074:19;;;:54;42166:15;42143:20;;;:38;42219:20;;:33;;42244:7;42219:24;:33::i;:::-;42196:20;:56;42301:4;42287:12;:10;:12::i;:::-;42272:43;;;42307:7;42272:43;;;;14303:25:1;;14291:2;14276:18;;14258:76;42272:43:0;;;;;;;;42042:285;40887:1447;;;;:::o;23051:98::-;23109:7;23136:5;23140:1;23136;:5;:::i;11130:211::-;11274:58;;4159:42:1;4147:55;;11274:58:0;;;4129:74:1;4219:18;;;4212:34;;;11247:86:0;;11267:5;;11297:23;;4102:18:1;;11274:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11247:19;:86::i;:::-;11130:211;;;:::o;23408:98::-;23466:7;23493:5;23497:1;23493;:5;:::i;23807:98::-;23865:7;23892:5;23896:1;23892;:5;:::i;17191:173::-;17247:16;17266:6;;;17283:17;;;;;;;;;;17316:40;;17266:6;;;;;;;17316:40;;17247:16;17316:40;17191:173;;:::o;11349:248::-;11520:68;;3764:42:1;3833:15;;;11520:68:0;;;3815:34:1;3885:15;;3865:18;;;3858:43;3917:18;;;3910:34;;;11493:96:0;;11513:5;;11543:27;;3727:18:1;;11520:68:0;3709:241:1;42449:628:0;42563:17;;42530:5;;:30;;;;;42554:4;42530:30;;;3135:74:1;42530:5:0;;;;;:15;;3108:18:1;;42530:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;42526:544;;;42837:17;;42784:5;;:30;;;;;42808:4;42784:30;;;3135:74:1;42765:16:0;;42784:85;;42837:17;;42784:5;;;;;:15;;3108:18:1;;42784:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:85::-;42765:104;;42899:8;42888:7;:19;42884:175;;42928:5;;:29;;;;;:5;4147:55:1;;;42928:29:0;;;4129:74:1;4219:18;;;4212:34;;;42928:5:0;;;;:14;;4102:18:1;;42928:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42884:175;;;42983:11;;42979:80;;43015:5;;:28;;;;;:5;4147:55:1;;;43015:28:0;;;4129:74:1;4219:18;;;4212:34;;;43015:5:0;;;;:14;;4102:18:1;;43015:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13703:716::-;14127:23;14153:69;14181:4;14153:69;;;;;;;;;;;;;;;;;14161:5;14153:27;;;;:69;;;;;:::i;:::-;14237:17;;14127:95;;-1:-1:-1;14237:21:0;14233:179;;14334:10;14323:30;;;;;;;;;;;;:::i;:::-;14315:85;;;;;;;12990:2:1;14315:85:0;;;12972:21:1;13029:2;13009:18;;;13002:30;13068:34;13048:18;;;13041:62;13139:12;13119:18;;;13112:40;13169:19;;14315:85:0;12962:232:1;6296:229:0;6433:12;6465:52;6487:6;6495:4;6501:1;6504:12;6433;3813:20;;7703:60;;;;;;;11860:2:1;7703:60:0;;;11842:21:1;11899:2;11879:18;;;11872:30;11938:31;11918:18;;;11911:59;11987:18;;7703:60:0;11832:179:1;7703:60:0;7777:12;7791:23;7818:6;:11;;7837:5;7844:4;7818:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7776:73;;;;7867:52;7885:7;7894:10;7906:12;7867:17;:52::i;:::-;7860:59;7416:511;-1:-1:-1;;;;;;;7416:511:0:o;9885:712::-;10035:12;10064:7;10060:530;;;-1:-1:-1;10095:10:0;10088:17;;10060:530;10209:17;;:21;10205:374;;10407:10;10401:17;10468:15;10455:10;10451:2;10447:19;10440:44;10355:148;10550:12;10543:20;;;;;;;;;;;:::i;14:257:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:255::-;;396:2;384:9;375:7;371:23;367:32;364:2;;;417:6;409;402:22;364:2;454:9;448:16;473:28;495:5;473:28;:::i;536:190::-;;648:2;636:9;627:7;623:23;619:32;616:2;;;669:6;661;654:22;616:2;-1:-1:-1;697:23:1;;606:120;-1:-1:-1;606:120:1:o;731:194::-;;854:2;842:9;833:7;829:23;825:32;822:2;;;875:6;867;860:22;822:2;-1:-1:-1;903:16:1;;812:113;-1:-1:-1;812:113:1:o;930:325::-;;;1059:2;1047:9;1038:7;1034:23;1030:32;1027:2;;;1080:6;1072;1065:22;1027:2;1121:9;1108:23;1098:33;;1181:2;1170:9;1166:18;1153:32;1194:31;1219:5;1194:31;:::i;:::-;1244:5;1234:15;;;1017:238;;;;;:::o;1260:790::-;;;;;;;1466:3;1454:9;1445:7;1441:23;1437:33;1434:2;;;1488:6;1480;1473:22;1434:2;1529:9;1516:23;1506:33;;1589:2;1578:9;1574:18;1561:32;1602:31;1627:5;1602:31;:::i;:::-;1652:5;-1:-1:-1;1709:2:1;1694:18;;1681:32;1757:6;1744:20;;1732:33;;1722:2;;1784:6;1776;1769:22;1722:2;1812:7;-1:-1:-1;1866:2:1;1851:18;;1838:32;;-1:-1:-1;1917:3:1;1902:19;;1889:33;;-1:-1:-1;1974:3:1;1959:19;;1946:33;1988:30;1946:33;1988:30;:::i;:::-;2037:7;2027:17;;;1424:626;;;;;;;;:::o;2055:258::-;;;2184:2;2172:9;2163:7;2159:23;2155:32;2152:2;;;2205:6;2197;2190:22;2152:2;-1:-1:-1;;2233:23:1;;;2303:2;2288:18;;;2275:32;;-1:-1:-1;2142:171:1:o;2318:387::-;;;;2461:2;2449:9;2440:7;2436:23;2432:32;2429:2;;;2482:6;2474;2467:22;2429:2;2523:9;2510:23;2500:33;;2580:2;2569:9;2565:18;2552:32;2542:42;;2634:2;2623:9;2619:18;2606:32;2647:28;2669:5;2647:28;:::i;:::-;2694:5;2684:15;;;2419:286;;;;;:::o;2710:274::-;;2877:6;2871:13;2893:53;2939:6;2934:3;2927:4;2919:6;2915:17;2893:53;:::i;:::-;2962:16;;;;;2847:137;-1:-1:-1;;2847:137:1:o;5457:442::-;;5606:2;5595:9;5588:21;5638:6;5632:13;5681:6;5676:2;5665:9;5661:18;5654:34;5697:66;5756:6;5751:2;5740:9;5736:18;5731:2;5723:6;5719:15;5697:66;:::i;:::-;5815:2;5803:15;5820:66;5799:88;5784:104;;;;5890:2;5780:113;;5578:321;-1:-1:-1;;5578:321:1:o;15060:128::-;;15131:1;15127:6;15124:1;15121:13;15118:2;;;15137:18;;:::i;:::-;-1:-1:-1;15173:9:1;;15108:80::o;15193:274::-;;15259:1;15249:2;;15294:77;15291:1;15284:88;15395:4;15392:1;15385:15;15423:4;15420:1;15413:15;15249:2;-1:-1:-1;15452:9:1;;15239:228::o;15472:::-;;15638:1;15570:66;15566:74;15563:1;15560:81;15555:1;15548:9;15541:17;15537:105;15534:2;;;15645:18;;:::i;:::-;-1:-1:-1;15685:9:1;;15524:176::o;15705:125::-;;15773:1;15770;15767:8;15764:2;;;15778:18;;:::i;:::-;-1:-1:-1;15815:9:1;;15754:76::o;15835:258::-;15907:1;15917:113;15931:6;15928:1;15925:13;15917:113;;;16007:11;;;16001:18;15988:11;;;15981:39;15953:2;15946:10;15917:113;;;16048:6;16045:1;16042:13;16039:2;;;-1:-1:-1;;16083:1:1;16065:16;;16058:27;15888:205::o;16098:195::-;;16168:66;16161:5;16158:77;16155:2;;;16238:18;;:::i;:::-;-1:-1:-1;16285:1:1;16274:13;;16145:148::o;16298:184::-;16350:77;16347:1;16340:88;16447:4;16444:1;16437:15;16471:4;16468:1;16461:15;16487:154;16573:42;16566:5;16562:54;16555:5;16552:65;16542:2;;16631:1;16628;16621:12;16646:118;16732:5;16725:13;16718:21;16711:5;16708:32;16698:2;;16754:1;16751;16744:12
Swarm Source
ipfs://36b80abf00b886dacd4a36776be87c6d1dbff77d13b852e726497f5939d3b843
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.