Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 7 from a total of 7 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit | 16816621 | 979 days ago | IN | 0 ETH | 0.00188009 | ||||
| Add | 16671075 | 999 days ago | IN | 0 ETH | 0.00893538 | ||||
| Add | 16671056 | 999 days ago | IN | 0 ETH | 0.00761566 | ||||
| Deposit | 16359043 | 1043 days ago | IN | 0 ETH | 0.00082584 | ||||
| Deposit | 16359043 | 1043 days ago | IN | 0 ETH | 0.00222547 | ||||
| Deposit | 16323084 | 1048 days ago | IN | 0 ETH | 0.00148836 | ||||
| Add | 16211769 | 1064 days ago | IN | 0 ETH | 0.00251492 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ZenGarden
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-12-18
*/
pragma solidity 0.8.13;
//
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
* @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;
}
}
//
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
/**
* @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() {
_transferOwnership(_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 {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
//
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
/**
* @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 making 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;
}
}
//
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
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);
}
//
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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);
}
}
}
}
//
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
/**
* @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"
);
}
}
}
//
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
// 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 generally not needed starting with Solidity 0.8, since 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;
}
}
}
//
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)
interface IZenGarden {
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
struct PoolInfo {
IERC20 erc20Token;
uint256 allocPoint;
uint256 lastRewardBlock;
uint256 accumulatedHNRPerShare;
uint256 maxStakingAmountPerUser;
}
event PaymentReceived(address from, uint256 amount);
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
);
}
//
contract ZenGarden is Ownable, ReentrancyGuard, IZenGarden {
using SafeMath for uint256;
using SafeERC20 for IERC20;
IERC20 public HNR;
PoolInfo[] public poolInfo;
uint256 public HNRPerBlock;
uint256 public maxHNRAvailableForFarming;
uint256 public totalAllocation;
uint256 public startBlock;
uint256 public endBlock;
mapping(address => bool) isErc20TokenWhitelisted;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
constructor(
IERC20 _HNR,
uint256 _maxHNRAvailableForFarming,
uint256 blocksPerDay,
uint256 numberOfDays
) {
require(
address(_HNR) != address(0),
"constructor: _HNR must not be zero address"
);
require(
_maxHNRAvailableForFarming > 0,
"constructor: _maxHNRAvailableForFarming must be greater than zero"
);
HNR = _HNR;
maxHNRAvailableForFarming = _maxHNRAvailableForFarming;
// start at the moment of the deploy + slight delay to ensure fairness
startBlock = block.number + uint256(5000);
endBlock = startBlock.add(blocksPerDay.mul(numberOfDays));
uint256 numberOfBlocksForFarming = endBlock.sub(startBlock);
HNRPerBlock = maxHNRAvailableForFarming.div(numberOfBlocksForFarming);
}
receive() external payable virtual {
emit PaymentReceived(_msgSender(), msg.value);
}
fallback() external payable {
payable(owner()).transfer(msg.value);
}
function blockNumber() external view returns (uint256) {
return block.number;
}
function numberOfPools() external view returns (uint256) {
return poolInfo.length;
}
function add(
uint256 _allocPoint,
IERC20 _erc20Token,
uint256 _maxStakingAmountPerUser,
bool _withUpdate
) public onlyOwner {
require(block.number < endBlock, "add: must be before end");
address erc20TokenAddress = address(_erc20Token);
require(
erc20TokenAddress != address(0),
"add: _erc20Token must not be zero address"
);
require(
isErc20TokenWhitelisted[erc20TokenAddress] == false,
"add: already whitelisted"
);
require(
_maxStakingAmountPerUser > 0,
"add: _maxStakingAmountPerUser must be greater than zero"
);
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardBlock = block.number > startBlock
? block.number
: startBlock;
totalAllocation = totalAllocation.add(_allocPoint);
poolInfo.push(
PoolInfo({
erc20Token: _erc20Token,
allocPoint: _allocPoint,
lastRewardBlock: lastRewardBlock,
accumulatedHNRPerShare: 0,
maxStakingAmountPerUser: _maxStakingAmountPerUser
})
);
isErc20TokenWhitelisted[erc20TokenAddress] = true;
}
function set(
uint256 _pid,
uint256 _allocPoint,
uint256 _maxStakingAmountPerUser,
bool _withUpdate
) public onlyOwner {
require(block.number < endBlock, "set: must be before end");
require(_pid < poolInfo.length, "set: invalid _pid");
require(
_maxStakingAmountPerUser > 0,
"set: _maxStakingAmountPerUser must be greater than zero"
);
if (_withUpdate) {
massUpdatePools();
}
totalAllocation = totalAllocation.sub(poolInfo[_pid].allocPoint).add(
_allocPoint
);
poolInfo[_pid].allocPoint = _allocPoint;
poolInfo[_pid].maxStakingAmountPerUser = _maxStakingAmountPerUser;
}
function pendingHNR(uint256 _pid, address _user)
external
view
returns (uint256)
{
require(_pid < poolInfo.length, "pendingHNR: invalid _pid");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accHNRPerShare = pool.accumulatedHNRPerShare;
uint256 lpSupply = pool.erc20Token.balanceOf(address(this));
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 maxEndBlock = block.number <= endBlock ? block.number : endBlock;
uint256 multiplier = getMultiplier(pool.lastRewardBlock, maxEndBlock);
uint256 hnrReward = multiplier.mul(HNRPerBlock).mul(pool.allocPoint).div(
totalAllocation
);
accHNRPerShare = accHNRPerShare.add(hnrReward.mul(1e18).div(lpSupply));
}
return user.amount.mul(accHNRPerShare).div(1e18).sub(user.rewardDebt);
}
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; pid = uncheckedIncrement(pid)) {
updatePool(pid);
}
}
function uncheckedIncrement(uint256 index) internal pure returns (uint256) {
unchecked {
return index + 1;
}
}
function updatePool(uint256 _pid) public {
require(_pid < poolInfo.length, "updatePool: invalid _pid");
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
uint256 erc20Supply = pool.erc20Token.balanceOf(address(this));
if (erc20Supply == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 maxEndBlock = block.number <= endBlock ? block.number : endBlock;
uint256 multiplier = getMultiplier(pool.lastRewardBlock, maxEndBlock);
if (multiplier == 0) {
return;
}
uint256 hnrReward = multiplier.mul(HNRPerBlock).mul(pool.allocPoint).div(
totalAllocation
);
pool.accumulatedHNRPerShare = pool.accumulatedHNRPerShare.add(
hnrReward.mul(1e18).div(erc20Supply)
);
pool.lastRewardBlock = maxEndBlock;
}
function deposit(uint256 _pid, uint256 _amount) external nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(
user.amount.add(_amount) <= pool.maxStakingAmountPerUser,
"deposit: can not exceed max staking amount per user"
);
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = user
.amount
.mul(pool.accumulatedHNRPerShare)
.div(1e18)
.sub(user.rewardDebt);
if (pending > 0) {
safeHNRTransfer(msg.sender, pending);
}
}
if (_amount > 0) {
pool.erc20Token.safeTransferFrom(
address(msg.sender),
address(this),
_amount
);
user.amount = user.amount.add(_amount);
}
user.rewardDebt = user.amount.mul(pool.accumulatedHNRPerShare).div(1e18);
emit Deposit(msg.sender, _pid, _amount);
}
function withdraw(uint256 _pid, uint256 _amount) external nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: _amount not good");
updatePool(_pid);
uint256 pending = user
.amount
.mul(pool.accumulatedHNRPerShare)
.div(1e18)
.sub(user.rewardDebt);
if (pending > 0) {
safeHNRTransfer(msg.sender, pending);
}
if (_amount > 0) {
user.amount = user.amount.sub(_amount);
pool.erc20Token.safeTransfer(address(msg.sender), _amount);
}
user.rewardDebt = user.amount.mul(pool.accumulatedHNRPerShare).div(1e18);
emit Withdraw(msg.sender, _pid, _amount);
}
function emergencyWithdraw(uint256 _pid) external nonReentrant {
require(_pid < poolInfo.length, "updatePool: invalid _pid");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
pool.erc20Token.safeTransfer(address(msg.sender), amount);
emit EmergencyWithdraw(msg.sender, _pid, amount);
}
function safeHNRTransfer(address _to, uint256 _amount) private {
uint256 hnrBalance = HNR.balanceOf(address(this));
HNR.transfer(_to, _amount > hnrBalance ? hnrBalance : _amount);
}
function getMultiplier(uint256 _from, uint256 _to)
private
pure
returns (uint256)
{
return _to.sub(_from);
}
function updateRewardPerBlockAndEndBlock(
uint256 newRewardPerBlock,
uint256 newEndBlock
) external onlyOwner {
if (block.number >= startBlock) {
massUpdatePools();
}
require(
newEndBlock > block.number,
"Owner: New endBlock must be after current block"
);
require(
newEndBlock > startBlock,
"Owner: New endBlock must be after start block"
);
endBlock = newEndBlock;
HNRPerBlock = newRewardPerBlock;
}
function adminRewardWithdraw(uint256 amount) external onlyOwner {
HNR.safeTransfer(msg.sender, amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_HNR","type":"address"},{"internalType":"uint256","name":"_maxHNRAvailableForFarming","type":"uint256"},{"internalType":"uint256","name":"blocksPerDay","type":"uint256"},{"internalType":"uint256","name":"numberOfDays","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"HNR","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HNRPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_erc20Token","type":"address"},{"internalType":"uint256","name":"_maxStakingAmountPerUser","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxHNRAvailableForFarming","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pendingHNR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"erc20Token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accumulatedHNRPerShare","type":"uint256"},{"internalType":"uint256","name":"maxStakingAmountPerUser","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_maxStakingAmountPerUser","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"updateRewardPerBlockAndEndBlock","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"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162001f5738038062001f5783398101604081905262000034916200027a565b6200003f33620001eb565b600180556001600160a01b038416620000b25760405162461bcd60e51b815260206004820152602a60248201527f636f6e7374727563746f723a205f484e52206d757374206e6f74206265207a65604482015269726f206164647265737360b01b60648201526084015b60405180910390fd5b60008311620001345760405162461bcd60e51b815260206004820152604160248201527f636f6e7374727563746f723a205f6d6178484e52417661696c61626c65466f7260448201527f4661726d696e67206d7573742062652067726561746572207468616e207a65726064820152606f60f81b608482015260a401620000a9565b600280546001600160a01b0319166001600160a01b03861617905560058390556200016261138843620002dd565b600755620001986200018183836200023b602090811b6200145a17901c565b6007546200025060201b6200146d1790919060201c565b6008819055506000620001be6007546008546200025e60201b620014791790919060201c565b9050620001dc816005546200026c60201b620014851790919060201c565b60045550620003579350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000620002498284620002f8565b9392505050565b6000620002498284620002dd565b60006200024982846200031a565b600062000249828462000334565b600080600080608085870312156200029157600080fd5b84516001600160a01b0381168114620002a957600080fd5b60208601516040870151606090970151919890975090945092505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115620002f357620002f3620002c7565b500190565b6000816000190483118215151615620003155762000315620002c7565b500290565b6000828210156200032f576200032f620002c7565b500390565b6000826200035257634e487b7160e01b600052601260045260246000fd5b500490565b611bf080620003676000396000f3fe6080604052600436106101445760003560e01c8063715018a6116100b6578063988d7a601161006f578063988d7a6014610414578063bd7fc0c414610434578063dead81b314610454578063e2bbb15814610474578063f2fde38b14610494578063fca2dc9c146104b45761018d565b8063715018a61461032357806379203dc4146103385780638060bf0c1461034e5780638862445a1461036e5780638da5cb5b1461038e57806393f1a40b146103c05761018d565b806351eb05a61161010857806351eb05a6146102905780635312ea8e146102b057806357e871e7146102d05780635efc38d8146102e3578063630b5ba1146102f95780636f682a531461030e5761018d565b8063083c6323146101c95780631526fe27146101f25780632837b86e14610244578063441a3e701461025a57806348cd4cb11461027a5761018d565b3661018d577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080546040516001600160a01b03909116913480156108fc02929091818181858888f193505050501580156101c7573d6000803e3d6000fd5b005b3480156101d557600080fd5b506101df60085481565b6040519081526020015b60405180910390f35b3480156101fe57600080fd5b5061021261020d3660046118d6565b6104d4565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016101e9565b34801561025057600080fd5b506101df60055481565b34801561026657600080fd5b506101c76102753660046118ef565b61051f565b34801561028657600080fd5b506101df60075481565b34801561029c57600080fd5b506101c76102ab3660046118d6565b6106c7565b3480156102bc57600080fd5b506101c76102cb3660046118d6565b610866565b3480156102dc57600080fd5b50436101df565b3480156102ef57600080fd5b506101df60045481565b34801561030557600080fd5b506101c7610980565b34801561031a57600080fd5b506003546101df565b34801561032f57600080fd5b506101c76109a3565b34801561034457600080fd5b506101df60065481565b34801561035a57600080fd5b506101c76103693660046118d6565b6109d9565b34801561037a57600080fd5b506101c761038936600461191f565b610a1d565b34801561039a57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101e9565b3480156103cc57600080fd5b506103ff6103db366004611975565b600a6020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101e9565b34801561042057600080fd5b506101c761042f3660046119a5565b610bfc565b34801561044057600080fd5b506101df61044f366004611975565b610f26565b34801561046057600080fd5b506101c761046f3660046118ef565b6110f4565b34801561048057600080fd5b506101c761048f3660046118ef565b611205565b3480156104a057600080fd5b506101c76104af3660046119e4565b6113c2565b3480156104c057600080fd5b506002546103a8906001600160a01b031681565b600381815481106104e457600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60026001540361054a5760405162461bcd60e51b815260040161054190611a01565b60405180910390fd5b600260018190555060006003838154811061056757610567611a38565b60009182526020808320868452600a8252604080852033865290925292208054600590920290920192508311156105e05760405162461bcd60e51b815260206004820152601a60248201527f77697468647261773a205f616d6f756e74206e6f7420676f6f640000000000006044820152606401610541565b6105e9846106c7565b60006106268260010154610620670de0b6b3a764000061061a8760030154876000015461145a90919063ffffffff16565b90611485565b90611479565b90508015610638576106383382611491565b831561066257815461064a9085611479565b82558254610662906001600160a01b03163386611597565b6003830154825461068091670de0b6b3a76400009161061a9161145a565b6001830155604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b60035481106107135760405162461bcd60e51b81526020600482015260186024820152771d5c19185d19541bdbdb0e881a5b9d985b1a590817dc1a5960421b6044820152606401610541565b60006003828154811061072857610728611a38565b9060005260206000209060050201905080600201544311610747575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561078f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b39190611a4e565b9050806000036107c857504360029091015550565b60006008544311156107dc576008546107de565b435b905060006107f08460020154836115ff565b905080600003610801575050505050565b600061082c60065461061a87600101546108266004548761145a90919063ffffffff16565b9061145a565b90506108526108478561061a84670de0b6b3a764000061145a565b60038701549061146d565b600386015550506002909201919091555050565b6002600154036108885760405162461bcd60e51b815260040161054190611a01565b600260015560035481106108d95760405162461bcd60e51b81526020600482015260186024820152771d5c19185d19541bdbdb0e881a5b9d985b1a590817dc1a5960421b6044820152606401610541565b6000600382815481106108ee576108ee611a38565b60009182526020808320858452600a82526040808520338087529352842080548582556001820195909555600590930201805490945091929161093e916001600160a01b03919091169083611597565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595906020015b60405180910390a35050600180555050565b60035460005b8181101561099f57610997816106c7565b600101610986565b5050565b6000546001600160a01b031633146109cd5760405162461bcd60e51b815260040161054190611a67565b6109d7600061160b565b565b6000546001600160a01b03163314610a035760405162461bcd60e51b815260040161054190611a67565b600254610a1a906001600160a01b03163383611597565b50565b6000546001600160a01b03163314610a475760405162461bcd60e51b815260040161054190611a67565b6008544310610a985760405162461bcd60e51b815260206004820152601760248201527f7365743a206d757374206265206265666f726520656e640000000000000000006044820152606401610541565b6003548410610add5760405162461bcd60e51b81526020600482015260116024820152701cd95d0e881a5b9d985b1a590817dc1a59607a1b6044820152606401610541565b60008211610b4d5760405162461bcd60e51b815260206004820152603760248201527f7365743a205f6d61785374616b696e67416d6f756e7450657255736572206d7560448201527673742062652067726561746572207468616e207a65726f60481b6064820152608401610541565b8015610b5b57610b5b610980565b610b9e83610b9860038781548110610b7557610b75611a38565b90600052602060002090600502016001015460065461147990919063ffffffff16565b9061146d565b6006819055508260038581548110610bb857610bb8611a38565b9060005260206000209060050201600101819055508160038581548110610be157610be1611a38565b90600052602060002090600502016004018190555050505050565b6000546001600160a01b03163314610c265760405162461bcd60e51b815260040161054190611a67565b6008544310610c775760405162461bcd60e51b815260206004820152601760248201527f6164643a206d757374206265206265666f726520656e640000000000000000006044820152606401610541565b826001600160a01b038116610ce05760405162461bcd60e51b815260206004820152602960248201527f6164643a205f6572633230546f6b656e206d757374206e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401610541565b6001600160a01b03811660009081526009602052604090205460ff1615610d495760405162461bcd60e51b815260206004820152601860248201527f6164643a20616c72656164792077686974656c697374656400000000000000006044820152606401610541565b60008311610db95760405162461bcd60e51b815260206004820152603760248201527f6164643a205f6d61785374616b696e67416d6f756e7450657255736572206d7560448201527673742062652067726561746572207468616e207a65726f60481b6064820152608401610541565b8115610dc757610dc7610980565b60006007544311610dda57600754610ddc565b435b600654909150610dec908761146d565b6006556040805160a0810182526001600160a01b039687168152602080820198895281830193845260006060830181815260808401988952600380546001808201835591845294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600590960295860180546001600160a01b031916918d169190911790559a517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c85015594517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d84015593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e83015595517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f909101559190941684526009909252509020805460ff19169091179055565b6003546000908310610f7a5760405162461bcd60e51b815260206004820152601860248201527f70656e64696e67484e523a20696e76616c6964205f70696400000000000000006044820152606401610541565b600060038481548110610f8f57610f8f611a38565b60009182526020808320878452600a825260408085206001600160a01b03898116875293528085206005949094029091016003810154815492516370a0823160e01b815230600482015291965093949291909116906370a0823190602401602060405180830381865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e9190611a4e565b905083600201544311801561104257508015155b156110be57600060085443111561105b5760085461105d565b435b9050600061106f8660020154836115ff565b9050600061109660065461061a89600101546108266004548761145a90919063ffffffff16565b90506110b86110b18561061a84670de0b6b3a764000061145a565b869061146d565b94505050505b6110e98360010154610620670de0b6b3a764000061061a86886000015461145a90919063ffffffff16565b979650505050505050565b6000546001600160a01b0316331461111e5760405162461bcd60e51b815260040161054190611a67565b600754431061112f5761112f610980565b4381116111965760405162461bcd60e51b815260206004820152602f60248201527f4f776e65723a204e657720656e64426c6f636b206d757374206265206166746560448201526e722063757272656e7420626c6f636b60881b6064820152608401610541565b60075481116111fd5760405162461bcd60e51b815260206004820152602d60248201527f4f776e65723a204e657720656e64426c6f636b206d757374206265206166746560448201526c7220737461727420626c6f636b60981b6064820152608401610541565b600855600455565b6002600154036112275760405162461bcd60e51b815260040161054190611a01565b600260018190555060006003838154811061124457611244611a38565b60009182526020808320868452600a8252604080852033865290925292206004600590920290920190810154825491935090611280908561146d565b11156112ea5760405162461bcd60e51b815260206004820152603360248201527f6465706f7369743a2063616e206e6f7420657863656564206d6178207374616b60448201527234b7339030b6b7bab73a103832b9103ab9b2b960691b6064820152608401610541565b6112f3846106c7565b80541561133f57600061132b8260010154610620670de0b6b3a764000061061a8760030154876000015461145a90919063ffffffff16565b9050801561133d5761133d3382611491565b505b821561136b57815461135c906001600160a01b031633308661165b565b8054611368908461146d565b81555b6003820154815461138991670de0b6b3a76400009161061a9161145a565b6001820155604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200161096e565b6000546001600160a01b031633146113ec5760405162461bcd60e51b815260040161054190611a67565b6001600160a01b0381166114515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610541565b610a1a8161160b565b60006114668284611ab2565b9392505050565b60006114668284611ad1565b60006114668284611ae9565b60006114668284611b00565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190611a4e565b6002549091506001600160a01b031663a9059cbb848385116115205784611522565b835b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561156d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115919190611b22565b50505050565b6040516001600160a01b0383166024820152604481018290526115fa90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611693565b505050565b60006114668284611479565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526115919085906323b872dd60e01b906084016115c3565b60006116e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117659092919063ffffffff16565b8051909150156115fa57808060200190518101906117069190611b22565b6115fa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610541565b6060611774848460008561177c565b949350505050565b6060824710156117dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610541565b6001600160a01b0385163b6118345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610541565b600080866001600160a01b031685876040516118509190611b6b565b60006040518083038185875af1925050503d806000811461188d576040519150601f19603f3d011682016040523d82523d6000602084013e611892565b606091505b50915091506110e9828286606083156118ac575081611466565b8251156118bc5782518084602001fd5b8160405162461bcd60e51b81526004016105419190611b87565b6000602082840312156118e857600080fd5b5035919050565b6000806040838503121561190257600080fd5b50508035926020909101359150565b8015158114610a1a57600080fd5b6000806000806080858703121561193557600080fd5b843593506020850135925060408501359150606085013561195581611911565b939692955090935050565b6001600160a01b0381168114610a1a57600080fd5b6000806040838503121561198857600080fd5b82359150602083013561199a81611960565b809150509250929050565b600080600080608085870312156119bb57600080fd5b8435935060208501356119cd81611960565b925060408501359150606085013561195581611911565b6000602082840312156119f657600080fd5b813561146681611960565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a6057600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611acc57611acc611a9c565b500290565b60008219821115611ae457611ae4611a9c565b500190565b600082821015611afb57611afb611a9c565b500390565b600082611b1d57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3457600080fd5b815161146681611911565b60005b83811015611b5a578181015183820152602001611b42565b838111156115915750506000910152565b60008251611b7d818460208701611b3f565b9190910192915050565b6020815260008251806020840152611ba6816040850160208701611b3f565b601f01601f1916919091016040019291505056fea26469706673582212208cf4b36c309b3e4b643af1bf7b3541641184cb642ff2acaab8f7f7d26c70823a64736f6c634300080d0033000000000000000000000000fb3ee9923bf433f116f6186ff09a7424c1bd12890000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000012cc8000000000000000000000000000000000000000000000000000000000000016d
Deployed Bytecode
0x6080604052600436106101445760003560e01c8063715018a6116100b6578063988d7a601161006f578063988d7a6014610414578063bd7fc0c414610434578063dead81b314610454578063e2bbb15814610474578063f2fde38b14610494578063fca2dc9c146104b45761018d565b8063715018a61461032357806379203dc4146103385780638060bf0c1461034e5780638862445a1461036e5780638da5cb5b1461038e57806393f1a40b146103c05761018d565b806351eb05a61161010857806351eb05a6146102905780635312ea8e146102b057806357e871e7146102d05780635efc38d8146102e3578063630b5ba1146102f95780636f682a531461030e5761018d565b8063083c6323146101c95780631526fe27146101f25780632837b86e14610244578063441a3e701461025a57806348cd4cb11461027a5761018d565b3661018d577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080546040516001600160a01b03909116913480156108fc02929091818181858888f193505050501580156101c7573d6000803e3d6000fd5b005b3480156101d557600080fd5b506101df60085481565b6040519081526020015b60405180910390f35b3480156101fe57600080fd5b5061021261020d3660046118d6565b6104d4565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016101e9565b34801561025057600080fd5b506101df60055481565b34801561026657600080fd5b506101c76102753660046118ef565b61051f565b34801561028657600080fd5b506101df60075481565b34801561029c57600080fd5b506101c76102ab3660046118d6565b6106c7565b3480156102bc57600080fd5b506101c76102cb3660046118d6565b610866565b3480156102dc57600080fd5b50436101df565b3480156102ef57600080fd5b506101df60045481565b34801561030557600080fd5b506101c7610980565b34801561031a57600080fd5b506003546101df565b34801561032f57600080fd5b506101c76109a3565b34801561034457600080fd5b506101df60065481565b34801561035a57600080fd5b506101c76103693660046118d6565b6109d9565b34801561037a57600080fd5b506101c761038936600461191f565b610a1d565b34801561039a57600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101e9565b3480156103cc57600080fd5b506103ff6103db366004611975565b600a6020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101e9565b34801561042057600080fd5b506101c761042f3660046119a5565b610bfc565b34801561044057600080fd5b506101df61044f366004611975565b610f26565b34801561046057600080fd5b506101c761046f3660046118ef565b6110f4565b34801561048057600080fd5b506101c761048f3660046118ef565b611205565b3480156104a057600080fd5b506101c76104af3660046119e4565b6113c2565b3480156104c057600080fd5b506002546103a8906001600160a01b031681565b600381815481106104e457600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60026001540361054a5760405162461bcd60e51b815260040161054190611a01565b60405180910390fd5b600260018190555060006003838154811061056757610567611a38565b60009182526020808320868452600a8252604080852033865290925292208054600590920290920192508311156105e05760405162461bcd60e51b815260206004820152601a60248201527f77697468647261773a205f616d6f756e74206e6f7420676f6f640000000000006044820152606401610541565b6105e9846106c7565b60006106268260010154610620670de0b6b3a764000061061a8760030154876000015461145a90919063ffffffff16565b90611485565b90611479565b90508015610638576106383382611491565b831561066257815461064a9085611479565b82558254610662906001600160a01b03163386611597565b6003830154825461068091670de0b6b3a76400009161061a9161145a565b6001830155604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b60035481106107135760405162461bcd60e51b81526020600482015260186024820152771d5c19185d19541bdbdb0e881a5b9d985b1a590817dc1a5960421b6044820152606401610541565b60006003828154811061072857610728611a38565b9060005260206000209060050201905080600201544311610747575050565b80546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561078f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b39190611a4e565b9050806000036107c857504360029091015550565b60006008544311156107dc576008546107de565b435b905060006107f08460020154836115ff565b905080600003610801575050505050565b600061082c60065461061a87600101546108266004548761145a90919063ffffffff16565b9061145a565b90506108526108478561061a84670de0b6b3a764000061145a565b60038701549061146d565b600386015550506002909201919091555050565b6002600154036108885760405162461bcd60e51b815260040161054190611a01565b600260015560035481106108d95760405162461bcd60e51b81526020600482015260186024820152771d5c19185d19541bdbdb0e881a5b9d985b1a590817dc1a5960421b6044820152606401610541565b6000600382815481106108ee576108ee611a38565b60009182526020808320858452600a82526040808520338087529352842080548582556001820195909555600590930201805490945091929161093e916001600160a01b03919091169083611597565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595906020015b60405180910390a35050600180555050565b60035460005b8181101561099f57610997816106c7565b600101610986565b5050565b6000546001600160a01b031633146109cd5760405162461bcd60e51b815260040161054190611a67565b6109d7600061160b565b565b6000546001600160a01b03163314610a035760405162461bcd60e51b815260040161054190611a67565b600254610a1a906001600160a01b03163383611597565b50565b6000546001600160a01b03163314610a475760405162461bcd60e51b815260040161054190611a67565b6008544310610a985760405162461bcd60e51b815260206004820152601760248201527f7365743a206d757374206265206265666f726520656e640000000000000000006044820152606401610541565b6003548410610add5760405162461bcd60e51b81526020600482015260116024820152701cd95d0e881a5b9d985b1a590817dc1a59607a1b6044820152606401610541565b60008211610b4d5760405162461bcd60e51b815260206004820152603760248201527f7365743a205f6d61785374616b696e67416d6f756e7450657255736572206d7560448201527673742062652067726561746572207468616e207a65726f60481b6064820152608401610541565b8015610b5b57610b5b610980565b610b9e83610b9860038781548110610b7557610b75611a38565b90600052602060002090600502016001015460065461147990919063ffffffff16565b9061146d565b6006819055508260038581548110610bb857610bb8611a38565b9060005260206000209060050201600101819055508160038581548110610be157610be1611a38565b90600052602060002090600502016004018190555050505050565b6000546001600160a01b03163314610c265760405162461bcd60e51b815260040161054190611a67565b6008544310610c775760405162461bcd60e51b815260206004820152601760248201527f6164643a206d757374206265206265666f726520656e640000000000000000006044820152606401610541565b826001600160a01b038116610ce05760405162461bcd60e51b815260206004820152602960248201527f6164643a205f6572633230546f6b656e206d757374206e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401610541565b6001600160a01b03811660009081526009602052604090205460ff1615610d495760405162461bcd60e51b815260206004820152601860248201527f6164643a20616c72656164792077686974656c697374656400000000000000006044820152606401610541565b60008311610db95760405162461bcd60e51b815260206004820152603760248201527f6164643a205f6d61785374616b696e67416d6f756e7450657255736572206d7560448201527673742062652067726561746572207468616e207a65726f60481b6064820152608401610541565b8115610dc757610dc7610980565b60006007544311610dda57600754610ddc565b435b600654909150610dec908761146d565b6006556040805160a0810182526001600160a01b039687168152602080820198895281830193845260006060830181815260808401988952600380546001808201835591845294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b600590960295860180546001600160a01b031916918d169190911790559a517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c85015594517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d84015593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e83015595517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f909101559190941684526009909252509020805460ff19169091179055565b6003546000908310610f7a5760405162461bcd60e51b815260206004820152601860248201527f70656e64696e67484e523a20696e76616c6964205f70696400000000000000006044820152606401610541565b600060038481548110610f8f57610f8f611a38565b60009182526020808320878452600a825260408085206001600160a01b03898116875293528085206005949094029091016003810154815492516370a0823160e01b815230600482015291965093949291909116906370a0823190602401602060405180830381865afa15801561100a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102e9190611a4e565b905083600201544311801561104257508015155b156110be57600060085443111561105b5760085461105d565b435b9050600061106f8660020154836115ff565b9050600061109660065461061a89600101546108266004548761145a90919063ffffffff16565b90506110b86110b18561061a84670de0b6b3a764000061145a565b869061146d565b94505050505b6110e98360010154610620670de0b6b3a764000061061a86886000015461145a90919063ffffffff16565b979650505050505050565b6000546001600160a01b0316331461111e5760405162461bcd60e51b815260040161054190611a67565b600754431061112f5761112f610980565b4381116111965760405162461bcd60e51b815260206004820152602f60248201527f4f776e65723a204e657720656e64426c6f636b206d757374206265206166746560448201526e722063757272656e7420626c6f636b60881b6064820152608401610541565b60075481116111fd5760405162461bcd60e51b815260206004820152602d60248201527f4f776e65723a204e657720656e64426c6f636b206d757374206265206166746560448201526c7220737461727420626c6f636b60981b6064820152608401610541565b600855600455565b6002600154036112275760405162461bcd60e51b815260040161054190611a01565b600260018190555060006003838154811061124457611244611a38565b60009182526020808320868452600a8252604080852033865290925292206004600590920290920190810154825491935090611280908561146d565b11156112ea5760405162461bcd60e51b815260206004820152603360248201527f6465706f7369743a2063616e206e6f7420657863656564206d6178207374616b60448201527234b7339030b6b7bab73a103832b9103ab9b2b960691b6064820152608401610541565b6112f3846106c7565b80541561133f57600061132b8260010154610620670de0b6b3a764000061061a8760030154876000015461145a90919063ffffffff16565b9050801561133d5761133d3382611491565b505b821561136b57815461135c906001600160a01b031633308661165b565b8054611368908461146d565b81555b6003820154815461138991670de0b6b3a76400009161061a9161145a565b6001820155604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200161096e565b6000546001600160a01b031633146113ec5760405162461bcd60e51b815260040161054190611a67565b6001600160a01b0381166114515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610541565b610a1a8161160b565b60006114668284611ab2565b9392505050565b60006114668284611ad1565b60006114668284611ae9565b60006114668284611b00565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190611a4e565b6002549091506001600160a01b031663a9059cbb848385116115205784611522565b835b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561156d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115919190611b22565b50505050565b6040516001600160a01b0383166024820152604481018290526115fa90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611693565b505050565b60006114668284611479565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03808516602483015283166044820152606481018290526115919085906323b872dd60e01b906084016115c3565b60006116e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166117659092919063ffffffff16565b8051909150156115fa57808060200190518101906117069190611b22565b6115fa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610541565b6060611774848460008561177c565b949350505050565b6060824710156117dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610541565b6001600160a01b0385163b6118345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610541565b600080866001600160a01b031685876040516118509190611b6b565b60006040518083038185875af1925050503d806000811461188d576040519150601f19603f3d011682016040523d82523d6000602084013e611892565b606091505b50915091506110e9828286606083156118ac575081611466565b8251156118bc5782518084602001fd5b8160405162461bcd60e51b81526004016105419190611b87565b6000602082840312156118e857600080fd5b5035919050565b6000806040838503121561190257600080fd5b50508035926020909101359150565b8015158114610a1a57600080fd5b6000806000806080858703121561193557600080fd5b843593506020850135925060408501359150606085013561195581611911565b939692955090935050565b6001600160a01b0381168114610a1a57600080fd5b6000806040838503121561198857600080fd5b82359150602083013561199a81611960565b809150509250929050565b600080600080608085870312156119bb57600080fd5b8435935060208501356119cd81611960565b925060408501359150606085013561195581611911565b6000602082840312156119f657600080fd5b813561146681611960565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611a6057600080fd5b5051919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611acc57611acc611a9c565b500290565b60008219821115611ae457611ae4611a9c565b500190565b600082821015611afb57611afb611a9c565b500390565b600082611b1d57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3457600080fd5b815161146681611911565b60005b83811015611b5a578181015183820152602001611b42565b838111156115915750506000910152565b60008251611b7d818460208701611b3f565b9190910192915050565b6020815260008251806020840152611ba6816040850160208701611b3f565b601f01601f1916919091016040019291505056fea26469706673582212208cf4b36c309b3e4b643af1bf7b3541641184cb642ff2acaab8f7f7d26c70823a64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fb3ee9923bf433f116f6186ff09a7424c1bd12890000000000000000000000000000000000000000000422ca8b0a00a4250000000000000000000000000000000000000000000000000000000000000000012cc8000000000000000000000000000000000000000000000000000000000000016d
-----Decoded View---------------
Arg [0] : _HNR (address): 0xfb3EE9923Bf433f116F6186ff09A7424c1BD1289
Arg [1] : _maxHNRAvailableForFarming (uint256): 5000000000000000000000000
Arg [2] : blocksPerDay (uint256): 77000
Arg [3] : numberOfDays (uint256): 365
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000fb3ee9923bf433f116f6186ff09a7424c1bd1289
Arg [1] : 0000000000000000000000000000000000000000000422ca8b0a00a425000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000012cc8
Arg [3] : 000000000000000000000000000000000000000000000000000000000000016d
Deployed Bytecode Sourcemap
27396:8752:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28721:40;699:10;28721:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;28751:9:0;270:2:1;255:18;;248:34;161:18;28721:40:0;;;;;;;27396:8752;;1836:7;1859:6;;28808:36;;-1:-1:-1;;;;;1859:6:0;;;;28834:9;28808:36;;;;;28834:9;;28808:36;1836:7;28808:36;28834:9;1859:6;28808:36;;;;;;;;;;;;;;;;;;;;;27720:23;;;;;;;;;;;;;;;;;;;439:25:1;;;427:2;412:18;27720:23:0;;;;;;;;27546:26;;;;;;;;;;-1:-1:-1;27546:26:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;951:32:1;;;933:51;;1015:2;1000:18;;993:34;;;;1043:18;;;1036:34;;;;1101:2;1086:18;;1079:34;1144:3;1129:19;;1122:35;920:3;905:19;27546:26:0;660:503:1;27610:40:0;;;;;;;;;;;;;;;;33976:759;;;;;;;;;;-1:-1:-1;33976:759:0;;;;;:::i;:::-;;:::i;27690:25::-;;;;;;;;;;;;;;;;32140:881;;;;;;;;;;-1:-1:-1;32140:881:0;;;;;:::i;:::-;;:::i;34741:445::-;;;;;;;;;;-1:-1:-1;34741:445:0;;;;;:::i;:::-;;:::i;28856:87::-;;;;;;;;;;-1:-1:-1;28925:12:0;28856:87;;27579:26;;;;;;;;;;;;;;;;31814:184;;;;;;;;;;;;;:::i;28949:92::-;;;;;;;;;;-1:-1:-1;29020:8:0;:15;28949:92;;2401:97;;;;;;;;;;;;;:::i;27655:30::-;;;;;;;;;;;;;;;;36032:113;;;;;;;;;;-1:-1:-1;36032:113:0;;;;;:::i;:::-;;:::i;30219:680::-;;;;;;;;;;-1:-1:-1;30219:680:0;;;;;:::i;:::-;;:::i;1790:81::-;;;;;;;;;;-1:-1:-1;1836:7:0;1859:6;-1:-1:-1;;;;;1859:6:0;1790:81;;;-1:-1:-1;;;;;2159:32:1;;;2141:51;;2129:2;2114:18;1790:81:0;1995:203:1;27803:64:0;;;;;;;;;;-1:-1:-1;27803:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2833:25:1;;;2889:2;2874:18;;2867:34;;;;2806:18;27803:64:0;2659:248:1;29047:1166:0;;;;;;;;;;-1:-1:-1;29047:1166:0;;;;;:::i;:::-;;:::i;30905:903::-;;;;;;;;;;-1:-1:-1;30905:903:0;;;;;:::i;:::-;;:::i;35532:494::-;;;;;;;;;;-1:-1:-1;35532:494:0;;;;;:::i;:::-;;:::i;33027:943::-;;;;;;;;;;-1:-1:-1;33027:943:0;;;;;:::i;:::-;;:::i;2643:191::-;;;;;;;;;;-1:-1:-1;2643:191:0;;;;;:::i;:::-;;:::i;27524:17::-;;;;;;;;;;-1:-1:-1;27524:17:0;;;;-1:-1:-1;;;;;27524:17:0;;;27546:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27546:26:0;;;;-1:-1:-1;27546:26:0;;;;;:::o;33976:759::-;4864:1;5428:7;;:19;5420:63;;;;-1:-1:-1;;;5420:63:0;;;;;;;:::i;:::-;;;;;;;;;4864:1;5553:7;:18;;;;34054:21:::1;34078:8;34087:4;34078:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;34123;;;:8:::1;:14:::0;;;;;;34138:10:::1;34123:26:::0;;;;;;;34166:11;;34078:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;34166:22:0;-1:-1:-1;34166:22:0::1;34158:61;;;::::0;-1:-1:-1;;;34158:61:0;;4618:2:1;34158:61:0::1;::::0;::::1;4600:21:1::0;4657:2;4637:18;;;4630:30;4696:28;4676:18;;;4669:56;4742:18;;34158:61:0::1;4416:350:1::0;34158:61:0::1;34228:16;34239:4;34228:10;:16::i;:::-;34253:15;34271:107;34362:4;:15;;;34271:78;34344:4;34271:60;34303:4;:27;;;34271:4;:19;;;:31;;:60;;;;:::i;:::-;:72:::0;::::1;:78::i;:::-;:90:::0;::::1;:107::i;:::-;34253:125:::0;-1:-1:-1;34389:11:0;;34385:70:::1;;34411:36;34427:10;34439:7;34411:15;:36::i;:::-;34467:11:::0;;34463:139:::1;;34503:11:::0;;:24:::1;::::0;34519:7;34503:15:::1;:24::i;:::-;34489:38:::0;;34536:15;;:58:::1;::::0;-1:-1:-1;;;;;34536:15:0::1;34573:10;34586:7:::0;34536:28:::1;:58::i;:::-;34644:27;::::0;::::1;::::0;34628:11;;:54:::1;::::0;34677:4:::1;::::0;34628:44:::1;::::0;:15:::1;:44::i;:54::-;34610:15;::::0;::::1;:72:::0;34694:35:::1;::::0;439:25:1;;;34715:4:0;;34703:10:::1;::::0;34694:35:::1;::::0;427:2:1;412:18;34694:35:0::1;;;;;;;-1:-1:-1::0;;4822:1:0;5716:22;;-1:-1:-1;;;33976:759:0:o;32140:881::-;32203:8;:15;32196:22;;32188:59;;;;-1:-1:-1;;;32188:59:0;;4973:2:1;32188:59:0;;;4955:21:1;5012:2;4992:18;;;4985:30;-1:-1:-1;;;5031:18:1;;;5024:54;5095:18;;32188:59:0;4771:348:1;32188:59:0;32256:21;32280:8;32289:4;32280:14;;;;;;;;:::i;:::-;;;;;;;;;;;32256:38;;32321:4;:20;;;32305:12;:36;32301:65;;32352:7;32140:881;:::o;32301:65::-;32396:15;;:40;;-1:-1:-1;;;32396:40:0;;32430:4;32396:40;;;2141:51:1;32374:19:0;;-1:-1:-1;;;;;32396:15:0;;:25;;2114:18:1;;32396:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32374:62;;32447:11;32462:1;32447:16;32443:89;;-1:-1:-1;32497:12:0;32474:20;;;;:35;-1:-1:-1;32140:881:0:o;32443:89::-;32540:19;32578:8;;32562:12;:24;;:50;;32604:8;;32562:50;;;32589:12;32562:50;32540:72;;32619:18;32640:48;32654:4;:20;;;32676:11;32640:13;:48::i;:::-;32619:69;;32701:10;32715:1;32701:15;32697:44;;32727:7;;;;32140:881;:::o;32697:44::-;32749:17;32769:83;32830:15;;32769:48;32801:4;:15;;;32769:27;32784:11;;32769:10;:14;;:27;;;;:::i;:::-;:31;;:48::i;:83::-;32749:103;-1:-1:-1;32891:83:0;32931:36;32955:11;32931:19;32749:103;32945:4;32931:13;:19::i;:36::-;32891:27;;;;;:31;:83::i;:::-;32861:27;;;:113;-1:-1:-1;;32981:20:0;;;;:34;;;;-1:-1:-1;;32140:881:0:o;34741:445::-;4864:1;5428:7;;:19;5420:63;;;;-1:-1:-1;;;5420:63:0;;;;;;;:::i;:::-;4864:1;5553:7;:18;34826:8:::1;:15:::0;34819:22;::::1;34811:59;;;::::0;-1:-1:-1;;;34811:59:0;;4973:2:1;34811:59:0::1;::::0;::::1;4955:21:1::0;5012:2;4992:18;;;4985:30;-1:-1:-1;;;5031:18:1;;;5024:54;5095:18;;34811:59:0::1;4771:348:1::0;34811:59:0::1;34879:21;34903:8;34912:4;34903:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;34948;;;:8:::1;:14:::0;;;;;;34963:10:::1;34948:26:::0;;;;;;;35000:11;;35018:15;;;-1:-1:-1;35040:15:0;::::1;:19:::0;;;;34903:14:::1;::::0;;::::1;;35068:15:::0;;34903:14;;-1:-1:-1;34948:26:0;;35000:11;35068:57:::1;::::0;-1:-1:-1;;;;;35068:15:0;;;::::1;::::0;35000:11;35068:28:::1;:57::i;:::-;35137:43;::::0;439:25:1;;;35167:4:0;;35155:10:::1;::::0;35137:43:::1;::::0;427:2:1;412:18;35137:43:0::1;;;;;;;;-1:-1:-1::0;;4822:1:0;5716:22;;-1:-1:-1;;34741:445:0:o;31814:184::-;31872:8;:15;31855:14;31894:99;31922:6;31916:3;:12;31894:99;;;31970:15;31981:3;31970:10;:15::i;:::-;32120:1;32112:9;31894:99;;;;31848:150;31814:184::o;2401:97::-;1836:7;1859:6;-1:-1:-1;;;;;1859:6:0;699:10;1992:23;1984:68;;;;-1:-1:-1;;;1984:68:0;;;;;;;:::i;:::-;2462:30:::1;2489:1;2462:18;:30::i;:::-;2401:97::o:0;36032:113::-;1836:7;1859:6;-1:-1:-1;;;;;1859:6:0;699:10;1992:23;1984:68;;;;-1:-1:-1;;;1984:68:0;;;;;;;:::i;:::-;36103:3:::1;::::0;:36:::1;::::0;-1:-1:-1;;;;;36103:3:0::1;36120:10;36132:6:::0;36103:16:::1;:36::i;:::-;36032:113:::0;:::o;30219:680::-;1836:7;1859:6;-1:-1:-1;;;;;1859:6:0;699:10;1992:23;1984:68;;;;-1:-1:-1;;;1984:68:0;;;;;;;:::i;:::-;30391:8:::1;;30376:12;:23;30368:59;;;::::0;-1:-1:-1;;;30368:59:0;;5876:2:1;30368:59:0::1;::::0;::::1;5858:21:1::0;5915:2;5895:18;;;5888:30;5954:25;5934:18;;;5927:53;5997:18;;30368:59:0::1;5674:347:1::0;30368:59:0::1;30449:8;:15:::0;30442:22;::::1;30434:52;;;::::0;-1:-1:-1;;;30434:52:0;;6228:2:1;30434:52:0::1;::::0;::::1;6210:21:1::0;6267:2;6247:18;;;6240:30;-1:-1:-1;;;6286:18:1;;;6279:47;6343:18;;30434:52:0::1;6026:341:1::0;30434:52:0::1;30536:1;30509:24;:28;30493:117;;;::::0;-1:-1:-1;;;30493:117:0;;6574:2:1;30493:117:0::1;::::0;::::1;6556:21:1::0;6613:2;6593:18;;;6586:30;6652:34;6632:18;;;6625:62;-1:-1:-1;;;6703:18:1;;;6696:53;6766:19;;30493:117:0::1;6372:419:1::0;30493:117:0::1;30623:11;30619:51;;;30645:17;:15;:17::i;:::-;30696:77;30755:11;30696:46;30716:8;30725:4;30716:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;30696:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:77::i;:::-;30678:15;:95;;;;30810:11;30782:8;30791:4;30782:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;30869:24;30828:8;30837:4;30828:14;;;;;;;;:::i;:::-;;;;;;;;;;;:38;;:65;;;;30219:680:::0;;;;:::o;29047:1166::-;1836:7;1859:6;-1:-1:-1;;;;;1859:6:0;699:10;1992:23;1984:68;;;;-1:-1:-1;;;1984:68:0;;;;;;;:::i;:::-;29225:8:::1;;29210:12;:23;29202:59;;;::::0;-1:-1:-1;;;29202:59:0;;6998:2:1;29202:59:0::1;::::0;::::1;6980:21:1::0;7037:2;7017:18;;;7010:30;7076:25;7056:18;;;7049:53;7119:18;;29202:59:0::1;6796:347:1::0;29202:59:0::1;29304:11:::0;-1:-1:-1;;;;;29339:31:0;::::1;29323:106;;;::::0;-1:-1:-1;;;29323:106:0;;7350:2:1;29323:106:0::1;::::0;::::1;7332:21:1::0;7389:2;7369:18;;;7362:30;7428:34;7408:18;;;7401:62;-1:-1:-1;;;7479:18:1;;;7472:39;7528:19;;29323:106:0::1;7148:405:1::0;29323:106:0::1;-1:-1:-1::0;;;;;29452:42:0;::::1;;::::0;;;:23:::1;:42;::::0;;;;;::::1;;:51;29436:109;;;::::0;-1:-1:-1;;;29436:109:0;;7760:2:1;29436:109:0::1;::::0;::::1;7742:21:1::0;7799:2;7779:18;;;7772:30;7838:26;7818:18;;;7811:54;7882:18;;29436:109:0::1;7558:348:1::0;29436:109:0::1;29595:1;29568:24;:28;29552:117;;;::::0;-1:-1:-1;;;29552:117:0;;8113:2:1;29552:117:0::1;::::0;::::1;8095:21:1::0;8152:2;8132:18;;;8125:30;8191:34;8171:18;;;8164:62;-1:-1:-1;;;8242:18:1;;;8235:53;8305:19;;29552:117:0::1;7911:419:1::0;29552:117:0::1;29682:11;29678:51;;;29704:17;:15;:17::i;:::-;29737:23;29778:10;;29763:12;:25;:67;;29820:10;;29763:67;;;29798:12;29763:67;29855:15;::::0;29737:93;;-1:-1:-1;29855:32:0::1;::::0;29875:11;29855:19:::1;:32::i;:::-;29837:15;:50:::0;29916:226:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;29916:226:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;29916:226:0;;;;;;;;;;;;29894:8:::1;:255:::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;29894:255:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;30158:42;;;::::1;::::0;;:23:::1;:42:::0;;;-1:-1:-1;30158:42:0;;:49;;-1:-1:-1;;30158:49:0::1;::::0;;::::1;::::0;;29047:1166::o;30905:903::-;31026:8;:15;30992:7;;31019:22;;31011:59;;;;-1:-1:-1;;;31011:59:0;;8537:2:1;31011:59:0;;;8519:21:1;8576:2;8556:18;;;8549:30;8615:26;8595:18;;;8588:54;8659:18;;31011:59:0;8335:348:1;31011:59:0;31079:21;31103:8;31112:4;31103:14;;;;;;;;:::i;:::-;;;;;;;;;31148;;;:8;:14;;;;;;-1:-1:-1;;;;;31148:21:0;;;;;;;;;;31103:14;;;;;;;;31203:27;;;;31256:15;;:40;;-1:-1:-1;;;31256:40:0;;31290:4;31256:40;;;2141:51:1;31103:14:0;;-1:-1:-1;31148:21:0;;31103:14;31256:15;;;;;:25;;2114:18:1;;31256:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31237:59;;31324:4;:20;;;31309:12;:35;:52;;;;-1:-1:-1;31348:13:0;;;31309:52;31305:420;;;31372:19;31410:8;;31394:12;:24;;:50;;31436:8;;31394:50;;;31421:12;31394:50;31372:72;;31453:18;31474:48;31488:4;:20;;;31510:11;31474:13;:48::i;:::-;31453:69;;31531:17;31551:87;31614:15;;31551:48;31583:4;:15;;;31551:27;31566:11;;31551:10;:14;;:27;;;;:::i;:87::-;31531:107;-1:-1:-1;31664:53:0;31683:33;31707:8;31683:19;31531:107;31697:4;31683:13;:19::i;:33::-;31664:14;;:18;:53::i;:::-;31647:70;;31363:362;;;31305:420;31740:62;31786:4;:15;;;31740:41;31776:4;31740:31;31756:14;31740:4;:11;;;:15;;:31;;;;:::i;:62::-;31733:69;30905:903;-1:-1:-1;;;;;;;30905:903:0:o;35532:494::-;1836:7;1859:6;-1:-1:-1;;;;;1859:6:0;699:10;1992:23;1984:68;;;;-1:-1:-1;;;1984:68:0;;;;;;;:::i;:::-;35682:10:::1;;35666:12;:26;35662:66;;35703:17;:15;:17::i;:::-;35764:12;35750:11;:26;35734:107;;;::::0;-1:-1:-1;;;35734:107:0;;8890:2:1;35734:107:0::1;::::0;::::1;8872:21:1::0;8929:2;8909:18;;;8902:30;8968:34;8948:18;;;8941:62;-1:-1:-1;;;9019:18:1;;;9012:45;9074:19;;35734:107:0::1;8688:411:1::0;35734:107:0::1;35878:10;;35864:11;:24;35848:103;;;::::0;-1:-1:-1;;;35848:103:0;;9306:2:1;35848:103:0::1;::::0;::::1;9288:21:1::0;9345:2;9325:18;;;9318:30;9384:34;9364:18;;;9357:62;-1:-1:-1;;;9435:18:1;;;9428:43;9488:19;;35848:103:0::1;9104:409:1::0;35848:103:0::1;35960:8;:22:::0;35989:11:::1;:31:::0;35532:494::o;33027:943::-;4864:1;5428:7;;:19;5420:63;;;;-1:-1:-1;;;5420:63:0;;;;;;;:::i;:::-;4864:1;5553:7;:18;;;;33104:21:::1;33128:8;33137:4;33128:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;33173;;;:8:::1;:14:::0;;;;;;33188:10:::1;33173:26:::0;;;;;;;33252:28:::1;33128:14;::::0;;::::1;::::0;;::::1;33252:28:::0;;::::1;::::0;33224:11;;33128:14;;-1:-1:-1;33252:28:0;33224:24:::1;::::0;33240:7;33224:15:::1;:24::i;:::-;:56;;33208:141;;;::::0;-1:-1:-1;;;33208:141:0;;9720:2:1;33208:141:0::1;::::0;::::1;9702:21:1::0;9759:2;9739:18;;;9732:30;9798:34;9778:18;;;9771:62;-1:-1:-1;;;9849:18:1;;;9842:49;9908:19;;33208:141:0::1;9518:415:1::0;33208:141:0::1;33358:16;33369:4;33358:10;:16::i;:::-;33387:11:::0;;:15;33383:253:::1;;33413:15;33431:115;33530:4;:15;;;33431:84;33510:4;33431:64;33467:4;:27;;;33431:4;:21;;;:35;;:64;;;;:::i;:115::-;33413:133:::0;-1:-1:-1;33559:11:0;;33555:74:::1;;33583:36;33599:10;33611:7;33583:15;:36::i;:::-;33404:232;33383:253;33648:11:::0;;33644:194:::1;;33670:15:::0;;:113:::1;::::0;-1:-1:-1;;;;;33670:15:0::1;33721:10;33751:4;33767:7:::0;33670:32:::1;:113::i;:::-;33806:11:::0;;:24:::1;::::0;33822:7;33806:15:::1;:24::i;:::-;33792:38:::0;;33644:194:::1;33880:27;::::0;::::1;::::0;33864:11;;:54:::1;::::0;33913:4:::1;::::0;33864:44:::1;::::0;:15:::1;:44::i;:54::-;33846:15;::::0;::::1;:72:::0;33930:34:::1;::::0;439:25:1;;;33950:4:0;;33938:10:::1;::::0;33930:34:::1;::::0;427:2:1;412:18;33930:34:0::1;293:177:1::0;2643:191:0;1836:7;1859:6;-1:-1:-1;;;;;1859:6:0;699:10;1992:23;1984:68;;;;-1:-1:-1;;;1984:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2728:22:0;::::1;2720:73;;;::::0;-1:-1:-1;;;2720:73:0;;10140:2:1;2720:73:0::1;::::0;::::1;10122:21:1::0;10179:2;10159:18;;;10152:30;10218:34;10198:18;;;10191:62;-1:-1:-1;;;10269:18:1;;;10262:36;10315:19;;2720:73:0::1;9938:402:1::0;2720:73:0::1;2800:28;2819:8;2800:18;:28::i;23554:92::-:0;23612:7;23635:5;23639:1;23635;:5;:::i;:::-;23628:12;23554:92;-1:-1:-1;;;23554:92:0:o;22872:::-;22930:7;22953:5;22957:1;22953;:5;:::i;23225:92::-;23283:7;23306:5;23310:1;23306;:5;:::i;23925:92::-;23983:7;24006:5;24010:1;24006;:5;:::i;35192:194::-;35283:3;;:28;;-1:-1:-1;;;35283:28:0;;35305:4;35283:28;;;2141:51:1;35262:18:0;;-1:-1:-1;;;;;35283:3:0;;:13;;2114:18:1;;35283:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35318:3;;35262:49;;-1:-1:-1;;;;;;35318:3:0;:12;35331:3;35336:20;;;:43;;35372:7;35336:43;;;35359:10;35336:43;35318:62;;-1:-1:-1;;;;;;35318:62:0;;;;;;;-1:-1:-1;;;;;206:32:1;;;35318:62:0;;;188:51:1;255:18;;;248:34;161:18;;35318:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35255:131;35192:194;;:::o;17087:212::-;17228:58;;-1:-1:-1;;;;;206:32:1;;17228:58:0;;;188:51:1;255:18;;;248:34;;;17186:107:0;;17214:5;;-1:-1:-1;;;17251:23:0;161:18:1;;17228:58:0;;;;-1:-1:-1;;17228:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17228:58:0;-1:-1:-1;;;;;;17228:58:0;;;;;;;;;;17186:19;:107::i;:::-;17087:212;;;:::o;35392:134::-;35480:7;35506:14;:3;35514:5;35506:7;:14::i;2984:177::-;3054:16;3073:6;;-1:-1:-1;;;;;3086:17:0;;;-1:-1:-1;;;;;;3086:17:0;;;;;;3115:40;;3073:6;;;;;;;3115:40;;3054:16;3115:40;3047:114;2984:177;:::o;17305:245::-;17469:68;;-1:-1:-1;;;;;11643:15:1;;;17469:68:0;;;11625:34:1;11695:15;;11675:18;;;11668:43;11727:18;;;11720:34;;;17427:117:0;;17455:5;;-1:-1:-1;;;17492:27:0;11560:18:1;;17469:68:0;11385:375:1;19594:726:0;20002:23;20028:90;20064:4;20028:90;;;;;;;;;;;;;;;;;20036:5;-1:-1:-1;;;;;20028:27:0;;;:90;;;;;:::i;:::-;20129:17;;20002:116;;-1:-1:-1;20129:21:0;20125:190;;20224:10;20213:30;;;;;;;;;;;;:::i;:::-;20195:112;;;;-1:-1:-1;;;20195:112:0;;11967:2:1;20195:112:0;;;11949:21:1;12006:2;11986:18;;;11979:30;12045:34;12025:18;;;12018:62;-1:-1:-1;;;12096:18:1;;;12089:40;12146:19;;20195:112:0;11765:406:1;12176:209:0;12299:12;12327:52;12349:6;12357:4;12363:1;12366:12;12327:21;:52::i;:::-;12320:59;12176:209;-1:-1:-1;;;;12176:209:0:o;13270:495::-;13422:12;13484:5;13459:21;:30;;13443:102;;;;-1:-1:-1;;;13443:102:0;;12378:2:1;13443:102:0;;;12360:21:1;12417:2;12397:18;;;12390:30;12456:34;12436:18;;;12429:62;-1:-1:-1;;;12507:18:1;;;12500:36;12553:19;;13443:102:0;12176:402:1;13443:102:0;-1:-1:-1;;;;;9800:19:0;;;13552:60;;;;-1:-1:-1;;;13552:60:0;;12785:2:1;13552:60:0;;;12767:21:1;12824:2;12804:18;;;12797:30;12863:31;12843:18;;;12836:59;12912:18;;13552:60:0;12583:353:1;13552:60:0;13622:12;13636:23;13663:6;-1:-1:-1;;;;;13663:11:0;13682:5;13689:4;13663:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13621:73;;;;13708:51;13725:7;13734:10;13746:12;16020;16045:7;16041:440;;;-1:-1:-1;16070:10:0;16063:17;;16041:440;16168:17;;:21;16164:310;;16340:10;16334:17;16391:15;16378:10;16374:2;16370:19;16363:44;16164:310;16451:12;16444:20;;-1:-1:-1;;;16444:20:0;;;;;;;;:::i;475:180:1:-;534:6;587:2;575:9;566:7;562:23;558:32;555:52;;;603:1;600;593:12;555:52;-1:-1:-1;626:23:1;;475:180;-1:-1:-1;475:180:1:o;1168:248::-;1236:6;1244;1297:2;1285:9;1276:7;1272:23;1268:32;1265:52;;;1313:1;1310;1303:12;1265:52;-1:-1:-1;;1336:23:1;;;1406:2;1391:18;;;1378:32;;-1:-1:-1;1168:248:1:o;1421:118::-;1507:5;1500:13;1493:21;1486:5;1483:32;1473:60;;1529:1;1526;1519:12;1544:446;1627:6;1635;1643;1651;1704:3;1692:9;1683:7;1679:23;1675:33;1672:53;;;1721:1;1718;1711:12;1672:53;1757:9;1744:23;1734:33;;1814:2;1803:9;1799:18;1786:32;1776:42;;1865:2;1854:9;1850:18;1837:32;1827:42;;1919:2;1908:9;1904:18;1891:32;1932:28;1954:5;1932:28;:::i;:::-;1544:446;;;;-1:-1:-1;1544:446:1;;-1:-1:-1;;1544:446:1:o;2203:131::-;-1:-1:-1;;;;;2278:31:1;;2268:42;;2258:70;;2324:1;2321;2314:12;2339:315;2407:6;2415;2468:2;2456:9;2447:7;2443:23;2439:32;2436:52;;;2484:1;2481;2474:12;2436:52;2520:9;2507:23;2497:33;;2580:2;2569:9;2565:18;2552:32;2593:31;2618:5;2593:31;:::i;:::-;2643:5;2633:15;;;2339:315;;;;;:::o;2912:533::-;3009:6;3017;3025;3033;3086:3;3074:9;3065:7;3061:23;3057:33;3054:53;;;3103:1;3100;3093:12;3054:53;3139:9;3126:23;3116:33;;3199:2;3188:9;3184:18;3171:32;3212:31;3237:5;3212:31;:::i;:::-;3262:5;-1:-1:-1;3314:2:1;3299:18;;3286:32;;-1:-1:-1;3370:2:1;3355:18;;3342:32;3383:30;3342:32;3383:30;:::i;3450:247::-;3509:6;3562:2;3550:9;3541:7;3537:23;3533:32;3530:52;;;3578:1;3575;3568:12;3530:52;3617:9;3604:23;3636:31;3661:5;3636:31;:::i;3924:355::-;4126:2;4108:21;;;4165:2;4145:18;;;4138:30;4204:33;4199:2;4184:18;;4177:61;4270:2;4255:18;;3924:355::o;4284:127::-;4345:10;4340:3;4336:20;4333:1;4326:31;4376:4;4373:1;4366:15;4400:4;4397:1;4390:15;5124:184;5194:6;5247:2;5235:9;5226:7;5222:23;5218:32;5215:52;;;5263:1;5260;5253:12;5215:52;-1:-1:-1;5286:16:1;;5124:184;-1:-1:-1;5124:184:1:o;5313:356::-;5515:2;5497:21;;;5534:18;;;5527:30;5593:34;5588:2;5573:18;;5566:62;5660:2;5645:18;;5313:356::o;10345:127::-;10406:10;10401:3;10397:20;10394:1;10387:31;10437:4;10434:1;10427:15;10461:4;10458:1;10451:15;10477:168;10517:7;10583:1;10579;10575:6;10571:14;10568:1;10565:21;10560:1;10553:9;10546:17;10542:45;10539:71;;;10590:18;;:::i;:::-;-1:-1:-1;10630:9:1;;10477:168::o;10650:128::-;10690:3;10721:1;10717:6;10714:1;10711:13;10708:39;;;10727:18;;:::i;:::-;-1:-1:-1;10763:9:1;;10650:128::o;10783:125::-;10823:4;10851:1;10848;10845:8;10842:34;;;10856:18;;:::i;:::-;-1:-1:-1;10893:9:1;;10783:125::o;10913:217::-;10953:1;10979;10969:132;;11023:10;11018:3;11014:20;11011:1;11004:31;11058:4;11055:1;11048:15;11086:4;11083:1;11076:15;10969:132;-1:-1:-1;11115:9:1;;10913:217::o;11135:245::-;11202:6;11255:2;11243:9;11234:7;11230:23;11226:32;11223:52;;;11271:1;11268;11261:12;11223:52;11303:9;11297:16;11322:28;11344:5;11322:28;:::i;12941:258::-;13013:1;13023:113;13037:6;13034:1;13031:13;13023:113;;;13113:11;;;13107:18;13094:11;;;13087:39;13059:2;13052:10;13023:113;;;13154:6;13151:1;13148:13;13145:48;;;-1:-1:-1;;13189:1:1;13171:16;;13164:27;12941:258::o;13204:274::-;13333:3;13371:6;13365:13;13387:53;13433:6;13428:3;13421:4;13413:6;13409:17;13387:53;:::i;:::-;13456:16;;;;;13204:274;-1:-1:-1;;13204:274:1:o;13483:383::-;13632:2;13621:9;13614:21;13595:4;13664:6;13658:13;13707:6;13702:2;13691:9;13687:18;13680:34;13723:66;13782:6;13777:2;13766:9;13762:18;13757:2;13749:6;13745:15;13723:66;:::i;:::-;13850:2;13829:15;-1:-1:-1;;13825:29:1;13810:45;;;;13857:2;13806:54;;13483:383;-1:-1:-1;;13483:383:1:o
Swarm Source
ipfs://8cf4b36c309b3e4b643af1bf7b3541641184cb642ff2acaab8f7f7d26c70823a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.