Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
[ Download CSV Export ]
Contract Name:
CowMilk
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-03-26 */ // SPDX-License-Identifier: MIT // contract developed by xrpant // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) 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 `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); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // 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; } } } // File: cheese/milk.sol pragma solidity 0.8.2; interface ICow { function walletOfOwner(address _owner) external view returns (uint256[] memory); } interface IThief { function checkSteal(uint farmerLevel) external view returns (address catOwner, uint cat, bool stolen); } contract CowMilk is ERC20, Ownable, ReentrancyGuard { address public COW_CONTRACT = 0x6b16639137F017898A5bd711c450DA6f33fF3D11; address public THIEF_CONTRACT = 0x6d93DF876AB3aEE719dbC1c566E39Dc5Db5c5D35; address public KGOLD_CONTRACT = 0xaE2938DFfdEEC4082d391610eDb6333Fb031B421; uint public MILK_RATIO = 6; uint public MILK_PRODUCE_TIME = 86400; uint public MILK_SPOIL_TIME = 129600; mapping(address => bool) public cheesyAddresses; mapping(address => bool) public isFarming; mapping(uint => uint) public cowStakedFrom; mapping(address => uint) public farmerLevel; constructor() ERC20("Cow Milk", "cMILK"){} event ClaimedMilk(address staker, uint cMilk); event StolenMilk(address staker, address catOwner, uint cat, uint cMilk); event StakedCows(address staker, uint numCows); function _mintCowMilk(address account, uint256 amount) internal { _mint(account, amount); } function cheesyMint(address account, uint256 amount) external { require(cheesyAddresses[msg.sender], "You aren't allowed to mint."); _mint(account, amount); } function claimableView(address account) public view returns(uint, uint[] memory, uint) { require(isFarming[account], "You aren't farming!"); ICow c = ICow(COW_CONTRACT); uint[] memory _cowsStaked = c.walletOfOwner(account); uint _count = _cowsStaked.length; require(_count > 0, "You don't have any cows!"); if(_count > 1) { _count = 2; } uint milkProduced = 0; for (uint i = 0; i < _count; i++) { uint product = 0; if(block.timestamp > cowStakedFrom[_cowsStaked[i]] + MILK_PRODUCE_TIME) { product = MILK_RATIO; } if(block.timestamp > cowStakedFrom[_cowsStaked[i]] + MILK_SPOIL_TIME) { product = 0; } milkProduced += product; } return (milkProduced * 10**18, _cowsStaked, _count); } function claimCowMilk() public nonReentrant { (uint claimable, uint[] memory cows, uint count) = claimableView(msg.sender); require(claimable > 0, "Nothing to claim!"); for (uint i = 0; i < count; i++) { cowStakedFrom[cows[i]] = block.timestamp; } IThief t = IThief(THIEF_CONTRACT); (address catOwner, uint cat, bool stolen) = t.checkSteal(checkFarmerLevel(msg.sender)); if (!stolen) { _mintCowMilk(msg.sender, claimable); emit ClaimedMilk(msg.sender, claimable); } else { _mintCowMilk(catOwner, claimable); emit StolenMilk(msg.sender, catOwner, cat, claimable); } } function startFarming() external { ICow c = ICow(COW_CONTRACT); uint[] memory _cowsStaked = c.walletOfOwner(msg.sender); uint _count = _cowsStaked.length; require(_count > 0, "You don't have any cows!"); if(_count > 1) { _count = 2; } isFarming[msg.sender] = true; for (uint i = 0; i < _count; i++) { cowStakedFrom[_cowsStaked[i]] = block.timestamp; } emit StakedCows(msg.sender, _count); } function checkFarmerLevel(address farmer) public view returns(uint) { return farmerLevel[farmer]; } function increaseFarmerLevel(address farmer) external { require(msg.sender == KGOLD_CONTRACT, "Only King Pyro can call this function!"); farmerLevel[farmer] += 1; } function burn(address acc, uint amount) external { require(cheesyAddresses[msg.sender], "Only cheesy addresses can burn!"); _burn(acc, amount); } // <AdminStuff> function updateRatio(uint _milkRatio) external onlyOwner { MILK_RATIO = _milkRatio; } function updateTime(uint _produceTime, uint _spoilTime) external onlyOwner { MILK_PRODUCE_TIME = _produceTime; MILK_SPOIL_TIME = _spoilTime; } function airdropCowMilk(address account, uint amount) external onlyOwner { _mintCowMilk(account, amount*10**18); } function airdropManyCowMilk(address[] memory accounts, uint[] memory amounts) external onlyOwner { require(accounts.length == amounts.length, "Mismatching array lengths!"); for (uint i = 0; i < accounts.length; i++) { _mintCowMilk(accounts[i], amounts[i]*10**18); } } function addCheesyAddress(address account) external onlyOwner { cheesyAddresses[account] = true; } function setKingAddress(address _kAddr) public onlyOwner { KGOLD_CONTRACT = _kAddr; } function updateCowAddress(address cow) external onlyOwner { COW_CONTRACT = cow; } function updateThiefAddress(address thief) external onlyOwner { THIEF_CONTRACT = thief; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"cMilk","type":"uint256"}],"name":"ClaimedMilk","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":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"numCows","type":"uint256"}],"name":"StakedCows","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"address","name":"catOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"cat","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cMilk","type":"uint256"}],"name":"StolenMilk","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COW_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KGOLD_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MILK_PRODUCE_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MILK_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MILK_SPOIL_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"THIEF_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addCheesyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdropCowMilk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropManyCowMilk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"farmer","type":"address"}],"name":"checkFarmerLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cheesyAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"cheesyMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimCowMilk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableView","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cowStakedFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"farmerLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"farmer","type":"address"}],"name":"increaseFarmerLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFarming","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_kAddr","type":"address"}],"name":"setKingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cow","type":"address"}],"name":"updateCowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_milkRatio","type":"uint256"}],"name":"updateRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"thief","type":"address"}],"name":"updateThiefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_produceTime","type":"uint256"},{"internalType":"uint256","name":"_spoilTime","type":"uint256"}],"name":"updateTime","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600780546001600160a01b0319908116736b16639137f017898a5bd711c450da6f33ff3d1117909155600880548216736d93df876ab3aee719dbc1c566e39dc5db5c5d351790556009805490911673ae2938dffdeec4082d391610edb6333fb031b4211790556006600a5562015180600b556201fa40600c553480156200008a57600080fd5b506040805180820182526008815267436f77204d696c6b60c01b602080830191825283518085019094526005845264634d494c4b60d81b908401528151919291620000d8916003916200016c565b508051620000ee9060049060208401906200016c565b5050506200010b620001056200011660201b60201c565b6200011a565b60016006556200024f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200017a9062000212565b90600052602060002090601f0160209004810192826200019e5760008555620001e9565b82601f10620001b957805160ff1916838001178555620001e9565b82800160010185558215620001e9579182015b82811115620001e9578251825591602001919060010190620001cc565b50620001f7929150620001fb565b5090565b5b80821115620001f75760008155600101620001fc565b6002810460018216806200022757607f821691505b602082108114156200024957634e487b7160e01b600052602260045260246000fd5b50919050565b611e14806200025f6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c8063715018a61161013b578063bec12c85116100b8578063dd62ed3e1161007c578063dd62ed3e1461052b578063f1a7916f14610564578063f2fde38b14610577578063f5943c961461058a578063f8d98c82146105935761023d565b8063bec12c85146104bf578063c22737fd146104d2578063c689c62f146104e5578063d95fdf8d146104f8578063dc647e29146105185761023d565b806395d89b41116100ff57806395d89b41146104765780639dc29fac1461047e578063a457c2d714610491578063a9059cbb146104a4578063afbcfea1146104b75761023d565b8063715018a6146104145780637e6d87d81461041c5780638c0c10071461043f5780638da5cb5b146104525780638e95fb49146104635761023d565b806335c90890116101c9578063605fba671161018d578063605fba671461038057806361af9abe146103a257806363eb192c146103b55780636c0305b0146103c857806370a08231146103eb5761023d565b806335c9089014610313578063395093511461033c57806340871f751461034f578063552a2e0814610357578063558eb43b146103605761023d565b806318160ddd1161021057806318160ddd146102c357806321f1b677146102d557806323b872dd146102e8578063273ddf35146102fb578063313ce567146103045761023d565b806306fdde0314610242578063095ea7b3146102605780630e8fc2281461028357806312c1224814610298575b600080fd5b61024a6105a6565b6040516102579190611bc6565b60405180910390f35b61027361026e3660046119cc565b610638565b6040519015158152602001610257565b610296610291366004611931565b610650565b005b6009546102ab906001600160a01b031681565b6040516001600160a01b039091168152602001610257565b6002545b604051908152602001610257565b6102966102e3366004611ba5565b6106a5565b6102736102f636600461198c565b6106da565b6102c7600a5481565b60405160128152602001610257565b6102c7610321366004611931565b6001600160a01b031660009081526010602052604090205490565b61027361034a3660046119cc565b6106fe565b61029661073d565b6102c7600c5481565b6102c761036e366004611b8d565b600f6020526000908152604090205481565b61039361038e366004611931565b6109a9565b60405161025793929190611c4e565b6102966103b0366004611931565b610be2565b6102966103c3366004611a3d565b610c30565b6102736103d6366004611931565b600d6020526000908152604090205460ff1681565b6102c76103f9366004611931565b6001600160a01b031660009081526020819052604090205490565b610296610d39565b61027361042a366004611931565b600e6020526000908152604090205460ff1681565b61029661044d366004611931565b610d6f565b6005546001600160a01b03166102ab565b6102966104713660046119cc565b610e09565b61024a610e76565b61029661048c3660046119cc565b610e85565b61027361049f3660046119cc565b610eee565b6102736104b23660046119cc565b610f80565b610296610f8e565b6102966104cd3660046119cc565b61111f565b6008546102ab906001600160a01b031681565b6102966104f3366004611931565b61115f565b6102c7610506366004611931565b60106020526000908152604090205481565b610296610526366004611b8d565b6111ab565b6102c7610539366004611954565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610296610572366004611931565b6111da565b610296610585366004611931565b611226565b6102c7600b5481565b6007546102ab906001600160a01b031681565b6060600380546105b590611d47565b80601f01602080910402602001604051908101604052809291908181526020018280546105e190611d47565b801561062e5780601f106106035761010080835404028352916020019161062e565b820191906000526020600020905b81548152906001019060200180831161061157829003601f168201915b5050505050905090565b6000336106468185856112c1565b5060019392505050565b6005546001600160a01b031633146106835760405162461bcd60e51b815260040161067a90611c19565b60405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146106cf5760405162461bcd60e51b815260040161067a90611c19565b600b91909155600c55565b6000336106e88582856113e5565b6106f3858585611477565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106469082908690610738908790611cf9565b6112c1565b600260065414156107905760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b6002600655600080806107a2336109a9565b925092509250600083116107ec5760405162461bcd60e51b81526020600482015260116024820152704e6f7468696e6720746f20636c61696d2160781b604482015260640161067a565b60005b818110156108495742600f600085848151811061081c57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550808061084190611d82565b9150506107ef565b506008546001600160a01b03166000808083635d08851861087f336001600160a01b031660009081526010602052604090205490565b6040518263ffffffff1660e01b815260040161089d91815260200190565b60606040518083038186803b1580156108b557600080fd5b505afa1580156108c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ed91906119f7565b92509250925080610940576109023388610e68565b60408051338152602081018990527fd56bdb4e4347906f043b50631e5fe828352903a7a47f25a42a1e0c64cdf53c19910160405180910390a161099b565b61094a8388610e68565b604080513381526001600160a01b0385166020820152908101839052606081018890527facd5f580dfb5423e24b03b6ba35880e6e9a4f7f9c8593ae787e7ccc5f2d306c69060800160405180910390a15b505060016006555050505050565b6001600160a01b0381166000908152600e6020526040812054606090829060ff16610a0c5760405162461bcd60e51b8152602060048201526013602482015272596f75206172656e2774206661726d696e672160681b604482015260640161067a565b60075460405162438b6360e81b81526001600160a01b03868116600483015290911690600090829063438b63009060240160006040518083038186803b158015610a5557600080fd5b505afa158015610a69573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a919190810190611afd565b805190915080610ade5760405162461bcd60e51b8152602060048201526018602482015277596f7520646f6e2774206861766520616e7920636f77732160401b604482015260640161067a565b6001811115610aeb575060025b6000805b82811015610bc0576000600b54600f6000878581518110610b2057634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002054610b419190611cf9565b421115610b4d5750600a545b600c54600f6000878581518110610b7457634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002054610b959190611cf9565b421115610ba0575060005b610baa8184611cf9565b9250508080610bb890611d82565b915050610aef565b50610bd381670de0b6b3a7640000611d11565b98929750909550909350505050565b6005546001600160a01b03163314610c0c5760405162461bcd60e51b815260040161067a90611c19565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b6005546001600160a01b03163314610c5a5760405162461bcd60e51b815260040161067a90611c19565b8051825114610cab5760405162461bcd60e51b815260206004820152601a60248201527f4d69736d61746368696e67206172726179206c656e6774687321000000000000604482015260640161067a565b60005b8251811015610d3457610d22838281518110610cda57634e487b7160e01b600052603260045260246000fd5b6020026020010151838381518110610d0257634e487b7160e01b600052603260045260246000fd5b6020026020010151670de0b6b3a7640000610d1d9190611d11565b610e68565b80610d2c81611d82565b915050610cae565b505050565b6005546001600160a01b03163314610d635760405162461bcd60e51b815260040161067a90611c19565b610d6d6000611645565b565b6009546001600160a01b03163314610dd85760405162461bcd60e51b815260206004820152602660248201527f4f6e6c79204b696e67205079726f2063616e2063616c6c20746869732066756e6044820152656374696f6e2160d01b606482015260840161067a565b6001600160a01b0381166000908152601060205260408120805460019290610e01908490611cf9565b909155505050565b336000908152600d602052604090205460ff16610e685760405162461bcd60e51b815260206004820152601b60248201527f596f75206172656e277420616c6c6f77656420746f206d696e742e0000000000604482015260640161067a565b610e728282611697565b5050565b6060600480546105b590611d47565b336000908152600d602052604090205460ff16610ee45760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636865657379206164647265737365732063616e206275726e2100604482015260640161067a565b610e728282611777565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610f735760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161067a565b6106f382868684036112c1565b600033610646818585611477565b60075460405162438b6360e81b81523360048201526001600160a01b0390911690600090829063438b63009060240160006040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110119190810190611afd565b80519091508061105e5760405162461bcd60e51b8152602060048201526018602482015277596f7520646f6e2774206861766520616e7920636f77732160401b604482015260640161067a565b600181111561106b575060025b336000908152600e60205260408120805460ff191660011790555b818110156110e05742600f60008584815181106110b357634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000208190555080806110d890611d82565b915050611086565b5060408051338152602081018390527f74037c2313aeb99058fad8af316121a0c0e8c458296655922d1f47a68affe75c910160405180910390a1505050565b6005546001600160a01b031633146111495760405162461bcd60e51b815260040161067a90611c19565b610e7282610d1d83670de0b6b3a7640000611d11565b6005546001600160a01b031633146111895760405162461bcd60e51b815260040161067a90611c19565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111d55760405162461bcd60e51b815260040161067a90611c19565b600a55565b6005546001600160a01b031633146112045760405162461bcd60e51b815260040161067a90611c19565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146112505760405162461bcd60e51b815260040161067a90611c19565b6001600160a01b0381166112b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067a565b6112be81611645565b50565b6001600160a01b0383166113235760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161067a565b6001600160a01b0382166113845760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161067a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461147157818110156114645760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161067a565b61147184848484036112c1565b50505050565b6001600160a01b0383166114db5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161067a565b6001600160a01b03821661153d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161067a565b6001600160a01b038316600090815260208190526040902054818110156115b55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161067a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906115ec908490611cf9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161163891815260200190565b60405180910390a3611471565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166116ed5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161067a565b80600260008282546116ff9190611cf9565b90915550506001600160a01b0382166000908152602081905260408120805483929061172c908490611cf9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610e72565b6001600160a01b0382166117d75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161067a565b6001600160a01b0382166000908152602081905260409020548181101561184b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161067a565b6001600160a01b038316600090815260208190526040812083830390556002805484929061187a908490611d30565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3610d34565b600082601f8301126118d5578081fd5b813560206118ea6118e583611cd5565b611ca4565b8281528181019085830183850287018401881015611906578586fd5b855b8581101561192457813584529284019290840190600101611908565b5090979650505050505050565b600060208284031215611942578081fd5b813561194d81611dc9565b9392505050565b60008060408385031215611966578081fd5b823561197181611dc9565b9150602083013561198181611dc9565b809150509250929050565b6000806000606084860312156119a0578081fd5b83356119ab81611dc9565b925060208401356119bb81611dc9565b929592945050506040919091013590565b600080604083850312156119de578182fd5b82356119e981611dc9565b946020939093013593505050565b600080600060608486031215611a0b578283fd5b8351611a1681611dc9565b6020850151604086015191945092508015158114611a32578182fd5b809150509250925092565b60008060408385031215611a4f578182fd5b823567ffffffffffffffff80821115611a66578384fd5b818501915085601f830112611a79578384fd5b81356020611a896118e583611cd5565b82815281810190858301838502870184018b1015611aa5578889fd5b8896505b84871015611ad0578035611abc81611dc9565b835260019690960195918301918301611aa9565b5096505086013592505080821115611ae6578283fd5b50611af3858286016118c5565b9150509250929050565b60006020808385031215611b0f578182fd5b825167ffffffffffffffff811115611b25578283fd5b8301601f81018513611b35578283fd5b8051611b436118e582611cd5565b8181528381019083850185840285018601891015611b5f578687fd5b8694505b83851015611b81578051835260019490940193918501918501611b63565b50979650505050505050565b600060208284031215611b9e578081fd5b5035919050565b60008060408385031215611bb7578182fd5b50508035926020909101359150565b6000602080835283518082850152825b81811015611bf257858101830151858201604001528201611bd6565b81811115611c035783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006060820185835260206060818501528186518084526080860191508288019350845b81811015611c8e57845183529383019391830191600101611c72565b5050809350505050826040830152949350505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715611ccd57611ccd611db3565b604052919050565b600067ffffffffffffffff821115611cef57611cef611db3565b5060209081020190565b60008219821115611d0c57611d0c611d9d565b500190565b6000816000190483118215151615611d2b57611d2b611d9d565b500290565b600082821015611d4257611d42611d9d565b500390565b600281046001821680611d5b57607f821691505b60208210811415611d7c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611d9657611d96611d9d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146112be57600080fdfea264697066735822122016030a0e41ab25b32ca68b6abb5a4df136dea603c9b6b7237496eb7f9a73b39d64736f6c63430008020033
Deployed ByteCode Sourcemap
30136:5067:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12008:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14359:201;;;;;;:::i;:::-;;:::i;:::-;;;6470:14:1;;6463:22;6445:41;;6433:2;6418:18;14359:201:0;6400:92:1;34887:97:0;;;;;;:::i;:::-;;:::i;:::-;;30357:74;;;;;-1:-1:-1;;;;;30357:74:0;;;;;;-1:-1:-1;;;;;5530:32:1;;;5512:51;;5500:2;5485:18;30357:74:0;5467:102:1;13128:108:0;13216:12;;13128:108;;;14858:25:1;;;14846:2;14831:18;13128:108:0;14813:76:1;34126:165:0;;;;;;:::i;:::-;;:::i;15140:295::-;;;;;;:::i;:::-;;:::i;30440:26::-;;;;;;12970:93;;;13053:2;15819:36:1;;15807:2;15792:18;12970:93:0;15774:87:1;33505:113:0;;;;;;:::i;:::-;-1:-1:-1;;;;;33591:19:0;33567:4;33591:19;;;:11;:19;;;;;;;33505:113;15844:240;;;;;;:::i;:::-;;:::i;32236:733::-;;;:::i;30517:36::-;;;;;;30664:42;;;;;;:::i;:::-;;;;;;;;;;;;;;31303:925;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;34767:112::-;;;;;;:::i;:::-;;:::i;34435:324::-;;;;;;:::i;:::-;;:::i;30562:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13299:127;;;;;;:::i;:::-;-1:-1:-1;;;;;13400:18:0;13373:7;13400:18;;;;;;;;;;;;13299:127;5431:103;;;:::i;30616:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33626:187;;;;;;:::i;:::-;;:::i;4780:87::-;4853:6;;-1:-1:-1;;;;;4853:6:0;4780:87;;31114:181;;;;;;:::i;:::-;;:::i;12227:104::-;;;:::i;33821:169::-;;;;;;:::i;:::-;;:::i;16587:438::-;;;;;;:::i;:::-;;:::i;13632:193::-;;;;;;:::i;:::-;;:::i;32977:520::-;;;:::i;34299:128::-;;;;;;:::i;:::-;;:::i;30276:74::-;;;;;-1:-1:-1;;;;;30276:74:0;;;34992:95;;;;;;:::i;:::-;;:::i;30713:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;34019:99;;;;;;:::i;:::-;;:::i;13888:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;14004:18:0;;;13977:7;14004:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13888:151;35095:103;;;;;;:::i;:::-;;:::i;5689:201::-;;;;;;:::i;:::-;;:::i;30473:37::-;;;;;;30197:72;;;;;-1:-1:-1;;;;;30197:72:0;;;12008:100;12062:13;12095:5;12088:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12008:100;:::o;14359:201::-;14442:4;3584:10;14498:32;3584:10;14514:7;14523:6;14498:8;:32::i;:::-;-1:-1:-1;14548:4:0;;14359:201;-1:-1:-1;;;14359:201:0:o;34887:97::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;;;;;;;;;34953:14:::1;:23:::0;;-1:-1:-1;;;;;;34953:23:0::1;-1:-1:-1::0;;;;;34953:23:0;;;::::1;::::0;;;::::1;::::0;;34887:97::o;34126:165::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;34212:17:::1;:32:::0;;;;34255:15:::1;:28:::0;34126:165::o;15140:295::-;15271:4;3584:10;15329:38;15345:4;3584:10;15360:6;15329:15;:38::i;:::-;15378:27;15388:4;15394:2;15398:6;15378:9;:27::i;:::-;-1:-1:-1;15423:4:0;;15140:295;-1:-1:-1;;;;15140:295:0:o;15844:240::-;3584:10;15932:4;16013:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;16013:27:0;;;;;;;;;;15932:4;;3584:10;15988:66;;3584:10;;16013:27;;:40;;16043:10;;16013:40;:::i;:::-;15988:8;:66::i;32236:733::-;1878:1;2476:7;;:19;;2468:63;;;;-1:-1:-1;;;2468:63:0;;13442:2:1;2468:63:0;;;13424:21:1;13481:2;13461:18;;;13454:30;13520:33;13500:18;;;13493:61;13571:18;;2468:63:0;13414:181:1;2468:63:0;1878:1;2609:7;:18;32292:14:::1;::::0;;32342:25:::1;32356:10;32342:13;:25::i;:::-;32291:76;;;;;;32398:1;32386:9;:13;32378:43;;;::::0;-1:-1:-1;;;32378:43:0;;13802:2:1;32378:43:0::1;::::0;::::1;13784:21:1::0;13841:2;13821:18;;;13814:30;-1:-1:-1;;;13860:18:1;;;13853:47;13917:18;;32378:43:0::1;13774:167:1::0;32378:43:0::1;32439:6;32434:100;32455:5;32451:1;:9;32434:100;;;32507:15;32482:13;:22;32496:4;32501:1;32496:7;;;;;;-1:-1:-1::0;;;32496:7:0::1;;;;;;;;;;;;;;;32482:22;;;;;;;;;;;:40;;;;32462:3;;;;;:::i;:::-;;;;32434:100;;;-1:-1:-1::0;32564:14:0::1;::::0;-1:-1:-1;;;;;32564:14:0::1;32546:8;::::0;;32564:14;32634:12:::1;32647:28;32664:10;-1:-1:-1::0;;;;;33591:19:0;33567:4;33591:19;;;:11;:19;;;;;;;33505:113;32647:28:::1;32634:42;;;;;;;;;;;;;14858:25:1::0;;14846:2;14831:18;;14813:76;32634:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32590:86;;;;;;32694:6;32689:263;;32717:35;32730:10;32742:9;32717:12;:35::i;:::-;32772:34;::::0;;32784:10:::1;6200:51:1::0;;6282:2;6267:18;;6260:34;;;32772::0::1;::::0;6173:18:1;32772:34:0::1;;;;;;;32689:263;;;32839:33;32852:8;32862:9;32839:12;:33::i;:::-;32892:48;::::0;;32903:10:::1;5843:34:1::0;;-1:-1:-1;;;;;5913:15:1;;5908:2;5893:18;;5886:43;5945:18;;;5938:34;;;6003:2;5988:18;;5981:34;;;32892:48:0::1;::::0;5792:3:1;5777:19;32892:48:0::1;;;;;;;32689:263;-1:-1:-1::0;;1834:1:0;2788:7;:22;-1:-1:-1;;;;;32236:733:0:o;31303:925::-;-1:-1:-1;;;;;31409:18:0;;31363:4;31409:18;;;:9;:18;;;;;;31369:13;;31363:4;;31409:18;;31401:50;;;;-1:-1:-1;;;31401:50:0;;9635:2:1;31401:50:0;;;9617:21:1;9674:2;9654:18;;;9647:30;-1:-1:-1;;;9693:18:1;;;9686:49;9752:18;;31401:50:0;9607:169:1;31401:50:0;31476:12;;31528:24;;-1:-1:-1;;;31528:24:0;;-1:-1:-1;;;;;5530:32:1;;;31528:24:0;;;5512:51:1;31476:12:0;;;;31462:6;;31476:12;;31528:15;;5485:18:1;;31528:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31528:24:0;;;;;;;;;;;;:::i;:::-;31577:18;;31500:52;;-1:-1:-1;31614:10:0;31606:47;;;;-1:-1:-1;;;31606:47:0;;9282:2:1;31606:47:0;;;9264:21:1;9321:2;9301:18;;;9294:30;-1:-1:-1;;;9340:18:1;;;9333:54;9404:18;;31606:47:0;9254:174:1;31606:47:0;31678:1;31669:6;:10;31666:52;;;-1:-1:-1;31705:1:0;31666:52;31731:17;31770:6;31765:392;31786:6;31782:1;:10;31765:392;;;31814:12;31900:17;;31868:13;:29;31882:11;31894:1;31882:14;;;;;;-1:-1:-1;;;31882:14:0;;;;;;;;;;;;;;;31868:29;;;;;;;;;;;;:49;;;;:::i;:::-;31850:15;:67;31847:127;;;-1:-1:-1;31948:10:0;;31847:127;32043:15;;32011:13;:29;32025:11;32037:1;32025:14;;;;;;-1:-1:-1;;;32025:14:0;;;;;;;;;;;;;;;32011:29;;;;;;;;;;;;:47;;;;:::i;:::-;31993:15;:65;31990:116;;;-1:-1:-1;32089:1:0;31990:116;32122:23;32138:7;32122:23;;:::i;:::-;;;31765:392;31794:3;;;;;:::i;:::-;;;;31765:392;;;-1:-1:-1;32177:21:0;:12;32192:6;32177:21;:::i;:::-;32169:51;32200:11;;-1:-1:-1;32213:6:0;;-1:-1:-1;31303:925:0;;-1:-1:-1;;;;31303:925:0:o;34767:112::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34840:24:0::1;;::::0;;;:15:::1;:24;::::0;;;;:31;;-1:-1:-1;;34840:31:0::1;34867:4;34840:31;::::0;;34767:112::o;34435:324::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;34570:7:::1;:14;34551:8;:15;:33;34543:72;;;::::0;-1:-1:-1;;;34543:72:0;;10390:2:1;34543:72:0::1;::::0;::::1;10372:21:1::0;10429:2;10409:18;;;10402:30;10468:28;10448:18;;;10441:56;10514:18;;34543:72:0::1;10362:176:1::0;34543:72:0::1;34633:6;34628:114;34649:8;:15;34645:1;:19;34628:114;;;34686:44;34699:8;34708:1;34699:11;;;;;;-1:-1:-1::0;;;34699:11:0::1;;;;;;;;;;;;;;;34712:7;34720:1;34712:10;;;;;;-1:-1:-1::0;;;34712:10:0::1;;;;;;;;;;;;;;;34723:6;34712:17;;;;:::i;:::-;34686:12;:44::i;:::-;34666:3:::0;::::1;::::0;::::1;:::i;:::-;;;;34628:114;;;;34435:324:::0;;:::o;5431:103::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;5496:30:::1;5523:1;5496:18;:30::i;:::-;5431:103::o:0;33626:187::-;33713:14;;-1:-1:-1;;;;;33713:14:0;33699:10;:28;33691:79;;;;-1:-1:-1;;;33691:79:0;;10745:2:1;33691:79:0;;;10727:21:1;10784:2;10764:18;;;10757:30;10823:34;10803:18;;;10796:62;-1:-1:-1;;;10874:18:1;;;10867:36;10920:19;;33691:79:0;10717:228:1;33691:79:0;-1:-1:-1;;;;;33781:19:0;;;;;;:11;:19;;;;;:24;;33804:1;;33781:19;:24;;33804:1;;33781:24;:::i;:::-;;;;-1:-1:-1;;;33626:187:0:o;31114:181::-;31211:10;31195:27;;;;:15;:27;;;;;;;;31187:67;;;;-1:-1:-1;;;31187:67:0;;11152:2:1;31187:67:0;;;11134:21:1;11191:2;11171:18;;;11164:30;11230:29;11210:18;;;11203:57;11277:18;;31187:67:0;11124:177:1;31187:67:0;31265:22;31271:7;31280:6;31265:5;:22::i;:::-;31114:181;;:::o;12227:104::-;12283:13;12316:7;12309:14;;;;;:::i;33821:169::-;33905:10;33889:27;;;;:15;:27;;;;;;;;33881:71;;;;-1:-1:-1;;;33881:71:0;;11508:2:1;33881:71:0;;;11490:21:1;11547:2;11527:18;;;11520:30;11586:33;11566:18;;;11559:61;11637:18;;33881:71:0;11480:181:1;33881:71:0;33964:18;33970:3;33975:6;33964:5;:18::i;16587:438::-;3584:10;16680:4;16763:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;16763:27:0;;;;;;;;;;16680:4;;3584:10;16809:35;;;;16801:85;;;;-1:-1:-1;;;16801:85:0;;14148:2:1;16801:85:0;;;14130:21:1;14187:2;14167:18;;;14160:30;14226:34;14206:18;;;14199:62;-1:-1:-1;;;14277:18:1;;;14270:35;14322:19;;16801:85:0;14120:227:1;16801:85:0;16922:60;16931:5;16938:7;16966:15;16947:16;:34;16922:8;:60::i;13632:193::-;13711:4;3584:10;13767:28;3584:10;13784:2;13788:6;13767:9;:28::i;32977:520::-;33035:12;;33087:27;;-1:-1:-1;;;33087:27:0;;33103:10;33087:27;;;5512:51:1;-1:-1:-1;;;;;33035:12:0;;;;33021:6;;33035:12;;33087:15;;5485:18:1;;33087:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33087:27:0;;;;;;;;;;;;:::i;:::-;33139:18;;33059:55;;-1:-1:-1;33176:10:0;33168:47;;;;-1:-1:-1;;;33168:47:0;;9282:2:1;33168:47:0;;;9264:21:1;9321:2;9301:18;;;9294:30;-1:-1:-1;;;9340:18:1;;;9333:54;9404:18;;33168:47:0;9254:174:1;33168:47:0;33240:1;33231:6;:10;33228:52;;;-1:-1:-1;33267:1:0;33228:52;33303:10;33293:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;33293:28:0;33317:4;33293:28;;;33334:108;33355:6;33351:1;:10;33334:108;;;33415:15;33383:13;:29;33397:11;33409:1;33397:14;;;;;;-1:-1:-1;;;33397:14:0;;;;;;;;;;;;;;;33383:29;;;;;;;;;;;:47;;;;33363:3;;;;;:::i;:::-;;;;33334:108;;;-1:-1:-1;33459:30:0;;;33470:10;6200:51:1;;6282:2;6267:18;;6260:34;;;33459:30:0;;6173:18:1;33459:30:0;;;;;;;32977:520;;;:::o;34299:128::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;34383:36:::1;34396:7:::0;34405:13:::1;:6:::0;34412::::1;34405:13;:::i;34992:95::-:0;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;35061:12:::1;:18:::0;;-1:-1:-1;;;;;;35061:18:0::1;-1:-1:-1::0;;;;;35061:18:0;;;::::1;::::0;;;::::1;::::0;;34992:95::o;34019:99::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;34087:10:::1;:23:::0;34019:99::o;35095:103::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;35168:14:::1;:22:::0;;-1:-1:-1;;;;;;35168:22:0::1;-1:-1:-1::0;;;;;35168:22:0;;;::::1;::::0;;;::::1;::::0;;35095:103::o;5689:201::-;4853:6;;-1:-1:-1;;;;;4853:6:0;3584:10;5000:23;4992:68;;;;-1:-1:-1;;;4992:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5778:22:0;::::1;5770:73;;;::::0;-1:-1:-1;;;5770:73:0;;8114:2:1;5770:73:0::1;::::0;::::1;8096:21:1::0;8153:2;8133:18;;;8126:30;8192:34;8172:18;;;8165:62;-1:-1:-1;;;8243:18:1;;;8236:36;8289:19;;5770:73:0::1;8086:228:1::0;5770:73:0::1;5854:28;5873:8;5854:18;:28::i;:::-;5689:201:::0;:::o;20223:380::-;-1:-1:-1;;;;;20359:19:0;;20351:68;;;;-1:-1:-1;;;20351:68:0;;13037:2:1;20351:68:0;;;13019:21:1;13076:2;13056:18;;;13049:30;13115:34;13095:18;;;13088:62;-1:-1:-1;;;13166:18:1;;;13159:34;13210:19;;20351:68:0;13009:226:1;20351:68:0;-1:-1:-1;;;;;20438:21:0;;20430:68;;;;-1:-1:-1;;;20430:68:0;;8521:2:1;20430:68:0;;;8503:21:1;8560:2;8540:18;;;8533:30;8599:34;8579:18;;;8572:62;-1:-1:-1;;;8650:18:1;;;8643:32;8692:19;;20430:68:0;8493:224:1;20430:68:0;-1:-1:-1;;;;;20511:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20563:32;;14858:25:1;;;20563:32:0;;14831:18:1;20563:32:0;;;;;;;20223:380;;;:::o;20890:453::-;-1:-1:-1;;;;;14004:18:0;;;21025:24;14004:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;21092:37:0;;21088:248;;21174:6;21154:16;:26;;21146:68;;;;-1:-1:-1;;;21146:68:0;;8924:2:1;21146:68:0;;;8906:21:1;8963:2;8943:18;;;8936:30;9002:31;8982:18;;;8975:59;9051:18;;21146:68:0;8896:179:1;21146:68:0;21258:51;21267:5;21274:7;21302:6;21283:16;:25;21258:8;:51::i;:::-;20890:453;;;;:::o;17504:671::-;-1:-1:-1;;;;;17635:18:0;;17627:68;;;;-1:-1:-1;;;17627:68:0;;12631:2:1;17627:68:0;;;12613:21:1;12670:2;12650:18;;;12643:30;12709:34;12689:18;;;12682:62;-1:-1:-1;;;12760:18:1;;;12753:35;12805:19;;17627:68:0;12603:227:1;17627:68:0;-1:-1:-1;;;;;17714:16:0;;17706:64;;;;-1:-1:-1;;;17706:64:0;;7307:2:1;17706:64:0;;;7289:21:1;7346:2;7326:18;;;7319:30;7385:34;7365:18;;;7358:62;-1:-1:-1;;;7436:18:1;;;7429:33;7479:19;;17706:64:0;7279:225:1;17706:64:0;-1:-1:-1;;;;;17856:15:0;;17834:19;17856:15;;;;;;;;;;;17890:21;;;;17882:72;;;;-1:-1:-1;;;17882:72:0;;9983:2:1;17882:72:0;;;9965:21:1;10022:2;10002:18;;;9995:30;10061:34;10041:18;;;10034:62;-1:-1:-1;;;10112:18:1;;;10105:36;10158:19;;17882:72:0;9955:228:1;17882:72:0;-1:-1:-1;;;;;17990:15:0;;;:9;:15;;;;;;;;;;;18008:20;;;17990:38;;18050:13;;;;;;;;:23;;18022:6;;17990:9;18050:23;;18022:6;;18050:23;:::i;:::-;;;;;;;;18106:2;-1:-1:-1;;;;;18091:26:0;18100:4;-1:-1:-1;;;;;18091:26:0;;18110:6;18091:26;;;;14858:25:1;;14846:2;14831:18;;14813:76;18091:26:0;;;;;;;;18130:37;34435:324;6050:191;6143:6;;;-1:-1:-1;;;;;6160:17:0;;;-1:-1:-1;;;;;;6160:17:0;;;;;;;6193:40;;6143:6;;;6160:17;6143:6;;6193:40;;6124:16;;6193:40;6050:191;;:::o;18462:399::-;-1:-1:-1;;;;;18546:21:0;;18538:65;;;;-1:-1:-1;;;18538:65:0;;14554:2:1;18538:65:0;;;14536:21:1;14593:2;14573:18;;;14566:30;14632:33;14612:18;;;14605:61;14683:18;;18538:65:0;14526:181:1;18538:65:0;18694:6;18678:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18711:18:0;;:9;:18;;;;;;;;;;:28;;18733:6;;18711:9;:28;;18733:6;;18711:28;:::i;:::-;;;;-1:-1:-1;;18755:37:0;;14858:25:1;;;-1:-1:-1;;;;;18755:37:0;;;18772:1;;18755:37;;14846:2:1;14831:18;18755:37:0;;;;;;;18805:48;34435:324;19194:591;-1:-1:-1;;;;;19278:21:0;;19270:67;;;;-1:-1:-1;;;19270:67:0;;12229:2:1;19270:67:0;;;12211:21:1;12268:2;12248:18;;;12241:30;12307:34;12287:18;;;12280:62;-1:-1:-1;;;12358:18:1;;;12351:31;12399:19;;19270:67:0;12201:223:1;19270:67:0;-1:-1:-1;;;;;19437:18:0;;19412:22;19437:18;;;;;;;;;;;19474:24;;;;19466:71;;;;-1:-1:-1;;;19466:71:0;;7711:2:1;19466:71:0;;;7693:21:1;7750:2;7730:18;;;7723:30;7789:34;7769:18;;;7762:62;-1:-1:-1;;;7840:18:1;;;7833:32;7882:19;;19466:71:0;7683:224:1;19466:71:0;-1:-1:-1;;;;;19573:18:0;;:9;:18;;;;;;;;;;19594:23;;;19573:44;;19639:12;:22;;19611:6;;19573:9;19639:22;;19611:6;;19639:22;:::i;:::-;;;;-1:-1:-1;;19679:37:0;;14858:25:1;;;19705:1:0;;-1:-1:-1;;;;;19679:37:0;;;;;14846:2:1;14831:18;19679:37:0;;;;;;;19729:48;34435:324;14:694:1;;121:3;114:4;106:6;102:17;98:27;88:2;;143:5;136;129:20;88:2;183:6;170:20;209:4;233:60;249:43;289:2;249:43;:::i;:::-;233:60;:::i;:::-;327:15;;;358:12;;;;390:15;;;436:11;;;424:24;;420:33;;417:42;-1:-1:-1;414:2:1;;;476:5;469;462:20;414:2;502:5;516:163;530:2;527:1;524:9;516:163;;;587:17;;575:30;;625:12;;;;657;;;;548:1;541:9;516:163;;;-1:-1:-1;697:5:1;;78:630;-1:-1:-1;;;;;;;78:630:1:o;713:257::-;;825:2;813:9;804:7;800:23;796:32;793:2;;;846:6;838;831:22;793:2;890:9;877:23;909:31;934:5;909:31;:::i;:::-;959:5;783:187;-1:-1:-1;;;783:187:1:o;975:398::-;;;1104:2;1092:9;1083:7;1079:23;1075:32;1072:2;;;1125:6;1117;1110:22;1072:2;1169:9;1156:23;1188:31;1213:5;1188:31;:::i;:::-;1238:5;-1:-1:-1;1295:2:1;1280:18;;1267:32;1308:33;1267:32;1308:33;:::i;:::-;1360:7;1350:17;;;1062:311;;;;;:::o;1378:466::-;;;;1524:2;1512:9;1503:7;1499:23;1495:32;1492:2;;;1545:6;1537;1530:22;1492:2;1589:9;1576:23;1608:31;1633:5;1608:31;:::i;:::-;1658:5;-1:-1:-1;1715:2:1;1700:18;;1687:32;1728:33;1687:32;1728:33;:::i;:::-;1482:362;;1780:7;;-1:-1:-1;;;1834:2:1;1819:18;;;;1806:32;;1482:362::o;1849:325::-;;;1978:2;1966:9;1957:7;1953:23;1949:32;1946:2;;;1999:6;1991;1984:22;1946:2;2043:9;2030:23;2062:31;2087:5;2062:31;:::i;:::-;2112:5;2164:2;2149:18;;;;2136:32;;-1:-1:-1;;;1936:238:1:o;2179:494::-;;;;2333:2;2321:9;2312:7;2308:23;2304:32;2301:2;;;2354:6;2346;2339:22;2301:2;2391:9;2385:16;2410:31;2435:5;2410:31;:::i;:::-;2505:2;2490:18;;2484:25;2554:2;2539:18;;2533:25;2460:5;;-1:-1:-1;2484:25:1;-1:-1:-1;2596:15:1;;2589:23;2577:36;;2567:2;;2632:6;2624;2617:22;2567:2;2660:7;2650:17;;;2291:382;;;;;:::o;2678:1282::-;;;2857:2;2845:9;2836:7;2832:23;2828:32;2825:2;;;2878:6;2870;2863:22;2825:2;2923:9;2910:23;2952:18;2993:2;2985:6;2982:14;2979:2;;;3014:6;3006;2999:22;2979:2;3057:6;3046:9;3042:22;3032:32;;3102:7;3095:4;3091:2;3087:13;3083:27;3073:2;;3129:6;3121;3114:22;3073:2;3170;3157:16;3192:4;3216:60;3232:43;3272:2;3232:43;:::i;3216:60::-;3310:15;;;3341:12;;;;3373:11;;;3411;;;3403:20;;3399:29;;3396:42;-1:-1:-1;3393:2:1;;;3456:6;3448;3441:22;3393:2;3483:6;3474:15;;3498:238;3512:2;3509:1;3506:9;3498:238;;;3583:3;3570:17;3600:31;3625:5;3600:31;:::i;:::-;3644:18;;3530:1;3523:9;;;;;3682:12;;;;3714;;3498:238;;;-1:-1:-1;3755:5:1;-1:-1:-1;;3798:18:1;;3785:32;;-1:-1:-1;;3829:16:1;;;3826:2;;;3863:6;3855;3848:22;3826:2;;3891:63;3946:7;3935:8;3924:9;3920:24;3891:63;:::i;:::-;3881:73;;;2815:1145;;;;;:::o;3965:938::-;;4091:2;4134;4122:9;4113:7;4109:23;4105:32;4102:2;;;4155:6;4147;4140:22;4102:2;4193:9;4187:16;4226:18;4218:6;4215:30;4212:2;;;4263:6;4255;4248:22;4212:2;4291:22;;4344:4;4336:13;;4332:27;-1:-1:-1;4322:2:1;;4378:6;4370;4363:22;4322:2;4412;4406:9;4435:60;4451:43;4491:2;4451:43;:::i;4435:60::-;4529:15;;;4560:12;;;;4592:11;;;4630;;;4622:20;;4618:29;;4615:42;-1:-1:-1;4612:2:1;;;4675:6;4667;4660:22;4612:2;4702:6;4693:15;;4717:156;4731:2;4728:1;4725:9;4717:156;;;4788:10;;4776:23;;4749:1;4742:9;;;;;4819:12;;;;4851;;4717:156;;;-1:-1:-1;4892:5:1;4071:832;-1:-1:-1;;;;;;;4071:832:1:o;4908:190::-;;5020:2;5008:9;4999:7;4995:23;4991:32;4988:2;;;5041:6;5033;5026:22;4988:2;-1:-1:-1;5069:23:1;;4978:120;-1:-1:-1;4978:120:1:o;5103:258::-;;;5232:2;5220:9;5211:7;5207:23;5203:32;5200:2;;;5253:6;5245;5238:22;5200:2;-1:-1:-1;;5281:23:1;;;5351:2;5336:18;;;5323:32;;-1:-1:-1;5190:171:1:o;6497:603::-;;6638:2;6667;6656:9;6649:21;6699:6;6693:13;6742:6;6737:2;6726:9;6722:18;6715:34;6767:4;6780:140;6794:6;6791:1;6788:13;6780:140;;;6889:14;;;6885:23;;6879:30;6855:17;;;6874:2;6851:26;6844:66;6809:10;;6780:140;;;6938:6;6935:1;6932:13;6929:2;;;7008:4;7003:2;6994:6;6983:9;6979:22;6975:31;6968:45;6929:2;-1:-1:-1;7084:2:1;7063:15;-1:-1:-1;;7059:29:1;7044:45;;;;7091:2;7040:54;;6618:482;-1:-1:-1;;;6618:482:1:o;11666:356::-;11868:2;11850:21;;;11887:18;;;11880:30;11946:34;11941:2;11926:18;;11919:62;12013:2;11998:18;;11840:182::o;14894:778::-;;15140:2;15129:9;15125:18;15170:6;15159:9;15152:25;15196:2;15234;15229;15218:9;15214:18;15207:30;15257:6;15292;15286:13;15323:6;15315;15308:22;15361:3;15350:9;15346:19;15339:26;;15400:2;15392:6;15388:15;15374:29;;15421:4;15434:169;15448:6;15445:1;15442:13;15434:169;;;15509:13;;15497:26;;15578:15;;;;15543:12;;;;15470:1;15463:9;15434:169;;;15438:3;;15620;15612:11;;;;;15659:6;15654:2;15643:9;15639:18;15632:34;15101:571;;;;;;:::o;15866:275::-;15937:2;15931:9;16002:2;15983:13;;-1:-1:-1;;15979:27:1;15967:40;;16037:18;16022:34;;16058:22;;;16019:62;16016:2;;;16084:18;;:::i;:::-;16120:2;16113:22;15911:230;;-1:-1:-1;15911:230:1:o;16146:186::-;;16239:18;16231:6;16228:30;16225:2;;;16261:18;;:::i;:::-;-1:-1:-1;16321:4:1;16302:17;;;16298:28;;16215:117::o;16337:128::-;;16408:1;16404:6;16401:1;16398:13;16395:2;;;16414:18;;:::i;:::-;-1:-1:-1;16450:9:1;;16385:80::o;16470:168::-;;16576:1;16572;16568:6;16564:14;16561:1;16558:21;16553:1;16546:9;16539:17;16535:45;16532:2;;;16583:18;;:::i;:::-;-1:-1:-1;16623:9:1;;16522:116::o;16643:125::-;;16711:1;16708;16705:8;16702:2;;;16716:18;;:::i;:::-;-1:-1:-1;16753:9:1;;16692:76::o;16773:380::-;16858:1;16848:12;;16905:1;16895:12;;;16916:2;;16970:4;16962:6;16958:17;16948:27;;16916:2;17023;17015:6;17012:14;16992:18;16989:38;16986:2;;;17069:10;17064:3;17060:20;17057:1;17050:31;17104:4;17101:1;17094:15;17132:4;17129:1;17122:15;16986:2;;16828:325;;;:::o;17158:135::-;;-1:-1:-1;;17218:17:1;;17215:2;;;17238:18;;:::i;:::-;-1:-1:-1;17285:1:1;17274:13;;17205:88::o;17298:127::-;17359:10;17354:3;17350:20;17347:1;17340:31;17390:4;17387:1;17380:15;17414:4;17411:1;17404:15;17430:127;17491:10;17486:3;17482:20;17479:1;17472:31;17522:4;17519:1;17512:15;17546:4;17543:1;17536:15;17562:131;-1:-1:-1;;;;;17637:31:1;;17627:42;;17617:2;;17683:1;17680;17673:12
Swarm Source
ipfs://16030a0e41ab25b32ca68b6abb5a4df136dea603c9b6b7237496eb7f9a73b39d
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.