Source Code
Latest 6 from a total of 6 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Reward ... | 45328293 | 147 days ago | IN | 0 S | 0.00215755 | ||||
| Unstake Farm | 45328206 | 147 days ago | IN | 0 S | 0.00697071 | ||||
| Deposit Reward T... | 45327732 | 147 days ago | IN | 0 S | 0.0032725 | ||||
| Stake Booster | 45327446 | 147 days ago | IN | 0 S | 0.00581361 | ||||
| Stake Farm | 45327180 | 147 days ago | IN | 0 S | 0.00760251 | ||||
| Register Me | 45327078 | 147 days ago | IN | 0 S | 0.00419675 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FarmNFTStaking
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/**
*Submitted for verification at SonicScan.org on 2025-09-01
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
/**
* @dev Required interface of an ERC-721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC-721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.20;
/**
* @title ERC-721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC-721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol)
pragma solidity ^0.8.20;
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or
* {IERC721-setApprovalForAll}.
*/
abstract contract ERC721Holder is IERC721Receiver {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) {
return this.onERC721Received.selector;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling 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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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: contracts/ISF/IRewardRateProxy.sol
pragma solidity 0.8.20;
interface IRewardRateProxy {
function getIntegratedMultiplier(uint256 fromTimestamp) external view returns (uint256);
}
// File: contracts/ISF/FarmhouseStakingR2.sol
pragma solidity 0.8.20;
contract FarmNFTStaking is ERC721Holder, Ownable {
// Interfaces for NFT collections (ERC-721)
IERC721 public immutable farmNFT;
IERC721 public immutable farmerNFT;
IERC721 public immutable tractorNFT;
IERC721 public immutable toolNFT;
IERC20 public immutable rewardToken;
IRewardRateProxy public immutable rewardProxy;
// Reward parameters (in tokens per day, 18 decimals)
uint256 public constant BASE_REWARD_PER_DAY = 0.8 * 10**18;
uint256 public constant FARMER_BOOST = 0.6 * 10**18;
uint256 public constant TRACTOR_BOOST = 0.3 * 10**18;
uint256 public constant TOOL_BOOST = 0.1 * 10**18;
uint256 public constant SECONDS_PER_DAY = 86400;
// Staking limits per Farm NFT
uint256 public constant MAX_FARMERS = 1;
uint256 public constant MAX_TRACTORS = 2;
uint256 public constant MAX_TOOLS = 10;
// Struct to track staked Farm NFT and its boosters
struct FarmStake {
uint256 farmTokenId;
uint256[] farmerTokenIds;
uint256[] tractorTokenIds;
uint256[] toolTokenIds;
uint256 lastClaimTimestamp;
uint256 accumulatedRewards;
}
// Struct for getStakes return values (lighter version)
struct StakeInfo {
uint256 farmTokenId;
uint256[] farmerTokenIds;
uint256[] tractorTokenIds;
uint256[] toolTokenIds;
}
// Mappings
mapping(address => mapping(uint256 => FarmStake)) public stakes;
mapping(uint256 => address) public farmStakedBy;
mapping(address => uint256[]) private userStakedFarmIds;
// Events
event FarmStaked(address indexed user, uint256 farmTokenId);
event FarmUnstaked(address indexed user, uint256 farmTokenId);
event BoosterStaked(address indexed user, uint256 farmTokenId, string boosterType, uint256 tokenId);
event BoosterUnstaked(address indexed user, uint256 farmTokenId, string boosterType, uint256 tokenId);
event RewardsClaimed(address indexed user, uint256 farmTokenId, uint256 amount);
event RewardTokensWithdrawn(address indexed owner, uint256 amount);
constructor(
address _farmNFT,
address _farmerNFT,
address _tractorNFT,
address _toolNFT,
address _rewardToken,
address _rewardProxy
) Ownable(msg.sender) {
farmNFT = IERC721(_farmNFT);
farmerNFT = IERC721(_farmerNFT);
tractorNFT = IERC721(_tractorNFT);
toolNFT = IERC721(_toolNFT);
rewardToken = IERC20(_rewardToken);
rewardProxy = IRewardRateProxy(_rewardProxy);
}
// Explicit getter for stakes with simplified struct
function getStakes(address user, uint256 farmTokenId) external view returns (StakeInfo memory) {
FarmStake memory stake = stakes[user][farmTokenId];
return StakeInfo({
farmTokenId: stake.farmTokenId,
farmerTokenIds: stake.farmerTokenIds,
tractorTokenIds: stake.tractorTokenIds,
toolTokenIds: stake.toolTokenIds
});
}
// Get all staked Farm NFT IDs for a user
function getUserStakedFarmIds(address user) external view returns (uint256[] memory) {
return userStakedFarmIds[user];
}
// Stake a Farm NFT
function stakeFarm(uint256 farmTokenId) external {
require(farmStakedBy[farmTokenId] == address(0), "Farm already staked");
require(farmNFT.ownerOf(farmTokenId) == msg.sender, "Not Farm NFT owner");
farmNFT.safeTransferFrom(msg.sender, address(this), farmTokenId);
stakes[msg.sender][farmTokenId] = FarmStake({
farmTokenId: farmTokenId,
farmerTokenIds: new uint256[](0),
tractorTokenIds: new uint256[](0),
toolTokenIds: new uint256[](0),
lastClaimTimestamp: block.timestamp,
accumulatedRewards: 0
});
farmStakedBy[farmTokenId] = msg.sender;
userStakedFarmIds[msg.sender].push(farmTokenId);
emit FarmStaked(msg.sender, farmTokenId);
}
// Stake a booster NFT (Farmer, Tractor, or Tool)
function stakeBooster(uint256 farmTokenId, string memory boosterType, uint256 tokenId) external {
require(farmStakedBy[farmTokenId] == msg.sender, "Farm not staked by you");
FarmStake storage stake = stakes[msg.sender][farmTokenId];
if (keccak256(abi.encodePacked(boosterType)) == keccak256(abi.encodePacked("Farmer"))) {
require(stake.farmerTokenIds.length < MAX_FARMERS, "Max Farmers reached");
require(farmerNFT.ownerOf(tokenId) == msg.sender, "Not Farmer NFT owner");
farmerNFT.safeTransferFrom(msg.sender, address(this), tokenId);
stake.farmerTokenIds.push(tokenId);
} else if (keccak256(abi.encodePacked(boosterType)) == keccak256(abi.encodePacked("Tractor"))) {
require(stake.tractorTokenIds.length < MAX_TRACTORS, "Max Tractors reached");
require(tractorNFT.ownerOf(tokenId) == msg.sender, "Not Tractor NFT owner");
tractorNFT.safeTransferFrom(msg.sender, address(this), tokenId);
stake.tractorTokenIds.push(tokenId);
} else if (keccak256(abi.encodePacked(boosterType)) == keccak256(abi.encodePacked("Tool"))) {
require(stake.toolTokenIds.length < MAX_TOOLS, "Max Tools reached");
require(toolNFT.ownerOf(tokenId) == msg.sender, "Not Tool NFT owner");
toolNFT.safeTransferFrom(msg.sender, address(this), tokenId);
stake.toolTokenIds.push(tokenId);
} else {
revert("Invalid booster type");
}
emit BoosterStaked(msg.sender, farmTokenId, boosterType, tokenId);
}
// Unstake a Farm NFT and all associated boosters
function unstakeFarm(uint256 farmTokenId) external {
require(farmStakedBy[farmTokenId] == msg.sender, "Farm not staked by you");
FarmStake storage stake = stakes[msg.sender][farmTokenId];
claimRewards(farmTokenId);
farmNFT.safeTransferFrom(address(this), msg.sender, farmTokenId);
for (uint256 i = 0; i < stake.farmerTokenIds.length; i++) {
farmerNFT.safeTransferFrom(address(this), msg.sender, stake.farmerTokenIds[i]);
emit BoosterUnstaked(msg.sender, farmTokenId, "Farmer", stake.farmerTokenIds[i]);
}
for (uint256 i = 0; i < stake.tractorTokenIds.length; i++) {
tractorNFT.safeTransferFrom(address(this), msg.sender, stake.tractorTokenIds[i]);
emit BoosterUnstaked(msg.sender, farmTokenId, "Tractor", stake.tractorTokenIds[i]);
}
for (uint256 i = 0; i < stake.toolTokenIds.length; i++) {
toolNFT.safeTransferFrom(address(this), msg.sender, stake.toolTokenIds[i]);
emit BoosterUnstaked(msg.sender, farmTokenId, "Tool", stake.toolTokenIds[i]);
}
delete stakes[msg.sender][farmTokenId];
delete farmStakedBy[farmTokenId];
removeUserStakedFarmId(msg.sender, farmTokenId);
emit FarmUnstaked(msg.sender, farmTokenId);
}
// Unstake a specific booster NFT
function unstakeBooster(uint256 farmTokenId, string memory boosterType, uint256 tokenId) external {
require(farmStakedBy[farmTokenId] == msg.sender, "Farm not staked by you");
FarmStake storage stake = stakes[msg.sender][farmTokenId];
if (keccak256(abi.encodePacked(boosterType)) == keccak256(abi.encodePacked("Farmer"))) {
stake.farmerTokenIds = removeTokenId(stake.farmerTokenIds, tokenId);
farmerNFT.safeTransferFrom(address(this), msg.sender, tokenId);
} else if (keccak256(abi.encodePacked(boosterType)) == keccak256(abi.encodePacked("Tractor"))) {
stake.tractorTokenIds = removeTokenId(stake.tractorTokenIds, tokenId);
tractorNFT.safeTransferFrom(address(this), msg.sender, tokenId);
} else if (keccak256(abi.encodePacked(boosterType)) == keccak256(abi.encodePacked("Tool"))) {
stake.toolTokenIds = removeTokenId(stake.toolTokenIds, tokenId);
toolNFT.safeTransferFrom(address(this), msg.sender, tokenId);
} else {
revert("Invalid booster type");
}
emit BoosterUnstaked(msg.sender, farmTokenId, boosterType, tokenId);
}
// Calculate pending rewards for a staked farm (instantaneous, per-second)
function calculatePendingRewards(address user, uint256 farmTokenId) public view returns (uint256) {
FarmStake memory stake = stakes[user][farmTokenId];
require(stake.farmTokenId == farmTokenId, "Farm not staked");
uint256 integrated = rewardProxy.getIntegratedMultiplier(stake.lastClaimTimestamp);
uint256 dailyReward = calculateDailyReward(farmTokenId);
uint256 rewards = stake.accumulatedRewards + (dailyReward * integrated) / (10**18 * SECONDS_PER_DAY);
return rewards;
}
// Claim accumulated rewards for a single farm
function claimRewards(uint256 farmTokenId) public {
require(farmStakedBy[farmTokenId] == msg.sender, "Farm not staked by you");
FarmStake storage stake = stakes[msg.sender][farmTokenId];
uint256 rewards = calculatePendingRewards(msg.sender, farmTokenId);
if (rewards > 0) {
require(rewardToken.balanceOf(address(this)) >= rewards, "Insufficient reward tokens");
stake.accumulatedRewards = 0;
stake.lastClaimTimestamp = block.timestamp;
rewardToken.transfer(msg.sender, rewards);
emit RewardsClaimed(msg.sender, farmTokenId, rewards);
} else {
stake.lastClaimTimestamp = block.timestamp; // Still update timestamp to prevent issues
}
}
// Claim accumulated rewards for all staked farms
function claimAll() external {
uint256[] memory farmIds = userStakedFarmIds[msg.sender];
require(farmIds.length > 0, "No farms staked");
uint256 totalRewards = 0;
for (uint256 i = 0; i < farmIds.length; i++) {
uint256 farmTokenId = farmIds[i];
if (farmStakedBy[farmTokenId] == msg.sender) {
uint256 rewards = calculatePendingRewards(msg.sender, farmTokenId);
if (rewards > 0) {
totalRewards += rewards;
FarmStake storage stake = stakes[msg.sender][farmTokenId];
stake.accumulatedRewards = 0;
stake.lastClaimTimestamp = block.timestamp;
emit RewardsClaimed(msg.sender, farmTokenId, rewards);
} else {
stakes[msg.sender][farmTokenId].lastClaimTimestamp = block.timestamp;
}
}
}
if (totalRewards > 0) {
require(rewardToken.balanceOf(address(this)) >= totalRewards, "Insufficient reward tokens");
rewardToken.transfer(msg.sender, totalRewards);
}
}
// Calculate daily reward for a farm based on staked boosters
function calculateDailyReward(uint256 farmTokenId) public view returns (uint256) {
address user = farmStakedBy[farmTokenId];
require(user != address(0), "Farm not staked");
FarmStake memory stake = stakes[user][farmTokenId];
uint256 reward = BASE_REWARD_PER_DAY;
reward += stake.farmerTokenIds.length * FARMER_BOOST;
reward += stake.tractorTokenIds.length * TRACTOR_BOOST;
reward += stake.toolTokenIds.length * TOOL_BOOST;
return reward;
}
// Helper function to remove token ID from array
function removeTokenId(uint256[] storage array, uint256 tokenId) internal returns (uint256[] memory) {
uint256 length = array.length;
for (uint256 i = 0; i < length; i++) {
if (array[i] == tokenId) {
if (i < length - 1) {
array[i] = array[length - 1];
}
array.pop();
break;
}
}
return array;
}
// Helper function to remove staked Farm ID from userStakedFarmIds
function removeUserStakedFarmId(address user, uint256 farmTokenId) internal {
uint256[] storage farmIds = userStakedFarmIds[user];
for (uint256 i = 0; i < farmIds.length; i++) {
if (farmIds[i] == farmTokenId) {
if (i < farmIds.length - 1) {
farmIds[i] = farmIds[farmIds.length - 1];
}
farmIds.pop();
break;
}
}
}
// Admin function to deposit reward tokens
function depositRewardTokens(uint256 amount) external onlyOwner {
require(rewardToken.transferFrom(msg.sender, address(this), amount), "Token transfer failed");
}
// Admin function to withdraw unused reward tokens
function withdrawRewardTokens(uint256 amount) external onlyOwner {
require(amount > 0, "Amount must be greater than 0");
require(rewardToken.balanceOf(address(this)) >= amount, "Insufficient reward tokens");
rewardToken.transfer(msg.sender, amount);
emit RewardTokensWithdrawn(msg.sender, amount);
}
// View function to check pending rewards
function pendingRewards(address user, uint256 farmTokenId) external view returns (uint256) {
return calculatePendingRewards(user, farmTokenId);
}
// Register contract on Sonic FeeM
function registerMe() external {
(bool _success,) = address(0xDC2B0D2Dd2b7759D97D50db4eabDC36973110830).call(
abi.encodeWithSignature("selfRegister(uint256)", 217)
);
require(_success, "FeeM registration failed");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_farmNFT","type":"address"},{"internalType":"address","name":"_farmerNFT","type":"address"},{"internalType":"address","name":"_tractorNFT","type":"address"},{"internalType":"address","name":"_toolNFT","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_rewardProxy","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"boosterType","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BoosterStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"boosterType","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BoosterUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"FarmStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"FarmUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"inputs":[],"name":"BASE_REWARD_PER_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FARMER_BOOST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FARMERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOOLS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRACTORS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOOL_BOOST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACTOR_BOOST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"calculateDailyReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"calculatePendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"farmStakedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmerNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"getStakes","outputs":[{"components":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"internalType":"uint256[]","name":"farmerTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"tractorTokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"toolTokenIds","type":"uint256[]"}],"internalType":"struct FarmNFTStaking.StakeInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakedFarmIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registerMe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardProxy","outputs":[{"internalType":"contract IRewardRateProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"internalType":"string","name":"boosterType","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"stakeFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"internalType":"uint256","name":"lastClaimTimestamp","type":"uint256"},{"internalType":"uint256","name":"accumulatedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toolNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tractorNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"},{"internalType":"string","name":"boosterType","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"farmTokenId","type":"uint256"}],"name":"unstakeFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
61014060405234801562000011575f80fd5b506040516200313338038062003133833981016040819052620000349162000101565b33806200005a57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000658162000096565b506001600160a01b0395861660805293851660a05291841660c052831660e05282166101005216610120526200017e565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000fc575f80fd5b919050565b5f805f805f8060c0878903121562000117575f80fd5b6200012287620000e5565b95506200013260208801620000e5565b94506200014260408801620000e5565b93506200015260608801620000e5565b92506200016260808801620000e5565b91506200017260a08801620000e5565b90509295509295509295565b60805160a05160c05160e0516101005161012051612ecc620002675f395f81816102900152611dc801525f8181610540015281816105e3015281816106a001528181610f7801528181612050015281816120fb0152818161257e015261262901525f81816103ea01528181610aa20152818161156c015281816116370152611bbc01525f818161044b015281816109720152818161135d0152818161142b0152611af301525f8181610506015281816108430152818161114b0152818161121801526119f501525f81816104df015281816107cd01528181610ceb0152610db60152612ecc5ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c8063789ac4a411610114578063cb43b2dd116100a9578063d1058e5911610079578063d1058e59146104d2578063da802f80146104da578063e456db3514610501578063f2fde38b14610528578063f7c618c11461053b575f80fd5b8063cb43b2dd14610495578063cc78c4f4146104a8578063d0deef99146104b7578063d0f143f0146104ca575f80fd5b80639a198d61116100e45780639a198d611461043e578063b46f0f7114610446578063b97692fc1461046d578063c5dbe54614610475575f80fd5b8063789ac4a4146103e55780637c7fae861461040c5780637fc7984d1461041b5780638da5cb5b1461042e575f80fd5b80633d4b7c3f11610195578063584b62a111610165578063584b62a1146103595780636099ecb2146103ad578063715018a6146103c057806373b4227e146103c857806374f0314f146103db575f80fd5b80633d4b7c3f146103085780634035379a14610317578063446b58831461032a5780634cb8a68b14610339575f80fd5b806316c621e0116101d057806316c621e01461027857806319128fa81461028b5780631b39aebc146102ca57806326a0a5ae146102f2575f80fd5b80630962ef79146102015780630c32551e1461021657806313f78d2f14610229578063150b7a021461023c575b5f80fd5b61021461020f3660046129be565b610562565b005b6102146102243660046129be565b61075f565b6102146102373660046129be565b610c71565b61025a61024a366004612a70565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020015b60405180910390f35b6102146102863660046129be565b610f59565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026f565b6102b26102d83660046129be565b60026020525f90815260409020546001600160a01b031681565b6102fa600a81565b60405190815260200161026f565b6102fa67016345785d8a000081565b610214610325366004612aeb565b611038565b6102fa670429d069189e000081565b61034c610347366004612b4a565b611745565b60405161026f9190612bad565b610392610367366004612b4a565b600160209081525f928352604080842090915290825290208054600482015460059092015490919083565b6040805193845260208401929092529082015260600161026f565b6102fa6103bb366004612b4a565b6118eb565b6102146118fd565b6102146103d6366004612aeb565b611910565b6102fa6201518081565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b6102fa670b1a2bc2ec50000081565b6102fa610429366004612b4a565b611c1f565b5f546001600160a01b03166102b2565b610214611e90565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b6102fa600281565b610488610483366004612c0e565b611f79565b60405161026f9190612c29565b6102146104a33660046129be565b611fe2565b6102fa670853a0d2313c000081565b6102fa6104c53660046129be565b6121a0565b6102fa600181565b6102146123ba565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b610214610536366004612c0e565b61269f565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b5f818152600260205260409020546001600160a01b031633146105a05760405162461bcd60e51b815260040161059790612c6c565b60405180910390fd5b335f8181526001602090815260408083208584529091528120916105c49084611c1f565b90508015610753576040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610630573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106549190612c9c565b10156106725760405162461bcd60e51b815260040161059790612cb3565b5f60058301554260048084019190915560405163a9059cbb60e01b81523391810191909152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156106ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107129190612cea565b50604080518481526020810183905233917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a2505050565b4260048301555b505050565b5f818152600260205260409020546001600160a01b031633146107945760405162461bcd60e51b815260040161059790612c6c565b335f90815260016020908152604080832084845290915290206107b682610562565b604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e9061080690309033908790600401612d09565b5f604051808303815f87803b15801561081d575f80fd5b505af115801561082f573d5f803e3d5ffd5b505050505f5b6001820154811015610961577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e303385600101858154811061088757610887612d2d565b905f5260205f2001546040518463ffffffff1660e01b81526004016108ae93929190612d09565b5f604051808303815f87803b1580156108c5575f80fd5b505af11580156108d7573d5f803e3d5ffd5b50505050336001600160a01b03165f80516020612e778339815191528484600101848154811061090957610909612d2d565b905f5260205f200154604051610947929190918252606060208301819052600690830152652330b936b2b960d11b6080830152604082015260a00190565b60405180910390a28061095981612d55565b915050610835565b505f5b6002820154811015610a91577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e30338560020185815481106109b6576109b6612d2d565b905f5260205f2001546040518463ffffffff1660e01b81526004016109dd93929190612d09565b5f604051808303815f87803b1580156109f4575f80fd5b505af1158015610a06573d5f803e3d5ffd5b50505050336001600160a01b03165f80516020612e7783398151915284846002018481548110610a3857610a38612d2d565b905f5260205f200154604051610a77929190918252606060208301819052600790830152662a3930b1ba37b960c91b6080830152604082015260a00190565b60405180910390a280610a8981612d55565b915050610964565b505f5b6003820154811015610bbe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e3033856003018581548110610ae657610ae6612d2d565b905f5260205f2001546040518463ffffffff1660e01b8152600401610b0d93929190612d09565b5f604051808303815f87803b158015610b24575f80fd5b505af1158015610b36573d5f803e3d5ffd5b50505050336001600160a01b03165f80516020612e7783398151915284846003018481548110610b6857610b68612d2d565b905f5260205f200154604051610ba492919091825260606020830181905260049083015263151bdbdb60e21b6080830152604082015260a00190565b60405180910390a280610bb681612d55565b915050610a94565b50335f90815260016020818152604080842086855290915282208281559190610be990830182612946565b610bf6600283015f612946565b610c03600383015f612946565b505f60048201819055600590910181905582815260026020526040902080546001600160a01b0319169055610c3833836126d9565b60405182815233907f7ea22bee5d003fa7693007c7a26f1f1c8762d95b79fc7aca1e9cdf62b17776dc9060200160405180910390a25050565b5f818152600260205260409020546001600160a01b031615610ccb5760405162461bcd60e51b815260206004820152601360248201527211985c9b48185b1c9958591e481cdd185ad959606a1b6044820152606401610597565b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610d30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d549190612d6d565b6001600160a01b031614610d9f5760405162461bcd60e51b81526020600482015260126024820152712737ba102330b9369027232a1037bbb732b960711b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90610def90339030908690600401612d09565b5f604051808303815f87803b158015610e06575f80fd5b505af1158015610e18573d5f803e3d5ffd5b50506040805160c08101825284815281515f80825260208083018552808401928352845182815280820186528486015284518281528082018652606085015242608085015260a0840182905233825260018082528583208984528252949091208351815591518051939650919450610e9593850192910190612961565b5060408201518051610eb1916002840191602090910190612961565b5060608201518051610ecd916003840191602090910190612961565b506080820151600482015560a0909101516005909101555f81815260026020908152604080832080546001600160a01b0319163390811790915580845260038352818420805460018101825590855293839020909301849055518381527f1a1f70346f063ea62b243f69bc92b7f0de54be854eec5aa105d4e8acedc84d6b91015b60405180910390a250565b610f616127b8565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90610fb190339030908690600401612d09565b6020604051808303815f875af1158015610fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff19190612cea565b6110355760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610597565b50565b5f838152600260205260409020546001600160a01b0316331461106d5760405162461bcd60e51b815260040161059790612c6c565b335f90815260016020908152604080832086845282529182902091516110a09101652330b936b2b960d11b815260060190565b60405160208183030381529060405280519060200120836040516020016110c79190612daa565b604051602081830303815290604052805190602001200361129b576001818101541061112b5760405162461bcd60e51b815260206004820152601360248201527213585e0811985c9b595c9cc81c995858da1959606a1b6044820152606401610597565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015611190573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b49190612d6d565b6001600160a01b0316146112015760405162461bcd60e51b81526020600482015260146024820152732737ba102330b936b2b91027232a1037bbb732b960611b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e9061125190339030908790600401612d09565b5f604051808303815f87803b158015611268575f80fd5b505af115801561127a573d5f803e3d5ffd5b5050506001808301805491820181555f9081526020902001839055506116fa565b604051662a3930b1ba37b960c91b602082015260270160405160208183030381529060405280519060200120836040516020016112d89190612daa565b60405160208183030381529060405280519060200120036114af576002818101541061133d5760405162461bcd60e51b815260206004820152601460248201527313585e08151c9858dd1bdc9cc81c995858da195960621b6044820152606401610597565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156113a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c69190612d6d565b6001600160a01b0316146114145760405162461bcd60e51b81526020600482015260156024820152742737ba102a3930b1ba37b91027232a1037bbb732b960591b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e9061146490339030908790600401612d09565b5f604051808303815f87803b15801561147b575f80fd5b505af115801561148d573d5f803e3d5ffd5b5050506002820180546001810182555f918252602090912001839055506116fa565b60405163151bdbdb60e21b602082015260240160405160208183030381529060405280519060200120836040516020016114e99190612daa565b60405160208183030381529060405280519060200120036116bb576003810154600a1161154c5760405162461bcd60e51b815260206004820152601160248201527013585e08151bdbdb1cc81c995858da1959607a1b6044820152606401610597565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156115b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d59190612d6d565b6001600160a01b0316146116205760405162461bcd60e51b81526020600482015260126024820152712737ba102a37b7b61027232a1037bbb732b960711b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e9061167090339030908790600401612d09565b5f604051808303815f87803b158015611687575f80fd5b505af1158015611699573d5f803e3d5ffd5b5050506003820180546001810182555f918252602090912001839055506116fa565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420626f6f73746572207479706560601b6044820152606401610597565b336001600160a01b03167fb0cb091e4e737a4d73e1e861e1a2122f3ede035636c422a1ee754abffd5b40e985858560405161173793929190612dc5565b60405180910390a250505050565b61176f60405180608001604052805f81526020016060815260200160608152602001606081525090565b6001600160a01b0383165f9081526001602081815260408084208685528252808420815160c08101835281548152938101805483518186028101860190945280845291938581019392908301828280156117e657602002820191905f5260205f20905b8154815260200190600101908083116117d2575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561183c57602002820191905f5260205f20905b815481526020019060010190808311611828575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561189257602002820191905f5260205f20905b81548152602001906001019080831161187e575b505050505081526020016004820154815260200160058201548152505090506040518060800160405280825f01518152602001826020015181526020018260400151815260200182606001518152509150505b92915050565b5f6118f68383611c1f565b9392505050565b6119056127b8565b61190e5f6127e4565b565b5f838152600260205260409020546001600160a01b031633146119455760405162461bcd60e51b815260040161059790612c6c565b335f90815260016020908152604080832086845282529182902091516119789101652330b936b2b960d11b815260060190565b604051602081830303815290604052805190602001208360405160200161199f9190612daa565b6040516020818303038152906040528051906020012003611a60576119c78160010183612833565b80516119dd916001840191602090910190612961565b50604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90611a2e90309033908790600401612d09565b5f604051808303815f87803b158015611a45575f80fd5b505af1158015611a57573d5f803e3d5ffd5b50505050611bf5565b604051662a3930b1ba37b960c91b60208201526027016040516020818303038152906040528051906020012083604051602001611a9d9190612daa565b6040516020818303038152906040528051906020012003611b2c57611ac58160020183612833565b8051611adb916002840191602090910190612961565b50604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90611a2e90309033908790600401612d09565b60405163151bdbdb60e21b60208201526024016040516020818303038152906040528051906020012083604051602001611b669190612daa565b60405160208183030381529060405280519060200120036116bb57611b8e8160030183612833565b8051611ba4916003840191602090910190612961565b50604051632142170760e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90611a2e90309033908790600401612d09565b336001600160a01b03165f80516020612e7783398151915285858560405161173793929190612dc5565b6001600160a01b0382165f9081526001602081815260408084208585528252808420815160c08101835281548152938101805483518186028101860190945280845286959492938584019390929190830182828015611c9b57602002820191905f5260205f20905b815481526020019060010190808311611c87575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611cf157602002820191905f5260205f20905b815481526020019060010190808311611cdd575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611d4757602002820191905f5260205f20905b815481526020019060010190808311611d33575b5050505050815260200160048201548152602001600582015481525050905082815f015114611daa5760405162461bcd60e51b815260206004820152600f60248201526e11985c9b481b9bdd081cdd185ad959608a1b6044820152606401610597565b608081015160405163421c8cb160e01b81525f916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163421c8cb191611dff9160040190815260200190565b602060405180830381865afa158015611e1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3e9190612c9c565b90505f611e4a856121a0565b90505f611e6262015180670de0b6b3a7640000612e06565b611e6c8484612e06565b611e769190612e1d565b8460a00151611e859190612e3c565b979650505050505050565b60405160d960248201525f9073dc2b0d2dd2b7759d97d50db4eabdc369731108309060440160408051601f198184030181529181526020820180516001600160e01b03166307983f4560e21b17905251611eea9190612daa565b5f604051808303815f865af19150503d805f8114611f23576040519150601f19603f3d011682016040523d82523d5f602084013e611f28565b606091505b50509050806110355760405162461bcd60e51b815260206004820152601860248201527f4665654d20726567697374726174696f6e206661696c656400000000000000006044820152606401610597565b6001600160a01b0381165f90815260036020908152604091829020805483518184028101840190945280845260609392830182828015611fd657602002820191905f5260205f20905b815481526020019060010190808311611fc2575b50505050509050919050565b611fea6127b8565b5f81116120395760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610597565b6040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561209d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c19190612c9c565b10156120df5760405162461bcd60e51b815260040161059790612cb3565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612149573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061216d9190612cea565b5060405181815233907fd8a9090919355543d8c79690ceee3933c0bd4ffc742ae7f790d4bf44a043bb6c90602001610f4e565b5f818152600260205260408120546001600160a01b0316806121f65760405162461bcd60e51b815260206004820152600f60248201526e11985c9b481b9bdd081cdd185ad959608a1b6044820152606401610597565b6001600160a01b0381165f9081526001602081815260408084208785528252808420815160c081018352815481529381018054835181860281018601909452808452919385810193929083018282801561226d57602002820191905f5260205f20905b815481526020019060010190808311612259575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156122c357602002820191905f5260205f20905b8154815260200190600101908083116122af575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561231957602002820191905f5260205f20905b815481526020019060010190808311612305575b505050505081526020016004820154815260200160058201548152505090505f670b1a2bc2ec5000009050670853a0d2313c000082602001515161235d9190612e06565b6123679082612e3c565b9050670429d069189e00008260400151516123829190612e06565b61238c9082612e3c565b905067016345785d8a00008260600151516123a79190612e06565b6123b19082612e3c565b95945050505050565b335f9081526003602090815260408083208054825181850281018501909352808352919290919083018282801561240e57602002820191905f5260205f20905b8154815260200190600101908083116123fa575b505050505090505f8151116124575760405162461bcd60e51b815260206004820152600f60248201526e139bc819985c9b5cc81cdd185ad959608a1b6044820152606401610597565b5f805b8251811015612560575f83828151811061247657612476612d2d565b6020908102919091018101515f8181526002909252604090912054909150336001600160a01b039091160361254d575f6124b03383611c1f565b9050801561252a576124c28185612e3c565b335f81815260016020908152604080832087845282528083206005810193909355426004840155805187815291820186905293975090927fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a25061254b565b335f9081526001602090815260408083208584529091529020426004909101555b505b508061255881612d55565b91505061245a565b50801561269b576040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ef9190612c9c565b101561260d5760405162461bcd60e51b815260040161059790612cb3565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075a9190612cea565b5050565b6126a76127b8565b6001600160a01b0381166126d057604051631e4fbdf760e01b81525f6004820152602401610597565b611035816127e4565b6001600160a01b0382165f908152600360205260408120905b81548110156127b2578282828154811061270e5761270e612d2d565b905f5260205f200154036127a057815461272a90600190612e4f565b811015612778578154829061274190600190612e4f565b8154811061275157612751612d2d565b905f5260205f20015482828154811061276c5761276c612d2d565b5f918252602090912001555b8180548061278857612788612e62565b600190038181905f5260205f20015f905590556127b2565b806127aa81612d55565b9150506126f2565b50505050565b5f546001600160a01b0316331461190e5760405163118cdaa760e01b8152336004820152602401610597565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81546060905f5b818110156128f2578385828154811061285557612855612d2d565b905f5260205f200154036128e05761286e600183612e4f565b8110156128b85784612881600184612e4f565b8154811061289157612891612d2d565b905f5260205f2001548582815481106128ac576128ac612d2d565b5f918252602090912001555b848054806128c8576128c8612e62565b600190038181905f5260205f20015f905590556128f2565b806128ea81612d55565b91505061283a565b5083546040805160208084028201810190925282815291869183018282801561293857602002820191905f5260205f20905b815481526020019060010190808311612924575b505050505091505092915050565b5080545f8255905f5260205f209081019061103591906129aa565b828054828255905f5260205f2090810192821561299a579160200282015b8281111561299a57825182559160200191906001019061297f565b506129a69291506129aa565b5090565b5b808211156129a6575f81556001016129ab565b5f602082840312156129ce575f80fd5b5035919050565b6001600160a01b0381168114611035575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115612a1757612a176129e9565b604051601f8501601f19908116603f01168101908282118183101715612a3f57612a3f6129e9565b81604052809350858152868686011115612a57575f80fd5b858560208301375f602087830101525050509392505050565b5f805f8060808587031215612a83575f80fd5b8435612a8e816129d5565b93506020850135612a9e816129d5565b925060408501359150606085013567ffffffffffffffff811115612ac0575f80fd5b8501601f81018713612ad0575f80fd5b612adf878235602084016129fd565b91505092959194509250565b5f805f60608486031215612afd575f80fd5b83359250602084013567ffffffffffffffff811115612b1a575f80fd5b8401601f81018613612b2a575f80fd5b612b39868235602084016129fd565b925050604084013590509250925092565b5f8060408385031215612b5b575f80fd5b8235612b66816129d5565b946020939093013593505050565b5f8151808452602080850194508084015f5b83811015612ba257815187529582019590820190600101612b86565b509495945050505050565b60208152815160208201525f602083015160806040840152612bd260a0840182612b74565b90506040840151601f1980858403016060860152612bf08383612b74565b92506060860151915080858403016080860152506123b18282612b74565b5f60208284031215612c1e575f80fd5b81356118f6816129d5565b602080825282518282018190525f9190848201906040850190845b81811015612c6057835183529284019291840191600101612c44565b50909695505050505050565b6020808252601690820152754661726d206e6f74207374616b656420627920796f7560501b604082015260600190565b5f60208284031215612cac575f80fd5b5051919050565b6020808252601a908201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604082015260600190565b5f60208284031215612cfa575f80fd5b815180151581146118f6575f80fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612d6657612d66612d41565b5060010190565b5f60208284031215612d7d575f80fd5b81516118f6816129d5565b5f5b83811015612da2578181015183820152602001612d8a565b50505f910152565b5f8251612dbb818460208701612d88565b9190910192915050565b838152606060208201525f8351806060840152612de9816080850160208801612d88565b604083019390935250601f91909101601f19160160800192915050565b80820281158282048414176118e5576118e5612d41565b5f82612e3757634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156118e5576118e5612d41565b818103818111156118e5576118e5612d41565b634e487b7160e01b5f52603160045260245ffdfe0aedd25c276d5f19e3661cd543190ea5cef9dfa09ccfbf36f5dfcc26a04322bda2646970667358221220f130bf9191bee93b9f2b9baf6fd682ebf0fdddfe108830406eaafa4c6989d74764736f6c634300081400330000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa46000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab9000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d4500000000000000000000000027d41ac429d7fe5a8c76261efd8a13cd206e9b92
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101fd575f3560e01c8063789ac4a411610114578063cb43b2dd116100a9578063d1058e5911610079578063d1058e59146104d2578063da802f80146104da578063e456db3514610501578063f2fde38b14610528578063f7c618c11461053b575f80fd5b8063cb43b2dd14610495578063cc78c4f4146104a8578063d0deef99146104b7578063d0f143f0146104ca575f80fd5b80639a198d61116100e45780639a198d611461043e578063b46f0f7114610446578063b97692fc1461046d578063c5dbe54614610475575f80fd5b8063789ac4a4146103e55780637c7fae861461040c5780637fc7984d1461041b5780638da5cb5b1461042e575f80fd5b80633d4b7c3f11610195578063584b62a111610165578063584b62a1146103595780636099ecb2146103ad578063715018a6146103c057806373b4227e146103c857806374f0314f146103db575f80fd5b80633d4b7c3f146103085780634035379a14610317578063446b58831461032a5780634cb8a68b14610339575f80fd5b806316c621e0116101d057806316c621e01461027857806319128fa81461028b5780631b39aebc146102ca57806326a0a5ae146102f2575f80fd5b80630962ef79146102015780630c32551e1461021657806313f78d2f14610229578063150b7a021461023c575b5f80fd5b61021461020f3660046129be565b610562565b005b6102146102243660046129be565b61075f565b6102146102373660046129be565b610c71565b61025a61024a366004612a70565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020015b60405180910390f35b6102146102863660046129be565b610f59565b6102b27f00000000000000000000000027d41ac429d7fe5a8c76261efd8a13cd206e9b9281565b6040516001600160a01b03909116815260200161026f565b6102b26102d83660046129be565b60026020525f90815260409020546001600160a01b031681565b6102fa600a81565b60405190815260200161026f565b6102fa67016345785d8a000081565b610214610325366004612aeb565b611038565b6102fa670429d069189e000081565b61034c610347366004612b4a565b611745565b60405161026f9190612bad565b610392610367366004612b4a565b600160209081525f928352604080842090915290825290208054600482015460059092015490919083565b6040805193845260208401929092529082015260600161026f565b6102fa6103bb366004612b4a565b6118eb565b6102146118fd565b6102146103d6366004612aeb565b611910565b6102fa6201518081565b6102b27f000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab981565b6102fa670b1a2bc2ec50000081565b6102fa610429366004612b4a565b611c1f565b5f546001600160a01b03166102b2565b610214611e90565b6102b27f000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa4681565b6102fa600281565b610488610483366004612c0e565b611f79565b60405161026f9190612c29565b6102146104a33660046129be565b611fe2565b6102fa670853a0d2313c000081565b6102fa6104c53660046129be565b6121a0565b6102fa600181565b6102146123ba565b6102b27f0000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e81565b6102b27f00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b81565b610214610536366004612c0e565b61269f565b6102b27f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d4581565b5f818152600260205260409020546001600160a01b031633146105a05760405162461bcd60e51b815260040161059790612c6c565b60405180910390fd5b335f8181526001602090815260408083208584529091528120916105c49084611c1f565b90508015610753576040516370a0823160e01b815230600482015281907f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d456001600160a01b0316906370a0823190602401602060405180830381865afa158015610630573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106549190612c9c565b10156106725760405162461bcd60e51b815260040161059790612cb3565b5f60058301554260048084019190915560405163a9059cbb60e01b81523391810191909152602481018290527f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d456001600160a01b03169063a9059cbb906044016020604051808303815f875af11580156106ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107129190612cea565b50604080518481526020810183905233917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a2505050565b4260048301555b505050565b5f818152600260205260409020546001600160a01b031633146107945760405162461bcd60e51b815260040161059790612c6c565b335f90815260016020908152604080832084845290915290206107b682610562565b604051632142170760e11b81526001600160a01b037f0000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e16906342842e0e9061080690309033908790600401612d09565b5f604051808303815f87803b15801561081d575f80fd5b505af115801561082f573d5f803e3d5ffd5b505050505f5b6001820154811015610961577f00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b6001600160a01b03166342842e0e303385600101858154811061088757610887612d2d565b905f5260205f2001546040518463ffffffff1660e01b81526004016108ae93929190612d09565b5f604051808303815f87803b1580156108c5575f80fd5b505af11580156108d7573d5f803e3d5ffd5b50505050336001600160a01b03165f80516020612e778339815191528484600101848154811061090957610909612d2d565b905f5260205f200154604051610947929190918252606060208301819052600690830152652330b936b2b960d11b6080830152604082015260a00190565b60405180910390a28061095981612d55565b915050610835565b505f5b6002820154811015610a91577f000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa466001600160a01b03166342842e0e30338560020185815481106109b6576109b6612d2d565b905f5260205f2001546040518463ffffffff1660e01b81526004016109dd93929190612d09565b5f604051808303815f87803b1580156109f4575f80fd5b505af1158015610a06573d5f803e3d5ffd5b50505050336001600160a01b03165f80516020612e7783398151915284846002018481548110610a3857610a38612d2d565b905f5260205f200154604051610a77929190918252606060208301819052600790830152662a3930b1ba37b960c91b6080830152604082015260a00190565b60405180910390a280610a8981612d55565b915050610964565b505f5b6003820154811015610bbe577f000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab96001600160a01b03166342842e0e3033856003018581548110610ae657610ae6612d2d565b905f5260205f2001546040518463ffffffff1660e01b8152600401610b0d93929190612d09565b5f604051808303815f87803b158015610b24575f80fd5b505af1158015610b36573d5f803e3d5ffd5b50505050336001600160a01b03165f80516020612e7783398151915284846003018481548110610b6857610b68612d2d565b905f5260205f200154604051610ba492919091825260606020830181905260049083015263151bdbdb60e21b6080830152604082015260a00190565b60405180910390a280610bb681612d55565b915050610a94565b50335f90815260016020818152604080842086855290915282208281559190610be990830182612946565b610bf6600283015f612946565b610c03600383015f612946565b505f60048201819055600590910181905582815260026020526040902080546001600160a01b0319169055610c3833836126d9565b60405182815233907f7ea22bee5d003fa7693007c7a26f1f1c8762d95b79fc7aca1e9cdf62b17776dc9060200160405180910390a25050565b5f818152600260205260409020546001600160a01b031615610ccb5760405162461bcd60e51b815260206004820152601360248201527211985c9b48185b1c9958591e481cdd185ad959606a1b6044820152606401610597565b6040516331a9108f60e11b81526004810182905233906001600160a01b037f0000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e1690636352211e90602401602060405180830381865afa158015610d30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d549190612d6d565b6001600160a01b031614610d9f5760405162461bcd60e51b81526020600482015260126024820152712737ba102330b9369027232a1037bbb732b960711b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f0000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e16906342842e0e90610def90339030908690600401612d09565b5f604051808303815f87803b158015610e06575f80fd5b505af1158015610e18573d5f803e3d5ffd5b50506040805160c08101825284815281515f80825260208083018552808401928352845182815280820186528486015284518281528082018652606085015242608085015260a0840182905233825260018082528583208984528252949091208351815591518051939650919450610e9593850192910190612961565b5060408201518051610eb1916002840191602090910190612961565b5060608201518051610ecd916003840191602090910190612961565b506080820151600482015560a0909101516005909101555f81815260026020908152604080832080546001600160a01b0319163390811790915580845260038352818420805460018101825590855293839020909301849055518381527f1a1f70346f063ea62b243f69bc92b7f0de54be854eec5aa105d4e8acedc84d6b91015b60405180910390a250565b610f616127b8565b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d4516906323b872dd90610fb190339030908690600401612d09565b6020604051808303815f875af1158015610fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff19190612cea565b6110355760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610597565b50565b5f838152600260205260409020546001600160a01b0316331461106d5760405162461bcd60e51b815260040161059790612c6c565b335f90815260016020908152604080832086845282529182902091516110a09101652330b936b2b960d11b815260060190565b60405160208183030381529060405280519060200120836040516020016110c79190612daa565b604051602081830303815290604052805190602001200361129b576001818101541061112b5760405162461bcd60e51b815260206004820152601360248201527213585e0811985c9b595c9cc81c995858da1959606a1b6044820152606401610597565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b1690636352211e90602401602060405180830381865afa158015611190573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b49190612d6d565b6001600160a01b0316146112015760405162461bcd60e51b81526020600482015260146024820152732737ba102330b936b2b91027232a1037bbb732b960611b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b16906342842e0e9061125190339030908790600401612d09565b5f604051808303815f87803b158015611268575f80fd5b505af115801561127a573d5f803e3d5ffd5b5050506001808301805491820181555f9081526020902001839055506116fa565b604051662a3930b1ba37b960c91b602082015260270160405160208183030381529060405280519060200120836040516020016112d89190612daa565b60405160208183030381529060405280519060200120036114af576002818101541061133d5760405162461bcd60e51b815260206004820152601460248201527313585e08151c9858dd1bdc9cc81c995858da195960621b6044820152606401610597565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa461690636352211e90602401602060405180830381865afa1580156113a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c69190612d6d565b6001600160a01b0316146114145760405162461bcd60e51b81526020600482015260156024820152742737ba102a3930b1ba37b91027232a1037bbb732b960591b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa4616906342842e0e9061146490339030908790600401612d09565b5f604051808303815f87803b15801561147b575f80fd5b505af115801561148d573d5f803e3d5ffd5b5050506002820180546001810182555f918252602090912001839055506116fa565b60405163151bdbdb60e21b602082015260240160405160208183030381529060405280519060200120836040516020016114e99190612daa565b60405160208183030381529060405280519060200120036116bb576003810154600a1161154c5760405162461bcd60e51b815260206004820152601160248201527013585e08151bdbdb1cc81c995858da1959607a1b6044820152606401610597565b6040516331a9108f60e11b81526004810183905233906001600160a01b037f000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab91690636352211e90602401602060405180830381865afa1580156115b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d59190612d6d565b6001600160a01b0316146116205760405162461bcd60e51b81526020600482015260126024820152712737ba102a37b7b61027232a1037bbb732b960711b6044820152606401610597565b604051632142170760e11b81526001600160a01b037f000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab916906342842e0e9061167090339030908790600401612d09565b5f604051808303815f87803b158015611687575f80fd5b505af1158015611699573d5f803e3d5ffd5b5050506003820180546001810182555f918252602090912001839055506116fa565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420626f6f73746572207479706560601b6044820152606401610597565b336001600160a01b03167fb0cb091e4e737a4d73e1e861e1a2122f3ede035636c422a1ee754abffd5b40e985858560405161173793929190612dc5565b60405180910390a250505050565b61176f60405180608001604052805f81526020016060815260200160608152602001606081525090565b6001600160a01b0383165f9081526001602081815260408084208685528252808420815160c08101835281548152938101805483518186028101860190945280845291938581019392908301828280156117e657602002820191905f5260205f20905b8154815260200190600101908083116117d2575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561183c57602002820191905f5260205f20905b815481526020019060010190808311611828575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561189257602002820191905f5260205f20905b81548152602001906001019080831161187e575b505050505081526020016004820154815260200160058201548152505090506040518060800160405280825f01518152602001826020015181526020018260400151815260200182606001518152509150505b92915050565b5f6118f68383611c1f565b9392505050565b6119056127b8565b61190e5f6127e4565b565b5f838152600260205260409020546001600160a01b031633146119455760405162461bcd60e51b815260040161059790612c6c565b335f90815260016020908152604080832086845282529182902091516119789101652330b936b2b960d11b815260060190565b604051602081830303815290604052805190602001208360405160200161199f9190612daa565b6040516020818303038152906040528051906020012003611a60576119c78160010183612833565b80516119dd916001840191602090910190612961565b50604051632142170760e11b81526001600160a01b037f00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b16906342842e0e90611a2e90309033908790600401612d09565b5f604051808303815f87803b158015611a45575f80fd5b505af1158015611a57573d5f803e3d5ffd5b50505050611bf5565b604051662a3930b1ba37b960c91b60208201526027016040516020818303038152906040528051906020012083604051602001611a9d9190612daa565b6040516020818303038152906040528051906020012003611b2c57611ac58160020183612833565b8051611adb916002840191602090910190612961565b50604051632142170760e11b81526001600160a01b037f000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa4616906342842e0e90611a2e90309033908790600401612d09565b60405163151bdbdb60e21b60208201526024016040516020818303038152906040528051906020012083604051602001611b669190612daa565b60405160208183030381529060405280519060200120036116bb57611b8e8160030183612833565b8051611ba4916003840191602090910190612961565b50604051632142170760e11b81526001600160a01b037f000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab916906342842e0e90611a2e90309033908790600401612d09565b336001600160a01b03165f80516020612e7783398151915285858560405161173793929190612dc5565b6001600160a01b0382165f9081526001602081815260408084208585528252808420815160c08101835281548152938101805483518186028101860190945280845286959492938584019390929190830182828015611c9b57602002820191905f5260205f20905b815481526020019060010190808311611c87575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611cf157602002820191905f5260205f20905b815481526020019060010190808311611cdd575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611d4757602002820191905f5260205f20905b815481526020019060010190808311611d33575b5050505050815260200160048201548152602001600582015481525050905082815f015114611daa5760405162461bcd60e51b815260206004820152600f60248201526e11985c9b481b9bdd081cdd185ad959608a1b6044820152606401610597565b608081015160405163421c8cb160e01b81525f916001600160a01b037f00000000000000000000000027d41ac429d7fe5a8c76261efd8a13cd206e9b92169163421c8cb191611dff9160040190815260200190565b602060405180830381865afa158015611e1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3e9190612c9c565b90505f611e4a856121a0565b90505f611e6262015180670de0b6b3a7640000612e06565b611e6c8484612e06565b611e769190612e1d565b8460a00151611e859190612e3c565b979650505050505050565b60405160d960248201525f9073dc2b0d2dd2b7759d97d50db4eabdc369731108309060440160408051601f198184030181529181526020820180516001600160e01b03166307983f4560e21b17905251611eea9190612daa565b5f604051808303815f865af19150503d805f8114611f23576040519150601f19603f3d011682016040523d82523d5f602084013e611f28565b606091505b50509050806110355760405162461bcd60e51b815260206004820152601860248201527f4665654d20726567697374726174696f6e206661696c656400000000000000006044820152606401610597565b6001600160a01b0381165f90815260036020908152604091829020805483518184028101840190945280845260609392830182828015611fd657602002820191905f5260205f20905b815481526020019060010190808311611fc2575b50505050509050919050565b611fea6127b8565b5f81116120395760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606401610597565b6040516370a0823160e01b815230600482015281907f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d456001600160a01b0316906370a0823190602401602060405180830381865afa15801561209d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c19190612c9c565b10156120df5760405162461bcd60e51b815260040161059790612cb3565b60405163a9059cbb60e01b8152336004820152602481018290527f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d456001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612149573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061216d9190612cea565b5060405181815233907fd8a9090919355543d8c79690ceee3933c0bd4ffc742ae7f790d4bf44a043bb6c90602001610f4e565b5f818152600260205260408120546001600160a01b0316806121f65760405162461bcd60e51b815260206004820152600f60248201526e11985c9b481b9bdd081cdd185ad959608a1b6044820152606401610597565b6001600160a01b0381165f9081526001602081815260408084208785528252808420815160c081018352815481529381018054835181860281018601909452808452919385810193929083018282801561226d57602002820191905f5260205f20905b815481526020019060010190808311612259575b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156122c357602002820191905f5260205f20905b8154815260200190600101908083116122af575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561231957602002820191905f5260205f20905b815481526020019060010190808311612305575b505050505081526020016004820154815260200160058201548152505090505f670b1a2bc2ec5000009050670853a0d2313c000082602001515161235d9190612e06565b6123679082612e3c565b9050670429d069189e00008260400151516123829190612e06565b61238c9082612e3c565b905067016345785d8a00008260600151516123a79190612e06565b6123b19082612e3c565b95945050505050565b335f9081526003602090815260408083208054825181850281018501909352808352919290919083018282801561240e57602002820191905f5260205f20905b8154815260200190600101908083116123fa575b505050505090505f8151116124575760405162461bcd60e51b815260206004820152600f60248201526e139bc819985c9b5cc81cdd185ad959608a1b6044820152606401610597565b5f805b8251811015612560575f83828151811061247657612476612d2d565b6020908102919091018101515f8181526002909252604090912054909150336001600160a01b039091160361254d575f6124b03383611c1f565b9050801561252a576124c28185612e3c565b335f81815260016020908152604080832087845282528083206005810193909355426004840155805187815291820186905293975090927fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a25061254b565b335f9081526001602090815260408083208584529091529020426004909101555b505b508061255881612d55565b91505061245a565b50801561269b576040516370a0823160e01b815230600482015281907f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d456001600160a01b0316906370a0823190602401602060405180830381865afa1580156125cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ef9190612c9c565b101561260d5760405162461bcd60e51b815260040161059790612cb3565b60405163a9059cbb60e01b8152336004820152602481018290527f000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d456001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015612677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075a9190612cea565b5050565b6126a76127b8565b6001600160a01b0381166126d057604051631e4fbdf760e01b81525f6004820152602401610597565b611035816127e4565b6001600160a01b0382165f908152600360205260408120905b81548110156127b2578282828154811061270e5761270e612d2d565b905f5260205f200154036127a057815461272a90600190612e4f565b811015612778578154829061274190600190612e4f565b8154811061275157612751612d2d565b905f5260205f20015482828154811061276c5761276c612d2d565b5f918252602090912001555b8180548061278857612788612e62565b600190038181905f5260205f20015f905590556127b2565b806127aa81612d55565b9150506126f2565b50505050565b5f546001600160a01b0316331461190e5760405163118cdaa760e01b8152336004820152602401610597565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b81546060905f5b818110156128f2578385828154811061285557612855612d2d565b905f5260205f200154036128e05761286e600183612e4f565b8110156128b85784612881600184612e4f565b8154811061289157612891612d2d565b905f5260205f2001548582815481106128ac576128ac612d2d565b5f918252602090912001555b848054806128c8576128c8612e62565b600190038181905f5260205f20015f905590556128f2565b806128ea81612d55565b91505061283a565b5083546040805160208084028201810190925282815291869183018282801561293857602002820191905f5260205f20905b815481526020019060010190808311612924575b505050505091505092915050565b5080545f8255905f5260205f209081019061103591906129aa565b828054828255905f5260205f2090810192821561299a579160200282015b8281111561299a57825182559160200191906001019061297f565b506129a69291506129aa565b5090565b5b808211156129a6575f81556001016129ab565b5f602082840312156129ce575f80fd5b5035919050565b6001600160a01b0381168114611035575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115612a1757612a176129e9565b604051601f8501601f19908116603f01168101908282118183101715612a3f57612a3f6129e9565b81604052809350858152868686011115612a57575f80fd5b858560208301375f602087830101525050509392505050565b5f805f8060808587031215612a83575f80fd5b8435612a8e816129d5565b93506020850135612a9e816129d5565b925060408501359150606085013567ffffffffffffffff811115612ac0575f80fd5b8501601f81018713612ad0575f80fd5b612adf878235602084016129fd565b91505092959194509250565b5f805f60608486031215612afd575f80fd5b83359250602084013567ffffffffffffffff811115612b1a575f80fd5b8401601f81018613612b2a575f80fd5b612b39868235602084016129fd565b925050604084013590509250925092565b5f8060408385031215612b5b575f80fd5b8235612b66816129d5565b946020939093013593505050565b5f8151808452602080850194508084015f5b83811015612ba257815187529582019590820190600101612b86565b509495945050505050565b60208152815160208201525f602083015160806040840152612bd260a0840182612b74565b90506040840151601f1980858403016060860152612bf08383612b74565b92506060860151915080858403016080860152506123b18282612b74565b5f60208284031215612c1e575f80fd5b81356118f6816129d5565b602080825282518282018190525f9190848201906040850190845b81811015612c6057835183529284019291840191600101612c44565b50909695505050505050565b6020808252601690820152754661726d206e6f74207374616b656420627920796f7560501b604082015260600190565b5f60208284031215612cac575f80fd5b5051919050565b6020808252601a908201527f496e73756666696369656e742072657761726420746f6b656e73000000000000604082015260600190565b5f60208284031215612cfa575f80fd5b815180151581146118f6575f80fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612d6657612d66612d41565b5060010190565b5f60208284031215612d7d575f80fd5b81516118f6816129d5565b5f5b83811015612da2578181015183820152602001612d8a565b50505f910152565b5f8251612dbb818460208701612d88565b9190910192915050565b838152606060208201525f8351806060840152612de9816080850160208801612d88565b604083019390935250601f91909101601f19160160800192915050565b80820281158282048414176118e5576118e5612d41565b5f82612e3757634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156118e5576118e5612d41565b818103818111156118e5576118e5612d41565b634e487b7160e01b5f52603160045260245ffdfe0aedd25c276d5f19e3661cd543190ea5cef9dfa09ccfbf36f5dfcc26a04322bda2646970667358221220f130bf9191bee93b9f2b9baf6fd682ebf0fdddfe108830406eaafa4c6989d74764736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa46000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab9000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d4500000000000000000000000027d41ac429d7fe5a8c76261efd8a13cd206e9b92
-----Decoded View---------------
Arg [0] : _farmNFT (address): 0x1F810Bc734f8d2d284E3EcaC46eA85d0B3Cfc97e
Arg [1] : _farmerNFT (address): 0x01D9f6E96490628DD123e8488033BAD179c2C30B
Arg [2] : _tractorNFT (address): 0xDce2469946d0043bD4C57282eC757ce7dE3bAA46
Arg [3] : _toolNFT (address): 0x262a79ad9C2748C5E11f474cB8b4269f55A50aB9
Arg [4] : _rewardToken (address): 0xC48212D65a5BEBF2C040f6118449d5b8ceC76d45
Arg [5] : _rewardProxy (address): 0x27D41Ac429D7FE5a8c76261EFD8a13cd206E9b92
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000001f810bc734f8d2d284e3ecac46ea85d0b3cfc97e
Arg [1] : 00000000000000000000000001d9f6e96490628dd123e8488033bad179c2c30b
Arg [2] : 000000000000000000000000dce2469946d0043bd4c57282ec757ce7de3baa46
Arg [3] : 000000000000000000000000262a79ad9c2748c5e11f474cb8b4269f55a50ab9
Arg [4] : 000000000000000000000000c48212d65a5bebf2c040f6118449d5b8cec76d45
Arg [5] : 00000000000000000000000027d41ac429d7fe5a8c76261efd8a13cd206e9b92
Deployed Bytecode Sourcemap
15246:13933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24364:773;;;;;;:::i;:::-;;:::i;:::-;;21105:1333;;;;;;:::i;:::-;;:::i;18568:794::-;;;;;;:::i;:::-;;:::i;7707:155::-;;;;;;:::i;:::-;-1:-1:-1;;;7707:155:0;;;;;;;;;;-1:-1:-1;;;;;;2064:33:1;;;2046:52;;2034:2;2019:18;7707:155:0;;;;;;;;28074:176;;;;;;:::i;:::-;;:::i;15554:45::-;;;;;;;;-1:-1:-1;;;;;2297:32:1;;;2279:51;;2267:2;2252:18;15554:45:0;2109:227:1;16754:47:0;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;16754:47:0;;;16094:38;;16130:2;16094:38;;;;;2695:25:1;;;2683:2;2668:18;16094:38:0;2549:177:1;15852:49:0;;15889:12;15852:49;;19425:1617;;;;;;:::i;:::-;;:::i;15792:52::-;;15832:12;15792:52;;17946:400;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16684:63::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5121:25:1;;;5177:2;5162:18;;5155:34;;;;5205:18;;;5198:34;5109:2;5094:18;16684:63:0;4919:319:1;28709:159:0;;;;;;:::i;:::-;;:::i;14119:103::-;;;:::i;22485:1196::-;;;;;;:::i;:::-;;:::i;15909:47::-;;15951:5;15909:47;;15473:32;;;;;15667:58;;15713:12;15667:58;;23769:535;;;;;;:::i;:::-;;:::i;13444:87::-;13490:7;13517:6;-1:-1:-1;;;;;13517:6:0;13444:87;;28916:260;;;:::i;15431:35::-;;;;;16047:40;;16086:1;16047:40;;18401:134;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28314:340::-;;;;;;:::i;:::-;;:::i;15733:51::-;;15772:12;15733:51;;26450:518;;;;;;:::i;:::-;;:::i;16001:39::-;;16039:1;16001:39;;25200:1175;;;:::i;15351:32::-;;;;;15390:34;;;;;14377:220;;;;;;:::i;:::-;;:::i;15512:35::-;;;;;24364:773;24433:25;;;;:12;:25;;;;;;-1:-1:-1;;;;;24433:25:0;24462:10;24433:39;24425:74;;;;-1:-1:-1;;;24425:74:0;;;;;;;:::i;:::-;;;;;;;;;24543:10;24510:23;24536:18;;;:6;:18;;;;;;;;:31;;;;;;;;;24598:48;;24555:11;24598:23;:48::i;:::-;24580:66;-1:-1:-1;24661:11:0;;24657:473;;24697:36;;-1:-1:-1;;;24697:36:0;;24727:4;24697:36;;;2279:51:1;24737:7:0;;24697:11;-1:-1:-1;;;;;24697:21:0;;;;2252:18:1;;24697:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;24689:86;;;;-1:-1:-1;;;24689:86:0;;;;;;;:::i;:::-;24817:1;24790:24;;;:28;24860:15;24833:24;;;;:42;;;;24890:41;;-1:-1:-1;;;24890:41:0;;24911:10;24890:41;;;7646:51:1;;;;7713:18;;;7706:34;;;24890:11:0;-1:-1:-1;;;;;24890:20:0;;;;7619:18:1;;24890:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24951:48:0;;;8207:25:1;;;8263:2;8248:18;;8241:34;;;24966:10:0;;24951:48;;8180:18:1;24951:48:0;;;;;;;24414:723;;24364:773;:::o;24657:473::-;25059:15;25032:24;;;:42;24657:473;24414:723;;24364:773;:::o;21105:1333::-;21175:25;;;;:12;:25;;;;;;-1:-1:-1;;;;;21175:25:0;21204:10;21175:39;21167:74;;;;-1:-1:-1;;;21167:74:0;;;;;;;:::i;:::-;21285:10;21252:23;21278:18;;;:6;:18;;;;;;;;:31;;;;;;;;21322:25;21297:11;21322:12;:25::i;:::-;21360:64;;-1:-1:-1;;;21360:64:0;;-1:-1:-1;;;;;21360:7:0;:24;;;;:64;;21393:4;;21400:10;;21412:11;;21360:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21440:9;21435:258;21459:20;;;:27;21455:31;;21435:258;;;21508:9;-1:-1:-1;;;;;21508:26:0;;21543:4;21550:10;21562:5;:20;;21583:1;21562:23;;;;;;;;:::i;:::-;;;;;;;;;21508:78;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21622:10;-1:-1:-1;;;;;21606:75:0;-1:-1:-1;;;;;;;;;;;21634:11:0;21657:5;:20;;21678:1;21657:23;;;;;;;;:::i;:::-;;;;;;;;;21606:75;;;;;;9038:25:1;;;9099:2;9094;9079:18;;9072:30;;;9138:1;9118:18;;;9111:29;-1:-1:-1;;;9171:3:1;9156:19;;9149:37;9253:2;9238:18;;9231:34;9218:3;9203:19;;8798:473;21606:75:0;;;;;;;;21488:3;;;;:::i;:::-;;;;21435:258;;;;21708:9;21703:263;21727:21;;;:28;21723:32;;21703:263;;;21777:10;-1:-1:-1;;;;;21777:27:0;;21813:4;21820:10;21832:5;:21;;21854:1;21832:24;;;;;;;;:::i;:::-;;;;;;;;;21777:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21893:10;-1:-1:-1;;;;;21877:77:0;-1:-1:-1;;;;;;;;;;;21905:11:0;21929:5;:21;;21951:1;21929:24;;;;;;;;:::i;:::-;;;;;;;;;21877:77;;;;;;9788:25:1;;;9849:2;9844;9829:18;;9822:30;;;9888:1;9868:18;;;9861:29;-1:-1:-1;;;9921:3:1;9906:19;;9899:38;10004:2;9989:18;;9982:34;9969:3;9954:19;;9548:474;21877:77:0;;;;;;;;21757:3;;;;:::i;:::-;;;;21703:263;;;;21981:9;21976:248;22000:18;;;:25;21996:29;;21976:248;;;22047:7;-1:-1:-1;;;;;22047:24:0;;22080:4;22087:10;22099:5;:18;;22118:1;22099:21;;;;;;;;:::i;:::-;;;;;;;;;22047:74;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22157:10;-1:-1:-1;;;;;22141:71:0;-1:-1:-1;;;;;;;;;;;22169:11:0;22190:5;:18;;22209:1;22190:21;;;;;;;;:::i;:::-;;;;;;;;;22141:71;;;;;;10267:25:1;;;10328:2;10323;10308:18;;10301:30;;;10367:1;10347:18;;;10340:29;-1:-1:-1;;;10400:3:1;10385:19;;10378:35;10480:2;10465:18;;10458:34;10445:3;10430:19;;10027:471;22141:71:0;;;;;;;;22027:3;;;;:::i;:::-;;;;21976:248;;;-1:-1:-1;22250:10:0;22243:18;;;;:6;:18;;;;;;;;:31;;;;;;;;22236:38;;;22243:31;:18;22236:38;;;;22243:18;22236:38;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;-1:-1:-1;22236:38:0;;;;;;;;;;;;;;22292:25;;;:12;:25;;;;;22285:32;;-1:-1:-1;;;;;;22285:32:0;;;22328:47;22351:10;22305:11;22328:22;:47::i;:::-;22393:37;;2695:25:1;;;22406:10:0;;22393:37;;2683:2:1;2668:18;22393:37:0;;;;;;;21156:1282;21105:1333;:::o;18568:794::-;18673:1;18636:25;;;:12;:25;;;;;;-1:-1:-1;;;;;18636:25:0;:39;18628:71;;;;-1:-1:-1;;;18628:71:0;;10705:2:1;18628:71:0;;;10687:21:1;10744:2;10724:18;;;10717:30;-1:-1:-1;;;10763:18:1;;;10756:49;10822:18;;18628:71:0;10503:343:1;18628:71:0;18718:28;;-1:-1:-1;;;18718:28:0;;;;;2695:25:1;;;18750:10:0;;-1:-1:-1;;;;;18718:7:0;:15;;;;2668:18:1;;18718:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18718:42:0;;18710:73;;;;-1:-1:-1;;;18710:73:0;;11309:2:1;18710:73:0;;;11291:21:1;11348:2;11328:18;;;11321:30;-1:-1:-1;;;11367:18:1;;;11360:48;11425:18;;18710:73:0;11107:342:1;18710:73:0;18796:64;;-1:-1:-1;;;18796:64:0;;-1:-1:-1;;;;;18796:7:0;:24;;;;:64;;18821:10;;18841:4;;18848:11;;18796:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18907:287:0;;;;;;;;;;;18987:16;;-1:-1:-1;18987:16:0;;;18907:287;18987:16;;;;;18907:287;;;;;;19035:16;;;;;;;;;;18907:287;;;;19080:16;;;;;;;;;;18907:287;;;;19131:15;18907:287;;;;;;;;;;18880:10;18873:18;;:6;:18;;;;;;:31;;;;;;;;;:321;;;;;;;;18907:287;;-1:-1:-1;18873:31:0;;-1:-1:-1;18873:321:0;;;;;;;;;:::i;:::-;-1:-1:-1;18873:321:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18873:321:0;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18873:321:0;;;;;;;;;;;;;;;;;;-1:-1:-1;19205:25:0;;;:12;:25;;;;;;;;:38;;-1:-1:-1;;;;;;19205:38:0;19233:10;19205:38;;;;;;19254:29;;;:17;:29;;;;;:47;;-1:-1:-1;19254:47:0;;;;;;;;;;;;;;;;;19319:35;2695:25:1;;;19319:35:0;;2668:18:1;19319:35:0;;;;;;;;18568:794;:::o;28074:176::-;13330:13;:11;:13::i;:::-;28157:59:::1;::::0;-1:-1:-1;;;28157:59:0;;-1:-1:-1;;;;;28157:11:0::1;:24;::::0;::::1;::::0;:59:::1;::::0;28182:10:::1;::::0;28202:4:::1;::::0;28209:6;;28157:59:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28149:93;;;::::0;-1:-1:-1;;;28149:93:0;;11656:2:1;28149:93:0::1;::::0;::::1;11638:21:1::0;11695:2;11675:18;;;11668:30;-1:-1:-1;;;11714:18:1;;;11707:51;11775:18;;28149:93:0::1;11454:345:1::0;28149:93:0::1;28074:176:::0;:::o;19425:1617::-;19540:25;;;;:12;:25;;;;;;-1:-1:-1;;;;;19540:25:0;19569:10;19540:39;19532:74;;;;-1:-1:-1;;;19532:74:0;;;;;;;:::i;:::-;19650:10;19617:23;19643:18;;;:6;:18;;;;;;;;:31;;;;;;;;;19745:26;;;;;-1:-1:-1;;;12006:21:1;;12052:1;12043:11;;11804:256;19745:26:0;;;;;;;;;;;;;19735:37;;;;;;19718:11;19701:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;19691:40;;;;;;:81;19687:1270;;16039:1;19797:20;;;:27;:41;19789:73;;;;-1:-1:-1;;;19789:73:0;;12816:2:1;19789:73:0;;;12798:21:1;12855:2;12835:18;;;12828:30;-1:-1:-1;;;12874:18:1;;;12867:49;12933:18;;19789:73:0;12614:343:1;19789:73:0;19885:26;;-1:-1:-1;;;19885:26:0;;;;;2695:25:1;;;19915:10:0;;-1:-1:-1;;;;;19885:9:0;:17;;;;2668:18:1;;19885:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19885:40:0;;19877:73;;;;-1:-1:-1;;;19877:73:0;;13164:2:1;19877:73:0;;;13146:21:1;13203:2;13183:18;;;13176:30;-1:-1:-1;;;13222:18:1;;;13215:50;13282:18;;19877:73:0;12962:344:1;19877:73:0;19965:62;;-1:-1:-1;;;19965:62:0;;-1:-1:-1;;;;;19965:9:0;:26;;;;:62;;19992:10;;20012:4;;20019:7;;19965:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20042:20:0;;;;:34;;;;;;;-1:-1:-1;20042:34:0;;;;;;;;;;-1:-1:-1;19687:1270:0;;;20152:27;;-1:-1:-1;;;20152:27:0;;;13513:22:1;13551:11;;20152:27:0;;;;;;;;;;;;20142:38;;;;;;20125:11;20108:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;20098:40;;;;;;:82;20094:863;;16086:1;20205:21;;;:28;:43;20197:76;;;;-1:-1:-1;;;20197:76:0;;13775:2:1;20197:76:0;;;13757:21:1;13814:2;13794:18;;;13787:30;-1:-1:-1;;;13833:18:1;;;13826:50;13893:18;;20197:76:0;13573:344:1;20197:76:0;20296:27;;-1:-1:-1;;;20296:27:0;;;;;2695:25:1;;;20327:10:0;;-1:-1:-1;;;;;20296:10:0;:18;;;;2668::1;;20296:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20296:41:0;;20288:75;;;;-1:-1:-1;;;20288:75:0;;14124:2:1;20288:75:0;;;14106:21:1;14163:2;14143:18;;;14136:30;-1:-1:-1;;;14182:18:1;;;14175:51;14243:18;;20288:75:0;13922:345:1;20288:75:0;20378:63;;-1:-1:-1;;;20378:63:0;;-1:-1:-1;;;;;20378:10:0;:27;;;;:63;;20406:10;;20426:4;;20433:7;;20378:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20456:21:0;;;:35;;;;;;;-1:-1:-1;20456:35:0;;;;;;;;;;;-1:-1:-1;20094:863:0;;;20567:24;;-1:-1:-1;;;20567:24:0;;;14474:19:1;14509:11;;20567:24:0;;;;;;;;;;;;20557:35;;;;;;20540:11;20523:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;20513:40;;;;;;:79;20509:448;;20617:18;;;:25;16130:2;-1:-1:-1;20609:67:0;;;;-1:-1:-1;;;20609:67:0;;14733:2:1;20609:67:0;;;14715:21:1;14772:2;14752:18;;;14745:30;-1:-1:-1;;;14791:18:1;;;14784:47;14848:18;;20609:67:0;14531:341:1;20609:67:0;20699:24;;-1:-1:-1;;;20699:24:0;;;;;2695:25:1;;;20727:10:0;;-1:-1:-1;;;;;20699:7:0;:15;;;;2668:18:1;;20699:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20699:38:0;;20691:69;;;;-1:-1:-1;;;20691:69:0;;15079:2:1;20691:69:0;;;15061:21:1;15118:2;15098:18;;;15091:30;-1:-1:-1;;;15137:18:1;;;15130:48;15195:18;;20691:69:0;14877:342:1;20691:69:0;20775:60;;-1:-1:-1;;;20775:60:0;;-1:-1:-1;;;;;20775:7:0;:24;;;;:60;;20800:10;;20820:4;;20827:7;;20775:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20850:18:0;;;:32;;;;;;;-1:-1:-1;20850:32:0;;;;;;;;;;;-1:-1:-1;20509:448:0;;;20915:30;;-1:-1:-1;;;20915:30:0;;15426:2:1;20915:30:0;;;15408:21:1;15465:2;15445:18;;;15438:30;-1:-1:-1;;;15484:18:1;;;15477:50;15544:18;;20915:30:0;15224:344:1;20509:448:0;20988:10;-1:-1:-1;;;;;20974:60:0;;21000:11;21013;21026:7;20974:60;;;;;;;;:::i;:::-;;;;;;;;19521:1521;19425:1617;;;:::o;17946:400::-;18023:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18023:16:0;-1:-1:-1;;;;;18077:12:0;;18052:22;18077:12;;;:6;:12;;;;;;;;:25;;;;;;;;18052:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18077:25;;18052:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18120:218;;;;;;;;18158:5;:17;;;18120:218;;;;18206:5;:20;;;18120:218;;;;18258:5;:21;;;18120:218;;;;18308:5;:18;;;18120:218;;;18113:225;;;17946:400;;;;;:::o;28709:159::-;28791:7;28818:42;28842:4;28848:11;28818:23;:42::i;:::-;28811:49;28709:159;-1:-1:-1;;;28709:159:0:o;14119:103::-;13330:13;:11;:13::i;:::-;14184:30:::1;14211:1;14184:18;:30::i;:::-;14119:103::o:0;22485:1196::-;22602:25;;;;:12;:25;;;;;;-1:-1:-1;;;;;22602:25:0;22631:10;22602:39;22594:74;;;;-1:-1:-1;;;22594:74:0;;;;;;;:::i;:::-;22712:10;22679:23;22705:18;;;:6;:18;;;;;;;;:31;;;;;;;;;22807:26;;;;;-1:-1:-1;;;12006:21:1;;12052:1;12043:11;;11804:256;22807:26:0;;;;;;;;;;;;;22797:37;;;;;;22780:11;22763:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;22753:40;;;;;;:81;22749:845;;22874:44;22888:5;:20;;22910:7;22874:13;:44::i;:::-;22851:67;;;;:20;;;;:67;;;;;;:::i;:::-;-1:-1:-1;22933:62:0;;-1:-1:-1;;;22933:62:0;;-1:-1:-1;;;;;22933:9:0;:26;;;;:62;;22968:4;;22975:10;;22987:7;;22933:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22749:845;;;23071:27;;-1:-1:-1;;;23071:27:0;;;13513:22:1;13551:11;;23071:27:0;;;;;;;;;;;;23061:38;;;;;;23044:11;23027:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;23017:40;;;;;;:82;23013:581;;23140:45;23154:5;:21;;23177:7;23140:13;:45::i;:::-;23116:69;;;;:21;;;;:69;;;;;;:::i;:::-;-1:-1:-1;23200:63:0;;-1:-1:-1;;;23200:63:0;;-1:-1:-1;;;;;23200:10:0;:27;;;;:63;;23236:4;;23243:10;;23255:7;;23200:63;;;:::i;23013:581::-;23339:24;;-1:-1:-1;;;23339:24:0;;;14474:19:1;14509:11;;23339:24:0;;;;;;;;;;;;23329:35;;;;;;23312:11;23295:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;23285:40;;;;;;:79;23281:313;;23402:42;23416:5;:18;;23436:7;23402:13;:42::i;:::-;23381:63;;;;:18;;;;:63;;;;;;:::i;:::-;-1:-1:-1;23459:60:0;;-1:-1:-1;;;23459:60:0;;-1:-1:-1;;;;;23459:7:0;:24;;;;:60;;23492:4;;23499:10;;23511:7;;23459:60;;;:::i;23281:313::-;23627:10;-1:-1:-1;;;;;23611:62:0;-1:-1:-1;;;;;;;;;;;23639:11:0;23652;23665:7;23611:62;;;;;;;;:::i;23769:535::-;-1:-1:-1;;;;;23903:12:0;;23858:7;23903:12;;;:6;:12;;;;;;;;:25;;;;;;;;23878:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23858:7;;23878:50;23903:25;;23878:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23968:11;23947:5;:17;;;:32;23939:60;;;;-1:-1:-1;;;23939:60:0;;16320:2:1;23939:60:0;;;16302:21:1;16359:2;16339:18;;;16332:30;-1:-1:-1;;;16378:18:1;;;16371:45;16433:18;;23939:60:0;16118:339:1;23939:60:0;24069:24;;;;24033:61;;-1:-1:-1;;;24033:61:0;;24012:18;;-1:-1:-1;;;;;24033:11:0;:35;;;;:61;;;;2695:25:1;;;2683:2;2668:18;;2549:177;24033:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24012:82;;24105:19;24127:33;24148:11;24127:20;:33::i;:::-;24105:55;-1:-1:-1;24171:15:0;24246:24;15951:5;24246:6;:24;:::i;:::-;24217;24231:10;24217:11;:24;:::i;:::-;24216:55;;;;:::i;:::-;24189:5;:24;;;:82;;;;:::i;:::-;24171:100;23769:535;-1:-1:-1;;;;;;;23769:535:0:o;28916:260::-;29048:53;;29097:3;29048:53;;;17141:36:1;28959:13:0;;28985:42;;17114:18:1;;29048:53:0;;;-1:-1:-1;;29048:53:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29048:53:0;-1:-1:-1;;;29048:53:0;;;28977:135;;;29048:53;28977:135;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28958:154;;;29131:8;29123:45;;;;-1:-1:-1;;;29123:45:0;;17682:2:1;29123:45:0;;;17664:21:1;17721:2;17701:18;;;17694:30;17760:26;17740:18;;;17733:54;17804:18;;29123:45:0;17480:348:1;18401:134:0;-1:-1:-1;;;;;18504:23:0;;;;;;:17;:23;;;;;;;;;18497:30;;;;;;;;;;;;;;;;;18468:16;;18497:30;;;18504:23;18497:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18401:134;;;:::o;28314:340::-;13330:13;:11;:13::i;:::-;28407:1:::1;28398:6;:10;28390:52;;;::::0;-1:-1:-1;;;28390:52:0;;18035:2:1;28390:52:0::1;::::0;::::1;18017:21:1::0;18074:2;18054:18;;;18047:30;18113:31;18093:18;;;18086:59;18162:18;;28390:52:0::1;17833:353:1::0;28390:52:0::1;28461:36;::::0;-1:-1:-1;;;28461:36:0;;28491:4:::1;28461:36;::::0;::::1;2279:51:1::0;28501:6:0;;28461:11:::1;-1:-1:-1::0;;;;;28461:21:0::1;::::0;::::1;::::0;2252:18:1;;28461:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;28453:85;;;;-1:-1:-1::0;;;28453:85:0::1;;;;;;;:::i;:::-;28549:40;::::0;-1:-1:-1;;;28549:40:0;;28570:10:::1;28549:40;::::0;::::1;7646:51:1::0;7713:18;;;7706:34;;;28549:11:0::1;-1:-1:-1::0;;;;;28549:20:0::1;::::0;::::1;::::0;7619:18:1;;28549:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28605:41:0::1;::::0;2695:25:1;;;28627:10:0::1;::::0;28605:41:::1;::::0;2683:2:1;2668:18;28605:41:0::1;2549:177:1::0;26450:518:0;26522:7;26557:25;;;:12;:25;;;;;;-1:-1:-1;;;;;26557:25:0;;26593:46;;;;-1:-1:-1;;;26593:46:0;;16320:2:1;26593:46:0;;;16302:21:1;16359:2;16339:18;;;16332:30;-1:-1:-1;;;16378:18:1;;;16371:45;16433:18;;26593:46:0;16118:339:1;26593:46:0;-1:-1:-1;;;;;26675:12:0;;26650:22;26675:12;;;:6;:12;;;;;;;;:25;;;;;;;;26650:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26675:25;;26650:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26713:14;15713:12;26713:36;;15772:12;26770:5;:20;;;:27;:42;;;;:::i;:::-;26760:52;;;;:::i;:::-;;;15832:12;26833:5;:21;;;:28;:44;;;;:::i;:::-;26823:54;;;;:::i;:::-;;;15889:12;26898:5;:18;;;:25;:38;;;;:::i;:::-;26888:48;;;;:::i;:::-;;26450:518;-1:-1:-1;;;;;26450:518:0:o;25200:1175::-;25285:10;25240:24;25267:29;;;:17;:29;;;;;;;;25240:56;;;;;;;;;;;;;;;;;;;25267:29;;25240:56;;;25267:29;25240:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25332:1;25315:7;:14;:18;25307:46;;;;-1:-1:-1;;;25307:46:0;;18393:2:1;25307:46:0;;;18375:21:1;18432:2;18412:18;;;18405:30;-1:-1:-1;;;18451:18:1;;;18444:45;18506:18;;25307:46:0;18191:339:1;25307:46:0;25366:20;25406:9;25401:754;25425:7;:14;25421:1;:18;25401:754;;;25461:19;25483:7;25491:1;25483:10;;;;;;;;:::i;:::-;;;;;;;;;;;;25512:25;;;;:12;:25;;;;;;;;25483:10;;-1:-1:-1;25541:10:0;-1:-1:-1;;;;;25512:25:0;;;:39;25508:636;;25572:15;25590:48;25614:10;25626:11;25590:23;:48::i;:::-;25572:66;-1:-1:-1;25661:11:0;;25657:472;;25697:23;25713:7;25697:23;;:::i;:::-;25776:10;25743:23;25769:18;;;:6;:18;;;;;;;;:31;;;;;;;;25823:24;;;:28;;;;25901:15;25874:24;;;:42;25944:48;;8207:25:1;;;8248:18;;;8241:34;;;25697:23:0;;-1:-1:-1;25769:31:0;;25944:48;;8180:18:1;25944:48:0;;;;;;;25674:338;25657:472;;;26048:10;26041:18;;;;:6;:18;;;;;;;;:31;;;;;;;;26094:15;26041:50;;;;:68;25657:472;25553:591;25508:636;-1:-1:-1;25441:3:0;;;;:::i;:::-;;;;25401:754;;;-1:-1:-1;26171:16:0;;26167:201;;26212:36;;-1:-1:-1;;;26212:36:0;;26242:4;26212:36;;;2279:51:1;26252:12:0;;26212:11;-1:-1:-1;;;;;26212:21:0;;;;2252:18:1;;26212:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;26204:91;;;;-1:-1:-1;;;26204:91:0;;;;;;;:::i;:::-;26310:46;;-1:-1:-1;;;26310:46:0;;26331:10;26310:46;;;7646:51:1;7713:18;;;7706:34;;;26310:11:0;-1:-1:-1;;;;;26310:20:0;;;;7619:18:1;;26310:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26167:201::-;25229:1146;;25200:1175::o;14377:220::-;13330:13;:11;:13::i;:::-;-1:-1:-1;;;;;14462:22:0;::::1;14458:93;;14508:31;::::0;-1:-1:-1;;;14508:31:0;;14536:1:::1;14508:31;::::0;::::1;2279:51:1::0;2252:18;;14508:31:0::1;2109:227:1::0;14458:93:0::1;14561:28;14580:8;14561:18;:28::i;27559:459::-:0;-1:-1:-1;;;;;27674:23:0;;27646:25;27674:23;;;:17;:23;;;;;;27708:303;27732:14;;27728:18;;27708:303;;;27786:11;27772:7;27780:1;27772:10;;;;;;;;:::i;:::-;;;;;;;;;:25;27768:232;;27826:14;;:18;;27843:1;;27826:18;:::i;:::-;27822:1;:22;27818:111;;;27890:14;;27882:7;;27890:18;;27907:1;;27890:18;:::i;:::-;27882:27;;;;;;;;:::i;:::-;;;;;;;;;27869:7;27877:1;27869:10;;;;;;;;:::i;:::-;;;;;;;;;;:40;27818:111;27947:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27979:5;;27768:232;27748:3;;;;:::i;:::-;;;;27708:303;;;;27635:383;27559:459;;:::o;13609:166::-;13490:7;13517:6;-1:-1:-1;;;;;13517:6:0;11533:10;13669:23;13665:103;;13716:40;;-1:-1:-1;;;13716:40:0;;11533:10;13716:40;;;2279:51:1;2252:18;;13716:40:0;2109:227:1;14757:191:0;14831:16;14850:6;;-1:-1:-1;;;;;14867:17:0;;;-1:-1:-1;;;;;;14867:17:0;;;;;;14900:40;;14850:6;;;;;;;14900:40;;14831:16;14900:40;14820:128;14757:191;:::o;27030:449::-;27159:12;;27113:16;;27142:14;27182:267;27206:6;27202:1;:10;27182:267;;;27250:7;27238:5;27244:1;27238:8;;;;;;;;:::i;:::-;;;;;;;;;:19;27234:204;;27286:10;27295:1;27286:6;:10;:::i;:::-;27282:1;:14;27278:91;;;27332:5;27338:10;27347:1;27338:6;:10;:::i;:::-;27332:17;;;;;;;;:::i;:::-;;;;;;;;;27321:5;27327:1;27321:8;;;;;;;;:::i;:::-;;;;;;;;;;:28;27278:91;27387:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27417:5;;27234:204;27214:3;;;;:::i;:::-;;;;27182:267;;;-1:-1:-1;27459:12:0;;;;;;;;;;;;;;;;;;;;27466:5;;27459:12;;27466:5;27459:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27030:449;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:131::-;-1:-1:-1;;;;;274:31:1;;264:42;;254:70;;320:1;317;310:12;335:127;396:10;391:3;387:20;384:1;377:31;427:4;424:1;417:15;451:4;448:1;441:15;467:631;531:5;561:18;602:2;594:6;591:14;588:40;;;608:18;;:::i;:::-;683:2;677:9;651:2;737:15;;-1:-1:-1;;733:24:1;;;759:2;729:33;725:42;713:55;;;783:18;;;803:22;;;780:46;777:72;;;829:18;;:::i;:::-;869:10;865:2;858:22;898:6;889:15;;928:6;920;913:22;968:3;959:6;954:3;950:16;947:25;944:45;;;985:1;982;975:12;944:45;1035:6;1030:3;1023:4;1015:6;1011:17;998:44;1090:1;1083:4;1074:6;1066;1062:19;1058:30;1051:41;;;;467:631;;;;;:::o;1103:794::-;1198:6;1206;1214;1222;1275:3;1263:9;1254:7;1250:23;1246:33;1243:53;;;1292:1;1289;1282:12;1243:53;1331:9;1318:23;1350:31;1375:5;1350:31;:::i;:::-;1400:5;-1:-1:-1;1457:2:1;1442:18;;1429:32;1470:33;1429:32;1470:33;:::i;:::-;1522:7;-1:-1:-1;1576:2:1;1561:18;;1548:32;;-1:-1:-1;1631:2:1;1616:18;;1603:32;1658:18;1647:30;;1644:50;;;1690:1;1687;1680:12;1644:50;1713:22;;1766:4;1758:13;;1754:27;-1:-1:-1;1744:55:1;;1795:1;1792;1785:12;1744:55;1818:73;1883:7;1878:2;1865:16;1860:2;1856;1852:11;1818:73;:::i;:::-;1808:83;;;1103:794;;;;;;;:::o;2731:586::-;2818:6;2826;2834;2887:2;2875:9;2866:7;2862:23;2858:32;2855:52;;;2903:1;2900;2893:12;2855:52;2939:9;2926:23;2916:33;;3000:2;2989:9;2985:18;2972:32;3027:18;3019:6;3016:30;3013:50;;;3059:1;3056;3049:12;3013:50;3082:22;;3135:4;3127:13;;3123:27;-1:-1:-1;3113:55:1;;3164:1;3161;3154:12;3113:55;3187:73;3252:7;3247:2;3234:16;3229:2;3225;3221:11;3187:73;:::i;:::-;3177:83;;;3307:2;3296:9;3292:18;3279:32;3269:42;;2731:586;;;;;:::o;3322:315::-;3390:6;3398;3451:2;3439:9;3430:7;3426:23;3422:32;3419:52;;;3467:1;3464;3457:12;3419:52;3506:9;3493:23;3525:31;3550:5;3525:31;:::i;:::-;3575:5;3627:2;3612:18;;;;3599:32;;-1:-1:-1;;;3322:315:1:o;3642:435::-;3695:3;3733:5;3727:12;3760:6;3755:3;3748:19;3786:4;3815:2;3810:3;3806:12;3799:19;;3852:2;3845:5;3841:14;3873:1;3883:169;3897:6;3894:1;3891:13;3883:169;;;3958:13;;3946:26;;3992:12;;;;4027:15;;;;3919:1;3912:9;3883:169;;;-1:-1:-1;4068:3:1;;3642:435;-1:-1:-1;;;;;3642:435:1:o;4082:832::-;4263:2;4252:9;4245:21;4308:6;4302:13;4297:2;4286:9;4282:18;4275:41;4226:4;4363:2;4355:6;4351:15;4345:22;4403:4;4398:2;4387:9;4383:18;4376:32;4431:63;4489:3;4478:9;4474:19;4460:12;4431:63;:::i;:::-;4417:77;;4543:2;4535:6;4531:15;4525:22;4570:2;4566:7;4637:2;4625:9;4617:6;4613:22;4609:31;4604:2;4593:9;4589:18;4582:59;4664:52;4709:6;4693:14;4664:52;:::i;:::-;4650:66;;4765:2;4757:6;4753:15;4747:22;4725:44;;4835:2;4823:9;4815:6;4811:22;4807:31;4800:4;4789:9;4785:20;4778:61;;4856:52;4901:6;4885:14;4856:52;:::i;5466:247::-;5525:6;5578:2;5566:9;5557:7;5553:23;5549:32;5546:52;;;5594:1;5591;5584:12;5546:52;5633:9;5620:23;5652:31;5677:5;5652:31;:::i;5718:632::-;5889:2;5941:21;;;6011:13;;5914:18;;;6033:22;;;5860:4;;5889:2;6112:15;;;;6086:2;6071:18;;;5860:4;6155:169;6169:6;6166:1;6163:13;6155:169;;;6230:13;;6218:26;;6299:15;;;;6264:12;;;;6191:1;6184:9;6155:169;;;-1:-1:-1;6341:3:1;;5718:632;-1:-1:-1;;;;;;5718:632:1:o;6577:346::-;6779:2;6761:21;;;6818:2;6798:18;;;6791:30;-1:-1:-1;;;6852:2:1;6837:18;;6830:52;6914:2;6899:18;;6577:346::o;6928:184::-;6998:6;7051:2;7039:9;7030:7;7026:23;7022:32;7019:52;;;7067:1;7064;7057:12;7019:52;-1:-1:-1;7090:16:1;;6928:184;-1:-1:-1;6928:184:1:o;7117:350::-;7319:2;7301:21;;;7358:2;7338:18;;;7331:30;7397:28;7392:2;7377:18;;7370:56;7458:2;7443:18;;7117:350::o;7751:277::-;7818:6;7871:2;7859:9;7850:7;7846:23;7842:32;7839:52;;;7887:1;7884;7877:12;7839:52;7919:9;7913:16;7972:5;7965:13;7958:21;7951:5;7948:32;7938:60;;7994:1;7991;7984:12;8286:375;-1:-1:-1;;;;;8544:15:1;;;8526:34;;8596:15;;;;8591:2;8576:18;;8569:43;8643:2;8628:18;;8621:34;;;;8476:2;8461:18;;8286:375::o;8666:127::-;8727:10;8722:3;8718:20;8715:1;8708:31;8758:4;8755:1;8748:15;8782:4;8779:1;8772:15;9276:127;9337:10;9332:3;9328:20;9325:1;9318:31;9368:4;9365:1;9358:15;9392:4;9389:1;9382:15;9408:135;9447:3;9468:17;;;9465:43;;9488:18;;:::i;:::-;-1:-1:-1;9535:1:1;9524:13;;9408:135::o;10851:251::-;10921:6;10974:2;10962:9;10953:7;10949:23;10945:32;10942:52;;;10990:1;10987;10980:12;10942:52;11022:9;11016:16;11041:31;11066:5;11041:31;:::i;12065:250::-;12150:1;12160:113;12174:6;12171:1;12168:13;12160:113;;;12250:11;;;12244:18;12231:11;;;12224:39;12196:2;12189:10;12160:113;;;-1:-1:-1;;12307:1:1;12289:16;;12282:27;12065:250::o;12320:289::-;12451:3;12489:6;12483:13;12505:66;12564:6;12559:3;12552:4;12544:6;12540:17;12505:66;:::i;:::-;12587:16;;;;;12320:289;-1:-1:-1;;12320:289:1:o;15573:540::-;15778:6;15767:9;15760:25;15821:2;15816;15805:9;15801:18;15794:30;15741:4;15853:6;15847:13;15896:6;15891:2;15880:9;15876:18;15869:34;15912:80;15985:6;15979:3;15968:9;15964:19;15959:2;15951:6;15947:15;15912:80;:::i;:::-;16095:2;16080:18;;16073:34;;;;-1:-1:-1;16053:2:1;16032:15;;;;-1:-1:-1;;16028:29:1;16013:45;16060:3;16009:55;;15573:540;-1:-1:-1;;15573:540:1:o;16462:168::-;16535:9;;;16566;;16583:15;;;16577:22;;16563:37;16553:71;;16604:18;;:::i;16635:217::-;16675:1;16701;16691:132;;16745:10;16740:3;16736:20;16733:1;16726:31;16780:4;16777:1;16770:15;16808:4;16805:1;16798:15;16691:132;-1:-1:-1;16837:9:1;;16635:217::o;16857:125::-;16922:9;;;16943:10;;;16940:36;;;16956:18;;:::i;18535:128::-;18602:9;;;18623:11;;;18620:37;;;18637:18;;:::i;18668:127::-;18729:10;18724:3;18720:20;18717:1;18710:31;18760:4;18757:1;18750:15;18784:4;18781:1;18774:15
Swarm Source
ipfs://f130bf9191bee93b9f2b9baf6fd682ebf0fdddfe108830406eaafa4c6989d747
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in S
Multichain Portfolio | 35 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.