More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,359 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 18167530 | 431 days ago | IN | 0 ETH | 0.00137051 | ||||
Unstake | 16923311 | 606 days ago | IN | 0 ETH | 0.00220656 | ||||
Unstake | 16894204 | 610 days ago | IN | 0 ETH | 0.00171071 | ||||
Unstake | 16528241 | 662 days ago | IN | 0 ETH | 0.00476538 | ||||
Stake | 16500827 | 666 days ago | IN | 0 ETH | 0.00310748 | ||||
Unstake | 16472606 | 669 days ago | IN | 0 ETH | 0.00235849 | ||||
Unstake | 16405956 | 679 days ago | IN | 0 ETH | 0.00382598 | ||||
Unstake | 16322597 | 690 days ago | IN | 0 ETH | 0.00209388 | ||||
Unstake | 15992271 | 737 days ago | IN | 0 ETH | 0.00156156 | ||||
Unstake | 15988768 | 737 days ago | IN | 0 ETH | 0.00169056 | ||||
Unstake | 15905382 | 749 days ago | IN | 0 ETH | 0.00139763 | ||||
Stake | 15903504 | 749 days ago | IN | 0 ETH | 0.00215833 | ||||
Unstake | 15800483 | 763 days ago | IN | 0 ETH | 0.00385999 | ||||
Stake | 15800172 | 763 days ago | IN | 0 ETH | 0.00750465 | ||||
Unstake | 15668769 | 782 days ago | IN | 0 ETH | 0.00544935 | ||||
Unstake | 15664214 | 782 days ago | IN | 0 ETH | 0.00101672 | ||||
Unstake | 15614140 | 789 days ago | IN | 0 ETH | 0.00064086 | ||||
Unstake | 15599946 | 791 days ago | IN | 0 ETH | 0.00167568 | ||||
Unstake | 15580506 | 794 days ago | IN | 0 ETH | 0.00063981 | ||||
Unstake | 15572942 | 795 days ago | IN | 0 ETH | 0.00105578 | ||||
Stake | 15540322 | 800 days ago | IN | 0 ETH | 0.00285227 | ||||
Stake | 15536065 | 800 days ago | IN | 0 ETH | 0.00318013 | ||||
Unstake | 15522104 | 803 days ago | IN | 0 ETH | 0.00202325 | ||||
Unstake | 15467164 | 812 days ago | IN | 0 ETH | 0.00089596 | ||||
Unstake | 15306121 | 837 days ago | IN | 0 ETH | 0.00147413 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BeachBumStaking
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-11 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 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 `IERC721.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 v4.4.1 (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; /** * @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}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: interfaces/IMintableERC20.sol pragma solidity =0.8.10; /** * @notice ERC20-compliant interface with added * function for minting new tokens to addresses * * See {IERC20} */ interface IMintableERC20 is IERC20 { /** * @dev Allows issuing new tokens to an address * * @dev Should have restricted access */ function mint(address _to, uint256 _amount) external; } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * 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[EIP 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 v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 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`, checking first that contract recipients * are aware of the ERC721 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @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); /** * @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; } // File: BeachBumStaking.sol pragma solidity =0.8.10; /** * @notice Staking contract that allows NFT users * to temporarily lock their NFTs to earn * ERC-20 token rewards * * The NFTs are locked inside this contract for the * duration of the staking period while allowing the * user to unstake at any time * * While the NFTs are staked, they are technically * owned by this contract and cannot be moved or placed * on any marketplace * * The contract allows users to stake and unstake multiple * NFTs efficiently, in one transaction * * Staking rewards are paid out to users once * they unstake their NFTs and are calculated * based on a rounded down number of days the NFTs * were staken for * * Some of the rarest NFTs are boosted by the contract * owner to receive bigger staking rewards * * @dev Features a contract owner that is able to change * the daily rewards, the boosted NFT list and the * boosted NFT daily rewards */ contract BeachBumStaking is ERC721Holder, Ownable { using EnumerableSet for EnumerableSet.UintSet; /** * @notice Stores the ERC-20 token that will * be paid out to NFT holders for staking */ IMintableERC20 public immutable erc20; /** * @notice Stores the ERC-721 token that will * be staken to receive ERC-20 rewards */ IERC721 public immutable erc721; /** * @notice Amount of tokens earned for each * day (24 hours) the token was staked for * * @dev Can be changed by contract owner via setDailyRewards() */ uint128 public dailyRewards; /** * @notice Some NFTs are boosted to receive bigger token * rewards. This multiplier shows how much more * they will receive * * E.g. dailyRewardBoostMultiplier = 10 means that the boosted * NFTs will receive 10 times the dailyRewards * * @dev Can be changed by contract owner via setDailyRewardBoostMultiplier() */ uint128 public dailyRewardBoostMultiplier; /** * @notice Boosted NFTs contained in this list * earn bigger daily rewards * * @dev We use an EnumerableSet to store this data * instead of an array to be able to query in * O(1) complexity * ** @dev Can be changed by contract owner via setBoostedNftIds() */ EnumerableSet.UintSet private boostedNftIds; /** * @notice Stores ownership information for staked * NFTs */ mapping(uint256 => address) public ownerOf; /** * @notice Stores time staking started for staked * NFTs */ mapping(uint256 => uint256) public stakedAt; /** * @dev Stores the staked tokens of an address */ mapping(address => EnumerableSet.UintSet) private stakedTokens; /** * @dev Smart contract unique identifier, a random number * * @dev Should be regenerated each time smart contact source code is changed * and changes smart contract itself is to be redeployed * * @dev Generated using https://www.random.org/bytes/ */ uint256 public constant UID = 0x78ea82e97e97cd54405b116b0209cbaf8bcb22911b5ad1045e81ea6caf7d47fa; /** * @dev Sets initialization variables which cannot be * changed in the future * * @param _erc20Address address of erc20 rewards token * @param _erc721Address address of erc721 token to be staken for rewards * @param _dailyRewards daily amount of tokens to be paid to stakers for every day * they have staken an NFT * @param _boostedNftIds boosted NFTs receive bigger rewards * @param _dailyRewardBoostMultiplier multiplier of rewards for boosted NFTs */ constructor( address _erc20Address, address _erc721Address, uint128 _dailyRewards, uint256[] memory _boostedNftIds, uint128 _dailyRewardBoostMultiplier ) { erc20 = IMintableERC20(_erc20Address); erc721 = IERC721(_erc721Address); setDailyRewards(_dailyRewards); setBoostedNftIds(_boostedNftIds); setDailyRewardBoostMultiplier(_dailyRewardBoostMultiplier); } /** * @dev Emitted every time a token is staked * * Emitted in stake() * * @param by address that staked the NFT * @param time block timestamp the NFT were staked at * @param tokenId token ID of NFT that was staken */ event Staked(address indexed by, uint256 indexed tokenId, uint256 time); /** * @dev Emitted every time a token is unstaked * * Emitted in unstake() * * @param by address that unstaked the NFT * @param time block timestamp the NFT were staked at * @param tokenId token ID of NFT that was unstaken * @param stakedAt when the NFT initially staked at * @param reward how many tokens user got for the * staking of the NFT */ event Unstaked(address indexed by, uint256 indexed tokenId, uint256 time, uint256 stakedAt, uint256 reward); /** * @dev Emitted when the boosted NFT ids is changed * * Emitted in setDailyReward() * * @param by address that changed the daily reward * @param oldDailyRewards old daily reward * @param newDailyRewards new daily reward in effect */ event DailyRewardsChanged(address indexed by, uint128 oldDailyRewards, uint128 newDailyRewards); /** * @dev Emitted when the boosted NFT daily reward * multiplier is changed * * Emitted in setDailyRewardBoostMultiplier() * * @param by address that changed the daily reward boost multiplier * @param oldDailyRewardBoostMultiplier old daily reward boost multiplier * @param newDailyRewardBoostMultiplier new daily reward boost multiplier */ event DailyRewardBoostMultiplierChanged( address indexed by, uint128 oldDailyRewardBoostMultiplier, uint128 newDailyRewardBoostMultiplier ); /** * @dev Emitted when the boosted NFT ids change * * Emitted in setBoostedNftIds() * * @param by address that changed the boosted NFT ids * @param oldBoostedNftIds old boosted NFT ids * @param newBoostedNftIds new boosted NFT ids */ event BoostedNftIdsChanged(address indexed by, uint256[] oldBoostedNftIds, uint256[] newBoostedNftIds); /** * @notice Checks whether a token is boosted to receive * bigger staking rewards * * @param _tokenId ID of token to check * @return whether the token is boosted */ function isBoostedToken(uint256 _tokenId) public view returns (bool) { return boostedNftIds.contains(_tokenId); } /** * @notice Changes the daily reward in erc20 tokens received * for every NFT staked * * @dev Restricted to contract owner * * @param _newDailyRewards the new daily reward in erc20 tokens */ function setDailyRewards(uint128 _newDailyRewards) public onlyOwner { // Emit event emit DailyRewardsChanged(msg.sender, dailyRewards, _newDailyRewards); // Change storage variable dailyRewards = _newDailyRewards; } /** * @notice Changes the daily reward boost multiplier for * boosted NFTs * * @dev Restricted to contract owner * * @param _newDailyRewardBoostMultiplier the new daily reward boost multiplier */ function setDailyRewardBoostMultiplier(uint128 _newDailyRewardBoostMultiplier) public onlyOwner { // Emit event emit DailyRewardBoostMultiplierChanged(msg.sender, dailyRewardBoostMultiplier, _newDailyRewardBoostMultiplier); // Change storage variable dailyRewardBoostMultiplier = _newDailyRewardBoostMultiplier; } /** * @notice Changes the boosted NFT ids that receive * a bigger daily reward * * @dev Restricted to contract owner * * @param _newBoostedNftIds the new boosted NFT ids */ function setBoostedNftIds(uint256[] memory _newBoostedNftIds) public onlyOwner { // Create array to store old boosted NFTs and emit // event later uint256[] memory oldBoostedNftIds = new uint256[](boostedNftIds.length()); // Empty boosted NFT ids set for (uint256 i = 0; boostedNftIds.length() > 0; i++) { // Get a value from the set // Since set length is > 0 it is guaranteed // that there is a value at index 0 uint256 value = boostedNftIds.at(0); // Remove the value boostedNftIds.remove(value); // Store the value to the old boosted NFT ids // list to later emit event oldBoostedNftIds[i] = value; } // Emit event emit BoostedNftIdsChanged(msg.sender, oldBoostedNftIds, _newBoostedNftIds); // Enumerate new boosted NFT ids for (uint256 i = 0; i < _newBoostedNftIds.length; i++) { uint256 boostedNftId = _newBoostedNftIds[i]; // Add boosted NFT id to set boostedNftIds.add(boostedNftId); } } /** * @notice Calculates all the NFTs currently staken by * an address * * @dev This is an auxiliary function to help with integration * and is not used anywhere in the smart contract login * * @param _owner address to search staked tokens of * @return an array of token IDs of NFTs that are currently staken */ function tokensStakedByOwner(address _owner) external view returns (uint256[] memory) { // Cache the length of the staked tokens set for the owner uint256 stakedTokensLength = stakedTokens[_owner].length(); // Create an empty array to store the result // Should be the same length as the staked tokens // set uint256[] memory tokenIds = new uint256[](stakedTokensLength); // Copy set values to array for (uint256 i = 0; i < stakedTokensLength; i++) { tokenIds[i] = stakedTokens[_owner].at(i); } // Return array result return tokenIds; } /** * @notice Calculates the rewards that would be earned by * the user for each an NFT if he was to unstake it at * the current block * * @param _tokenId token ID of NFT rewards are to be calculated for * @return the amount of rewards for the input staken NFT */ function currentRewardsOf(uint256 _tokenId) public view returns (uint256) { // Verify NFT is staked require(stakedAt[_tokenId] != 0, "not staked"); // Get current token ID staking time by calculating the // delta between the current block time(`block.timestamp`) // and the time the token was initially staked(`stakedAt[tokenId]`) uint256 stakingTime = block.timestamp - stakedAt[_tokenId]; // `stakingTime` is the staking time in seconds // Calculate the staking time in days by: // * dividing by 60 (seconds in a minute) // * dividing by 60 (minutes in an hour) // * dividing by 24 (hours in a day) // This will yield the (rounded down) staking // time in days uint256 stakingDays = stakingTime / 60 / 60 / 24; // Calculate reward for token by multiplying // rounded down number of staked days by daily // rewards variable uint256 reward = stakingDays * dailyRewards; // If the NFT is boosted if (isBoostedToken(_tokenId)) { // Multiply the reward reward *= dailyRewardBoostMultiplier; } // Return reward return reward; } /** * @notice Stake NFTs to start earning ERC-20 * token rewards * * The ERC-20 token rewards will be paid out * when the NFTs are unstaken * * @dev Sender must first approve this contract * to transfer NFTs on his behalf and NFT * ownership is transferred to this contract * for the duration of the staking * * @param _tokenIds token IDs of NFTs to be staken */ function stake(uint256[] memory _tokenIds) public { // Ensure at least one token ID was sent require(_tokenIds.length > 0, "no token IDs sent"); // Enumerate sent token IDs for (uint256 i = 0; i < _tokenIds.length; i++) { // Get token ID uint256 tokenId = _tokenIds[i]; // Store NFT owner ownerOf[tokenId] = msg.sender; // Add NFT to owner staked tokens stakedTokens[msg.sender].add(tokenId); // Store staking time as block timestamp the // the transaction was confirmed in stakedAt[tokenId] = block.timestamp; // Transfer token to staking contract // Will fail if the user does not own the // token or has not approved the staking // contract for transferring tokens on his // behalf erc721.safeTransferFrom(msg.sender, address(this), tokenId, ""); // Emit event emit Staked(msg.sender, tokenId, stakedAt[tokenId]); } } /** * @notice Unstake NFTs to receive ERC-20 token rewards * * @dev Sender must have first staken the NFTs * * @param _tokenIds token IDs of NFTs to be unstaken */ function unstake(uint256[] memory _tokenIds) public { // Ensure at least one token ID was sent require(_tokenIds.length > 0, "no token IDs sent"); // Create a variable to store the total rewards for all // NFTs sent uint256 totalRewards = 0; // Enumerate sent token IDs for (uint256 i = 0; i < _tokenIds.length; i++) { // Get token ID uint256 tokenId = _tokenIds[i]; // Verify sender is token ID owner // Will fail if token is not staked (owner is 0x0) require(ownerOf[tokenId] == msg.sender, "not token owner"); // Calculate rewards for token ID. Will revert // if the token is not staken uint256 rewards = currentRewardsOf(tokenId); // Increase amount of total rewards // for all tokens sent totalRewards += rewards; // Emit event emit Unstaked(msg.sender, tokenId, block.timestamp, stakedAt[tokenId], rewards); // Reset `ownerOf` and `stakedAt` // for token ownerOf[tokenId] = address(0); stakedAt[tokenId] = 0; // Remove NFT from owner staked tokens stakedTokens[msg.sender].remove(tokenId); // Transfer NFT back to user erc721.transferFrom(address(this), msg.sender, tokenId); } // Mint total rewards for all sent NFTs // to user erc20.mint(msg.sender, totalRewards); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_erc20Address","type":"address"},{"internalType":"address","name":"_erc721Address","type":"address"},{"internalType":"uint128","name":"_dailyRewards","type":"uint128"},{"internalType":"uint256[]","name":"_boostedNftIds","type":"uint256[]"},{"internalType":"uint128","name":"_dailyRewardBoostMultiplier","type":"uint128"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"oldBoostedNftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"newBoostedNftIds","type":"uint256[]"}],"name":"BoostedNftIdsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint128","name":"oldDailyRewardBoostMultiplier","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newDailyRewardBoostMultiplier","type":"uint128"}],"name":"DailyRewardBoostMultiplierChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint128","name":"oldDailyRewards","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newDailyRewards","type":"uint128"}],"name":"DailyRewardsChanged","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":"by","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"UID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"currentRewardsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyRewardBoostMultiplier","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyRewards","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IMintableERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc721","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isBoostedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_newBoostedNftIds","type":"uint256[]"}],"name":"setBoostedNftIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newDailyRewardBoostMultiplier","type":"uint128"}],"name":"setDailyRewardBoostMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newDailyRewards","type":"uint128"}],"name":"setDailyRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensStakedByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040516200328c3803806200328c833981810160405281019062000037919062000baa565b620000576200004b620000fd60201b60201c565b6200010560201b60201c565b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620000d083620001c960201b60201c565b620000e1826200030460201b60201c565b620000f2816200054d60201b60201c565b505050505062000f31565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001d9620000fd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620001ff6200068860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000258576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200024f9062000cb2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3bfbf35c57ea09408247d86ad23260a3590e9c1dac5c2152fc895d7b67e4ad5f600160009054906101000a90046fffffffffffffffffffffffffffffffff1683604051620002c092919062000ce5565b60405180910390a280600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b62000314620000fd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033a6200068860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038a9062000cb2565b60405180910390fd5b6000620003ac6002620006b160201b620012e81760201c565b67ffffffffffffffff811115620003c857620003c762000a10565b5b604051908082528060200260200182016040528015620003f75781602001602082028036833780820191505090505b50905060005b6000620004166002620006b160201b620012e81760201c565b1115620004935760006200043b60006002620006ce60201b620012fd1790919060201c565b905062000458816002620006f060201b620013171790919060201c565b508083838151811062000470576200046f62000d12565b5b6020026020010181815250505080806200048a9062000d70565b915050620003fd565b503373ffffffffffffffffffffffffffffffffffffffff167f2b64405b2f240f38e5ff3949e6f0e1b2cc5d92b9fe1a6a234d052ad95dec253a8284604051620004de92919062000e8c565b60405180910390a260005b8251811015620005485760008382815181106200050b576200050a62000d12565b5b60200260200101519050620005308160026200071260201b620013311790919060201c565b505080806200053f9062000d70565b915050620004e9565b505050565b6200055d620000fd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005836200068860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d39062000cb2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f53a4ad96b204073ea302be0cfa5c10ed97a61b1b540a15614777fd915489b282600160109054906101000a90046fffffffffffffffffffffffffffffffff16836040516200064492919062000ce5565b60405180910390a280600160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000620006c7826000016200073460201b60201c565b9050919050565b6000620006e583600001836200074560201b60201c565b60001c905092915050565b60006200070a836000018360001b6200077360201b60201c565b905092915050565b60006200072c836000018360001b6200089760201b60201c565b905092915050565b600081600001805490509050919050565b600082600001828154811062000760576200075f62000d12565b5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020549050600081146200088b576000600182620007a8919062000ec7565b9050600060018660000180549050620007c2919062000ec7565b905081811462000838576000866000018281548110620007e757620007e662000d12565b5b90600052602060002001549050808760000184815481106200080e576200080d62000d12565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806200084f576200084e62000f02565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000891565b60009150505b92915050565b6000620008ab83836200091160201b60201c565b620009065782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200090b565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009758262000948565b9050919050565b620009878162000968565b81146200099357600080fd5b50565b600081519050620009a7816200097c565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b620009d481620009ad565b8114620009e057600080fd5b50565b600081519050620009f481620009c9565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000a4a82620009ff565b810181811067ffffffffffffffff8211171562000a6c5762000a6b62000a10565b5b80604052505050565b600062000a8162000934565b905062000a8f828262000a3f565b919050565b600067ffffffffffffffff82111562000ab25762000ab162000a10565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b62000add8162000ac8565b811462000ae957600080fd5b50565b60008151905062000afd8162000ad2565b92915050565b600062000b1a62000b148462000a94565b62000a75565b9050808382526020820190506020840283018581111562000b405762000b3f62000ac3565b5b835b8181101562000b6d578062000b58888262000aec565b84526020840193505060208101905062000b42565b5050509392505050565b600082601f83011262000b8f5762000b8e620009fa565b5b815162000ba184826020860162000b03565b91505092915050565b600080600080600060a0868803121562000bc95762000bc86200093e565b5b600062000bd98882890162000996565b955050602062000bec8882890162000996565b945050604062000bff88828901620009e3565b935050606086015167ffffffffffffffff81111562000c235762000c2262000943565b5b62000c318882890162000b77565b925050608062000c4488828901620009e3565b9150509295509295909350565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c9a60208362000c51565b915062000ca78262000c62565b602082019050919050565b6000602082019050818103600083015262000ccd8162000c8b565b9050919050565b62000cdf81620009ad565b82525050565b600060408201905062000cfc600083018562000cd4565b62000d0b602083018462000cd4565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d7d8262000ac8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000db35762000db262000d41565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62000df58162000ac8565b82525050565b600062000e09838362000dea565b60208301905092915050565b6000602082019050919050565b600062000e2f8262000dbe565b62000e3b818562000dc9565b935062000e488362000dda565b8060005b8381101562000e7f57815162000e63888262000dfb565b975062000e708362000e15565b92505060018101905062000e4c565b5085935050505092915050565b6000604082019050818103600083015262000ea8818562000e22565b9050818103602083015262000ebe818462000e22565b90509392505050565b600062000ed48262000ac8565b915062000ee18362000ac8565b92508282101562000ef75762000ef662000d41565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60805160a05161232062000f6c6000396000818161060c01528181610ce301526110bc015260008181610b58015261116101526123206000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063785e9e86116100ad578063c8bfef7711610071578063c8bfef771461030a578063dc554e4014610328578063dc5d2c9814610358578063e449f34114610374578063f2fde38b1461039057610121565b8063785e9e86146102645780638da5cb5b14610282578063a8acbad5146102a0578063b1449dee146102d0578063bca6ce64146102ec57610121565b806348d8f3e8116100f457806348d8f3e8146101be5780634e692783146101dc5780635cc99e351461020c5780636352211e1461022a578063715018a61461025a57610121565b8063030f04b8146101265780630fbf0a9314610156578063150b7a021461017257806317483142146101a2575b600080fd5b610140600480360381019061013b9190611686565b6103ac565b60405161014d919061177b565b60405180910390f35b610170600480360381019061016b9190611922565b6104df565b005b61018c60048036038101906101879190611a20565b610713565b6040516101999190611ade565b60405180910390f35b6101bc60048036038101906101b79190611922565b610727565b005b6101c661091a565b6040516101d39190611b24565b60405180910390f35b6101f660048036038101906101f19190611b3f565b61093c565b6040516102039190611b7b565b60405180910390f35b610214610a77565b6040516102219190611b7b565b60405180910390f35b610244600480360381019061023f9190611b3f565b610a9b565b6040516102519190611ba5565b60405180910390f35b610262610ace565b005b61026c610b56565b6040516102799190611c1f565b60405180910390f35b61028a610b7a565b6040516102979190611ba5565b60405180910390f35b6102ba60048036038101906102b59190611b3f565b610ba3565b6040516102c79190611b7b565b60405180910390f35b6102ea60048036038101906102e59190611c66565b610bbb565b005b6102f4610ce1565b6040516103019190611cb4565b60405180910390f35b610312610d05565b60405161031f9190611b24565b60405180910390f35b610342600480360381019061033d9190611b3f565b610d27565b60405161034f9190611cea565b60405180910390f35b610372600480360381019061036d9190611c66565b610d44565b005b61038e60048036038101906103899190611922565b610e6a565b005b6103aa60048036038101906103a59190611686565b6111f0565b005b606060006103f7600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206112e8565b905060008167ffffffffffffffff811115610415576104146117b3565b5b6040519080825280602002602001820160405280156104435781602001602082028036833780820191505090505b50905060005b828110156104d4576104a281600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206112fd90919063ffffffff16565b8282815181106104b5576104b4611d05565b5b60200260200101818152505080806104cc90611d63565b915050610449565b508092505050919050565b6000815111610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051a90611e09565b60405180910390fd5b60005b815181101561070f57600082828151811061054457610543611d05565b5b60200260200101519050336004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506105f181600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061133190919063ffffffff16565b504260056000838152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3330846040518463ffffffff1660e01b815260040161066793929190611e60565b600060405180830381600087803b15801561068157600080fd5b505af1158015610695573d6000803e3d6000fd5b50505050803373ffffffffffffffffffffffffffffffffffffffff167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9060056000858152602001908152602001600020546040516106f39190611b7b565b60405180910390a350808061070790611d63565b915050610526565b5050565b600063150b7a0260e01b9050949350505050565b61072f61134b565b73ffffffffffffffffffffffffffffffffffffffff1661074d610b7a565b73ffffffffffffffffffffffffffffffffffffffff16146107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90611ef6565b60405180910390fd5b60006107af60026112e8565b67ffffffffffffffff8111156107c8576107c76117b3565b5b6040519080825280602002602001820160405280156107f65781602001602082028036833780820191505090505b50905060005b600061080860026112e8565b1115610870576000610825600060026112fd90919063ffffffff16565b905061083b81600261131790919063ffffffff16565b50808383815181106108505761084f611d05565b5b60200260200101818152505050808061086890611d63565b9150506107fc565b503373ffffffffffffffffffffffffffffffffffffffff167f2b64405b2f240f38e5ff3949e6f0e1b2cc5d92b9fe1a6a234d052ad95dec253a82846040516108b9929190611f16565b60405180910390a260005b82518110156109155760008382815181106108e2576108e1611d05565b5b6020026020010151905061090081600261133190919063ffffffff16565b5050808061090d90611d63565b9150506108c4565b505050565b600160109054906101000a90046fffffffffffffffffffffffffffffffff1681565b60008060056000848152602001908152602001600020541415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90611f99565b60405180910390fd5b60006005600084815260200190815260200160002054426109b59190611fb9565b905060006018603c80846109c9919061201c565b6109d3919061201c565b6109dd919061201c565b90506000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610a1d919061204d565b9050610a2885610d27565b15610a6c57600160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681610a69919061204d565b90505b809350505050919050565b7f78ea82e97e97cd54405b116b0209cbaf8bcb22911b5ad1045e81ea6caf7d47fa81565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ad661134b565b73ffffffffffffffffffffffffffffffffffffffff16610af4610b7a565b73ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190611ef6565b60405180910390fd5b610b546000611353565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b610bc361134b565b73ffffffffffffffffffffffffffffffffffffffff16610be1610b7a565b73ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90611ef6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3bfbf35c57ea09408247d86ad23260a3590e9c1dac5c2152fc895d7b67e4ad5f600160009054906101000a90046fffffffffffffffffffffffffffffffff1683604051610c9d9291906120a7565b60405180910390a280600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000610d3d82600261141790919063ffffffff16565b9050919050565b610d4c61134b565b73ffffffffffffffffffffffffffffffffffffffff16610d6a610b7a565b73ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790611ef6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f53a4ad96b204073ea302be0cfa5c10ed97a61b1b540a15614777fd915489b282600160109054906101000a90046fffffffffffffffffffffffffffffffff1683604051610e269291906120a7565b60405180910390a280600160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000815111610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea590611e09565b60405180910390fd5b6000805b825181101561115e576000838281518110610ed057610ecf611d05565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f729061211c565b60405180910390fd5b6000610f868261093c565b90508084610f94919061213c565b9350813373ffffffffffffffffffffffffffffffffffffffff167fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e96242600560008781526020019081526020016000205485604051610ff493929190612192565b60405180910390a360006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060056000848152602001908152602001600020819055506110b982600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061131790919063ffffffff16565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b8152600401611117939291906121c9565b600060405180830381600087803b15801561113157600080fd5b505af1158015611145573d6000803e3d6000fd5b505050505050808061115690611d63565b915050610eb2565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b81526004016111ba929190612200565b600060405180830381600087803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b505050505050565b6111f861134b565b73ffffffffffffffffffffffffffffffffffffffff16611216610b7a565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126390611ef6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d39061229b565b60405180910390fd5b6112e581611353565b50565b60006112f682600001611431565b9050919050565b600061130c8360000183611442565b60001c905092915050565b6000611329836000018360001b61146d565b905092915050565b6000611343836000018360001b611581565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611429836000018360001b6115f1565b905092915050565b600081600001805490509050919050565b600082600001828154811061145a57611459611d05565b5b9060005260206000200154905092915050565b6000808360010160008481526020019081526020016000205490506000811461157557600060018261149f9190611fb9565b90506000600186600001805490506114b79190611fb9565b90508181146115265760008660000182815481106114d8576114d7611d05565b5b90600052602060002001549050808760000184815481106114fc576114fb611d05565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061153a576115396122bb565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061157b565b60009150505b92915050565b600061158d83836115f1565b6115e65782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506115eb565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061165382611628565b9050919050565b61166381611648565b811461166e57600080fd5b50565b6000813590506116808161165a565b92915050565b60006020828403121561169c5761169b61161e565b5b60006116aa84828501611671565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6116f2816116df565b82525050565b600061170483836116e9565b60208301905092915050565b6000602082019050919050565b6000611728826116b3565b61173281856116be565b935061173d836116cf565b8060005b8381101561176e57815161175588826116f8565b975061176083611710565b925050600181019050611741565b5085935050505092915050565b60006020820190508181036000830152611795818461171d565b905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117eb826117a2565b810181811067ffffffffffffffff8211171561180a576118096117b3565b5b80604052505050565b600061181d611614565b905061182982826117e2565b919050565b600067ffffffffffffffff821115611849576118486117b3565b5b602082029050602081019050919050565b600080fd5b611868816116df565b811461187357600080fd5b50565b6000813590506118858161185f565b92915050565b600061189e6118998461182e565b611813565b905080838252602082019050602084028301858111156118c1576118c061185a565b5b835b818110156118ea57806118d68882611876565b8452602084019350506020810190506118c3565b5050509392505050565b600082601f8301126119095761190861179d565b5b813561191984826020860161188b565b91505092915050565b6000602082840312156119385761193761161e565b5b600082013567ffffffffffffffff81111561195657611955611623565b5b611962848285016118f4565b91505092915050565b600080fd5b600067ffffffffffffffff82111561198b5761198a6117b3565b5b611994826117a2565b9050602081019050919050565b82818337600083830152505050565b60006119c36119be84611970565b611813565b9050828152602081018484840111156119df576119de61196b565b5b6119ea8482856119a1565b509392505050565b600082601f830112611a0757611a0661179d565b5b8135611a178482602086016119b0565b91505092915050565b60008060008060808587031215611a3a57611a3961161e565b5b6000611a4887828801611671565b9450506020611a5987828801611671565b9350506040611a6a87828801611876565b925050606085013567ffffffffffffffff811115611a8b57611a8a611623565b5b611a97878288016119f2565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ad881611aa3565b82525050565b6000602082019050611af36000830184611acf565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611b1e81611af9565b82525050565b6000602082019050611b396000830184611b15565b92915050565b600060208284031215611b5557611b5461161e565b5b6000611b6384828501611876565b91505092915050565b611b75816116df565b82525050565b6000602082019050611b906000830184611b6c565b92915050565b611b9f81611648565b82525050565b6000602082019050611bba6000830184611b96565b92915050565b6000819050919050565b6000611be5611be0611bdb84611628565b611bc0565b611628565b9050919050565b6000611bf782611bca565b9050919050565b6000611c0982611bec565b9050919050565b611c1981611bfe565b82525050565b6000602082019050611c346000830184611c10565b92915050565b611c4381611af9565b8114611c4e57600080fd5b50565b600081359050611c6081611c3a565b92915050565b600060208284031215611c7c57611c7b61161e565b5b6000611c8a84828501611c51565b91505092915050565b6000611c9e82611bec565b9050919050565b611cae81611c93565b82525050565b6000602082019050611cc96000830184611ca5565b92915050565b60008115159050919050565b611ce481611ccf565b82525050565b6000602082019050611cff6000830184611cdb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611d6e826116df565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611da157611da0611d34565b5b600182019050919050565b600082825260208201905092915050565b7f6e6f20746f6b656e204944732073656e74000000000000000000000000000000600082015250565b6000611df3601183611dac565b9150611dfe82611dbd565b602082019050919050565b60006020820190508181036000830152611e2281611de6565b9050919050565b600082825260208201905092915050565b50565b6000611e4a600083611e29565b9150611e5582611e3a565b600082019050919050565b6000608082019050611e756000830186611b96565b611e826020830185611b96565b611e8f6040830184611b6c565b8181036060830152611ea081611e3d565b9050949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ee0602083611dac565b9150611eeb82611eaa565b602082019050919050565b60006020820190508181036000830152611f0f81611ed3565b9050919050565b60006040820190508181036000830152611f30818561171d565b90508181036020830152611f44818461171d565b90509392505050565b7f6e6f74207374616b656400000000000000000000000000000000000000000000600082015250565b6000611f83600a83611dac565b9150611f8e82611f4d565b602082019050919050565b60006020820190508181036000830152611fb281611f76565b9050919050565b6000611fc4826116df565b9150611fcf836116df565b925082821015611fe257611fe1611d34565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612027826116df565b9150612032836116df565b92508261204257612041611fed565b5b828204905092915050565b6000612058826116df565b9150612063836116df565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561209c5761209b611d34565b5b828202905092915050565b60006040820190506120bc6000830185611b15565b6120c96020830184611b15565b9392505050565b7f6e6f7420746f6b656e206f776e65720000000000000000000000000000000000600082015250565b6000612106600f83611dac565b9150612111826120d0565b602082019050919050565b60006020820190508181036000830152612135816120f9565b9050919050565b6000612147826116df565b9150612152836116df565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561218757612186611d34565b5b828201905092915050565b60006060820190506121a76000830186611b6c565b6121b46020830185611b6c565b6121c16040830184611b6c565b949350505050565b60006060820190506121de6000830186611b96565b6121eb6020830185611b96565b6121f86040830184611b6c565b949350505050565b60006040820190506122156000830185611b96565b6122226020830184611b6c565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612285602683611dac565b915061229082612229565b604082019050919050565b600060208201905081810360008301526122b481612278565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c870cd3ed2db8209bcb5f9bb906dc44a8b41f837086236a540ffdbbcd4b02d2c64736f6c634300080a0033000000000000000000000000095bd29ed88fc248cca33e7b436ba626e239d79f000000000000000000000000bd6038c4bb496e0ea4d67115a927bdcfb99cdc110000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063785e9e86116100ad578063c8bfef7711610071578063c8bfef771461030a578063dc554e4014610328578063dc5d2c9814610358578063e449f34114610374578063f2fde38b1461039057610121565b8063785e9e86146102645780638da5cb5b14610282578063a8acbad5146102a0578063b1449dee146102d0578063bca6ce64146102ec57610121565b806348d8f3e8116100f457806348d8f3e8146101be5780634e692783146101dc5780635cc99e351461020c5780636352211e1461022a578063715018a61461025a57610121565b8063030f04b8146101265780630fbf0a9314610156578063150b7a021461017257806317483142146101a2575b600080fd5b610140600480360381019061013b9190611686565b6103ac565b60405161014d919061177b565b60405180910390f35b610170600480360381019061016b9190611922565b6104df565b005b61018c60048036038101906101879190611a20565b610713565b6040516101999190611ade565b60405180910390f35b6101bc60048036038101906101b79190611922565b610727565b005b6101c661091a565b6040516101d39190611b24565b60405180910390f35b6101f660048036038101906101f19190611b3f565b61093c565b6040516102039190611b7b565b60405180910390f35b610214610a77565b6040516102219190611b7b565b60405180910390f35b610244600480360381019061023f9190611b3f565b610a9b565b6040516102519190611ba5565b60405180910390f35b610262610ace565b005b61026c610b56565b6040516102799190611c1f565b60405180910390f35b61028a610b7a565b6040516102979190611ba5565b60405180910390f35b6102ba60048036038101906102b59190611b3f565b610ba3565b6040516102c79190611b7b565b60405180910390f35b6102ea60048036038101906102e59190611c66565b610bbb565b005b6102f4610ce1565b6040516103019190611cb4565b60405180910390f35b610312610d05565b60405161031f9190611b24565b60405180910390f35b610342600480360381019061033d9190611b3f565b610d27565b60405161034f9190611cea565b60405180910390f35b610372600480360381019061036d9190611c66565b610d44565b005b61038e60048036038101906103899190611922565b610e6a565b005b6103aa60048036038101906103a59190611686565b6111f0565b005b606060006103f7600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206112e8565b905060008167ffffffffffffffff811115610415576104146117b3565b5b6040519080825280602002602001820160405280156104435781602001602082028036833780820191505090505b50905060005b828110156104d4576104a281600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206112fd90919063ffffffff16565b8282815181106104b5576104b4611d05565b5b60200260200101818152505080806104cc90611d63565b915050610449565b508092505050919050565b6000815111610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051a90611e09565b60405180910390fd5b60005b815181101561070f57600082828151811061054457610543611d05565b5b60200260200101519050336004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506105f181600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061133190919063ffffffff16565b504260056000838152602001908152602001600020819055507f000000000000000000000000bd6038c4bb496e0ea4d67115a927bdcfb99cdc1173ffffffffffffffffffffffffffffffffffffffff1663b88d4fde3330846040518463ffffffff1660e01b815260040161066793929190611e60565b600060405180830381600087803b15801561068157600080fd5b505af1158015610695573d6000803e3d6000fd5b50505050803373ffffffffffffffffffffffffffffffffffffffff167f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9060056000858152602001908152602001600020546040516106f39190611b7b565b60405180910390a350808061070790611d63565b915050610526565b5050565b600063150b7a0260e01b9050949350505050565b61072f61134b565b73ffffffffffffffffffffffffffffffffffffffff1661074d610b7a565b73ffffffffffffffffffffffffffffffffffffffff16146107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90611ef6565b60405180910390fd5b60006107af60026112e8565b67ffffffffffffffff8111156107c8576107c76117b3565b5b6040519080825280602002602001820160405280156107f65781602001602082028036833780820191505090505b50905060005b600061080860026112e8565b1115610870576000610825600060026112fd90919063ffffffff16565b905061083b81600261131790919063ffffffff16565b50808383815181106108505761084f611d05565b5b60200260200101818152505050808061086890611d63565b9150506107fc565b503373ffffffffffffffffffffffffffffffffffffffff167f2b64405b2f240f38e5ff3949e6f0e1b2cc5d92b9fe1a6a234d052ad95dec253a82846040516108b9929190611f16565b60405180910390a260005b82518110156109155760008382815181106108e2576108e1611d05565b5b6020026020010151905061090081600261133190919063ffffffff16565b5050808061090d90611d63565b9150506108c4565b505050565b600160109054906101000a90046fffffffffffffffffffffffffffffffff1681565b60008060056000848152602001908152602001600020541415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90611f99565b60405180910390fd5b60006005600084815260200190815260200160002054426109b59190611fb9565b905060006018603c80846109c9919061201c565b6109d3919061201c565b6109dd919061201c565b90506000600160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610a1d919061204d565b9050610a2885610d27565b15610a6c57600160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681610a69919061204d565b90505b809350505050919050565b7f78ea82e97e97cd54405b116b0209cbaf8bcb22911b5ad1045e81ea6caf7d47fa81565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610ad661134b565b73ffffffffffffffffffffffffffffffffffffffff16610af4610b7a565b73ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190611ef6565b60405180910390fd5b610b546000611353565b565b7f000000000000000000000000095bd29ed88fc248cca33e7b436ba626e239d79f81565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60056020528060005260406000206000915090505481565b610bc361134b565b73ffffffffffffffffffffffffffffffffffffffff16610be1610b7a565b73ffffffffffffffffffffffffffffffffffffffff1614610c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2e90611ef6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f3bfbf35c57ea09408247d86ad23260a3590e9c1dac5c2152fc895d7b67e4ad5f600160009054906101000a90046fffffffffffffffffffffffffffffffff1683604051610c9d9291906120a7565b60405180910390a280600160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000bd6038c4bb496e0ea4d67115a927bdcfb99cdc1181565b600160009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000610d3d82600261141790919063ffffffff16565b9050919050565b610d4c61134b565b73ffffffffffffffffffffffffffffffffffffffff16610d6a610b7a565b73ffffffffffffffffffffffffffffffffffffffff1614610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790611ef6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f53a4ad96b204073ea302be0cfa5c10ed97a61b1b540a15614777fd915489b282600160109054906101000a90046fffffffffffffffffffffffffffffffff1683604051610e269291906120a7565b60405180910390a280600160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b6000815111610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea590611e09565b60405180910390fd5b6000805b825181101561115e576000838281518110610ed057610ecf611d05565b5b602002602001015190503373ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f729061211c565b60405180910390fd5b6000610f868261093c565b90508084610f94919061213c565b9350813373ffffffffffffffffffffffffffffffffffffffff167fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e96242600560008781526020019081526020016000205485604051610ff493929190612192565b60405180910390a360006004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060056000848152602001908152602001600020819055506110b982600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061131790919063ffffffff16565b507f000000000000000000000000bd6038c4bb496e0ea4d67115a927bdcfb99cdc1173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b8152600401611117939291906121c9565b600060405180830381600087803b15801561113157600080fd5b505af1158015611145573d6000803e3d6000fd5b505050505050808061115690611d63565b915050610eb2565b507f000000000000000000000000095bd29ed88fc248cca33e7b436ba626e239d79f73ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b81526004016111ba929190612200565b600060405180830381600087803b1580156111d457600080fd5b505af11580156111e8573d6000803e3d6000fd5b505050505050565b6111f861134b565b73ffffffffffffffffffffffffffffffffffffffff16611216610b7a565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126390611ef6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d39061229b565b60405180910390fd5b6112e581611353565b50565b60006112f682600001611431565b9050919050565b600061130c8360000183611442565b60001c905092915050565b6000611329836000018360001b61146d565b905092915050565b6000611343836000018360001b611581565b905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000611429836000018360001b6115f1565b905092915050565b600081600001805490509050919050565b600082600001828154811061145a57611459611d05565b5b9060005260206000200154905092915050565b6000808360010160008481526020019081526020016000205490506000811461157557600060018261149f9190611fb9565b90506000600186600001805490506114b79190611fb9565b90508181146115265760008660000182815481106114d8576114d7611d05565b5b90600052602060002001549050808760000184815481106114fc576114fb611d05565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061153a576115396122bb565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061157b565b60009150505b92915050565b600061158d83836115f1565b6115e65782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506115eb565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061165382611628565b9050919050565b61166381611648565b811461166e57600080fd5b50565b6000813590506116808161165a565b92915050565b60006020828403121561169c5761169b61161e565b5b60006116aa84828501611671565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000819050919050565b6116f2816116df565b82525050565b600061170483836116e9565b60208301905092915050565b6000602082019050919050565b6000611728826116b3565b61173281856116be565b935061173d836116cf565b8060005b8381101561176e57815161175588826116f8565b975061176083611710565b925050600181019050611741565b5085935050505092915050565b60006020820190508181036000830152611795818461171d565b905092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117eb826117a2565b810181811067ffffffffffffffff8211171561180a576118096117b3565b5b80604052505050565b600061181d611614565b905061182982826117e2565b919050565b600067ffffffffffffffff821115611849576118486117b3565b5b602082029050602081019050919050565b600080fd5b611868816116df565b811461187357600080fd5b50565b6000813590506118858161185f565b92915050565b600061189e6118998461182e565b611813565b905080838252602082019050602084028301858111156118c1576118c061185a565b5b835b818110156118ea57806118d68882611876565b8452602084019350506020810190506118c3565b5050509392505050565b600082601f8301126119095761190861179d565b5b813561191984826020860161188b565b91505092915050565b6000602082840312156119385761193761161e565b5b600082013567ffffffffffffffff81111561195657611955611623565b5b611962848285016118f4565b91505092915050565b600080fd5b600067ffffffffffffffff82111561198b5761198a6117b3565b5b611994826117a2565b9050602081019050919050565b82818337600083830152505050565b60006119c36119be84611970565b611813565b9050828152602081018484840111156119df576119de61196b565b5b6119ea8482856119a1565b509392505050565b600082601f830112611a0757611a0661179d565b5b8135611a178482602086016119b0565b91505092915050565b60008060008060808587031215611a3a57611a3961161e565b5b6000611a4887828801611671565b9450506020611a5987828801611671565b9350506040611a6a87828801611876565b925050606085013567ffffffffffffffff811115611a8b57611a8a611623565b5b611a97878288016119f2565b91505092959194509250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ad881611aa3565b82525050565b6000602082019050611af36000830184611acf565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611b1e81611af9565b82525050565b6000602082019050611b396000830184611b15565b92915050565b600060208284031215611b5557611b5461161e565b5b6000611b6384828501611876565b91505092915050565b611b75816116df565b82525050565b6000602082019050611b906000830184611b6c565b92915050565b611b9f81611648565b82525050565b6000602082019050611bba6000830184611b96565b92915050565b6000819050919050565b6000611be5611be0611bdb84611628565b611bc0565b611628565b9050919050565b6000611bf782611bca565b9050919050565b6000611c0982611bec565b9050919050565b611c1981611bfe565b82525050565b6000602082019050611c346000830184611c10565b92915050565b611c4381611af9565b8114611c4e57600080fd5b50565b600081359050611c6081611c3a565b92915050565b600060208284031215611c7c57611c7b61161e565b5b6000611c8a84828501611c51565b91505092915050565b6000611c9e82611bec565b9050919050565b611cae81611c93565b82525050565b6000602082019050611cc96000830184611ca5565b92915050565b60008115159050919050565b611ce481611ccf565b82525050565b6000602082019050611cff6000830184611cdb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611d6e826116df565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611da157611da0611d34565b5b600182019050919050565b600082825260208201905092915050565b7f6e6f20746f6b656e204944732073656e74000000000000000000000000000000600082015250565b6000611df3601183611dac565b9150611dfe82611dbd565b602082019050919050565b60006020820190508181036000830152611e2281611de6565b9050919050565b600082825260208201905092915050565b50565b6000611e4a600083611e29565b9150611e5582611e3a565b600082019050919050565b6000608082019050611e756000830186611b96565b611e826020830185611b96565b611e8f6040830184611b6c565b8181036060830152611ea081611e3d565b9050949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ee0602083611dac565b9150611eeb82611eaa565b602082019050919050565b60006020820190508181036000830152611f0f81611ed3565b9050919050565b60006040820190508181036000830152611f30818561171d565b90508181036020830152611f44818461171d565b90509392505050565b7f6e6f74207374616b656400000000000000000000000000000000000000000000600082015250565b6000611f83600a83611dac565b9150611f8e82611f4d565b602082019050919050565b60006020820190508181036000830152611fb281611f76565b9050919050565b6000611fc4826116df565b9150611fcf836116df565b925082821015611fe257611fe1611d34565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612027826116df565b9150612032836116df565b92508261204257612041611fed565b5b828204905092915050565b6000612058826116df565b9150612063836116df565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561209c5761209b611d34565b5b828202905092915050565b60006040820190506120bc6000830185611b15565b6120c96020830184611b15565b9392505050565b7f6e6f7420746f6b656e206f776e65720000000000000000000000000000000000600082015250565b6000612106600f83611dac565b9150612111826120d0565b602082019050919050565b60006020820190508181036000830152612135816120f9565b9050919050565b6000612147826116df565b9150612152836116df565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561218757612186611d34565b5b828201905092915050565b60006060820190506121a76000830186611b6c565b6121b46020830185611b6c565b6121c16040830184611b6c565b949350505050565b60006060820190506121de6000830186611b96565b6121eb6020830185611b96565b6121f86040830184611b6c565b949350505050565b60006040820190506122156000830185611b96565b6122226020830184611b6c565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612285602683611dac565b915061229082612229565b604082019050919050565b600060208201905081810360008301526122b481612278565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220c870cd3ed2db8209bcb5f9bb906dc44a8b41f837086236a540ffdbbcd4b02d2c64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000095bd29ed88fc248cca33e7b436ba626e239d79f000000000000000000000000bd6038c4bb496e0ea4d67115a927bdcfb99cdc110000000000000000000000000000000000000000000000004563918244f4000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _erc20Address (address): 0x095bd29Ed88fc248cCA33E7b436ba626E239d79F
Arg [1] : _erc721Address (address): 0xbD6038C4bB496e0ea4D67115A927bDcfB99CDC11
Arg [2] : _dailyRewards (uint128): 5000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000095bd29ed88fc248cca33e7b436ba626e239d79f
Arg [1] : 000000000000000000000000bd6038c4bb496e0ea4d67115a927bdcfb99cdc11
Arg [2] : 0000000000000000000000000000000000000000000000004563918244f40000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
28017:13461:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36358:607;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38900:979;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17678:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34939:1049;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29028:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37282:1171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30138:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29532:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2639:103;;;:::i;:::-;;28239:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1988:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29667:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33902:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28396:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28621:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33543:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34383:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40076:1399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2897:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36358:607;36426:16;36515:26;36544:29;:12;:20;36557:6;36544:20;;;;;;;;;;;;;;;:27;:29::i;:::-;36515:58;;36699:25;36741:18;36727:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36699:61;;36807:9;36802:106;36826:18;36822:1;:22;36802:106;;;36874:26;36898:1;36874:12;:20;36887:6;36874:20;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;36860:8;36869:1;36860:11;;;;;;;;:::i;:::-;;;;;;;:40;;;;;36846:3;;;;;:::i;:::-;;;;36802:106;;;;36951:8;36944:15;;;;36358:607;;;:::o;38900:979::-;39030:1;39011:9;:16;:20;39003:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;39100:9;39095:779;39119:9;:16;39115:1;:20;39095:779;;;39174:15;39192:9;39202:1;39192:12;;;;;;;;:::i;:::-;;;;;;;;39174:30;;39260:10;39241:7;:16;39249:7;39241:16;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39322:37;39351:7;39322:12;:24;39335:10;39322:24;;;;;;;;;;;;;;;:28;;:37;;;;:::i;:::-;;39485:15;39465:8;:17;39474:7;39465:17;;;;;;;;;;;:35;;;;39720:6;:23;;;39744:10;39764:4;39771:7;39720:63;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39839:7;39827:10;39820:46;;;39848:8;:17;39857:7;39848:17;;;;;;;;;;;;39820:46;;;;;;:::i;:::-;;;;;;;;39142:732;39137:3;;;;;:::i;:::-;;;;39095:779;;;;38900:979;:::o;17678:207::-;17821:6;17847:30;;;17840:37;;17678:207;;;;;;:::o;34939:1049::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35101:33:::1;35151:22;:13;:20;:22::i;:::-;35137:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35101:73;;35222:9;35217:425;35262:1;35237:22;:13;:20;:22::i;:::-;:26;35217:425;;;35408:13;35424:19;35441:1;35424:13;:16;;:19;;;;:::i;:::-;35408:35;;35481:27;35502:5;35481:13;:20;;:27;;;;:::i;:::-;;35629:5;35607:16;35624:1;35607:19;;;;;;;;:::i;:::-;;;;;;;:27;;;::::0;::::1;35270:372;35265:3;;;;;:::i;:::-;;;;35217:425;;;;35695:10;35674:69;;;35707:16;35725:17;35674:69;;;;;;;:::i;:::-;;;;;;;;35795:9;35790:193;35814:17;:24;35810:1;:28;35790:193;;;35854:20;35877:17;35895:1;35877:20;;;;;;;;:::i;:::-;;;;;;;;35854:43;;35944:31;35962:12;35944:13;:17;;:31;;;;:::i;:::-;;35845:138;35840:3;;;;;:::i;:::-;;;;35790:193;;;;35018:970;34939:1049:::0;:::o;29028:41::-;;;;;;;;;;;;;:::o;37282:1171::-;37347:7;37422:1;37400:8;:18;37409:8;37400:18;;;;;;;;;;;;:23;;37392:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;37645:19;37685:8;:18;37694:8;37685:18;;;;;;;;;;;;37667:15;:36;;;;:::i;:::-;37645:58;;38025:19;38071:2;38066;38061;38047:11;:16;;;;:::i;:::-;:21;;;;:::i;:::-;:26;;;;:::i;:::-;38025:48;;38209:14;38240:12;;;;;;;;;;;38226:26;;:11;:26;;;;:::i;:::-;38209:43;;38295:24;38310:8;38295:14;:24::i;:::-;38291:113;;;38370:26;;;;;;;;;;;38360:36;;;;;;;:::i;:::-;;;38291:113;38441:6;38434:13;;;;;37282:1171;;;:::o;30138:96::-;30168:66;30138:96;:::o;29532:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;2639:103::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2704:30:::1;2731:1;2704:18;:30::i;:::-;2639:103::o:0;28239:37::-;;;:::o;1988:87::-;2034:7;2061:6;;;;;;;;;;;2054:13;;1988:87;:::o;29667:43::-;;;;;;;;;;;;;;;;;:::o;33902:240::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34021:10:::1;34001:63;;;34033:12;;;;;;;;;;;34047:16;34001:63;;;;;;;:::i;:::-;;;;;;;;34120:16;34105:12;;:31;;;;;;;;;;;;;;;;;;33902:240:::0;:::o;28396:31::-;;;:::o;28621:27::-;;;;;;;;;;;;;:::o;33543:121::-;33606:4;33626:32;33649:8;33626:13;:22;;:32;;;;:::i;:::-;33619:39;;33543:121;;;:::o;34383:338::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34544:10:::1;34510:105;;;34556:26;;;;;;;;;;;34584:30;34510:105;;;;;;;:::i;:::-;;;;;;;;34685:30;34656:26;;:59;;;;;;;;;;;;;;;;;;34383:338:::0;:::o;40076:1399::-;40208:1;40189:9;:16;:20;40181:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;40319:20;40390:9;40385:979;40409:9;:16;40405:1;:20;40385:979;;;40464:15;40482:9;40492:1;40482:12;;;;;;;;:::i;:::-;;;;;;;;40464:30;;40633:10;40613:30;;:7;:16;40621:7;40613:16;;;;;;;;;;;;;;;;;;;;;:30;;;40605:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40765:15;40783:25;40800:7;40783:16;:25::i;:::-;40765:43;;40908:7;40892:23;;;;;:::i;:::-;;;40973:7;40961:10;40952:74;;;40982:15;40999:8;:17;41008:7;40999:17;;;;;;;;;;;;41018:7;40952:74;;;;;;;;:::i;:::-;;;;;;;;41125:1;41098:7;:16;41106:7;41098:16;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41156:1;41136:8;:17;41145:7;41136:17;;;;;;;;;;;:21;;;;41214:40;41246:7;41214:12;:24;41227:10;41214:24;;;;;;;;;;;;;;;:31;;:40;;;;:::i;:::-;;41301:6;:19;;;41329:4;41336:10;41348:7;41301:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40432:932;;40427:3;;;;;:::i;:::-;;;;40385:979;;;;41433:5;:10;;;41444;41456:12;41433:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40128:1347;40076:1399;:::o;2897:201::-;2219:12;:10;:12::i;:::-;2208:23;;:7;:5;:7::i;:::-;:23;;;2200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3006:1:::1;2986:22;;:8;:22;;;;2978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3062:28;3081:8;3062:18;:28::i;:::-;2897:201:::0;:::o;14608:114::-;14668:7;14695:19;14703:3;:10;;14695:7;:19::i;:::-;14688:26;;14608:114;;;:::o;15076:137::-;15147:7;15182:22;15186:3;:10;;15198:5;15182:3;:22::i;:::-;15174:31;;15167:38;;15076:137;;;;:::o;14153:::-;14223:4;14247:35;14255:3;:10;;14275:5;14267:14;;14247:7;:35::i;:::-;14240:42;;14153:137;;;;:::o;13846:131::-;13913:4;13937:32;13942:3;:10;;13962:5;13954:14;;13937:4;:32::i;:::-;13930:39;;13846:131;;;;:::o;712:98::-;765:7;792:10;785:17;;712:98;:::o;3258:191::-;3332:16;3351:6;;;;;;;;;;;3332:25;;3377:8;3368:6;;:17;;;;;;;;;;;;;;;;;;3432:8;3401:40;;3422:8;3401:40;;;;;;;;;;;;3321:128;3258:191;:::o;14376:146::-;14453:4;14477:37;14487:3;:10;;14507:5;14499:14;;14477:9;:37::i;:::-;14470:44;;14376:146;;;;:::o;7554:109::-;7610:7;7637:3;:11;;:18;;;;7630:25;;7554:109;;;:::o;8017:120::-;8084:7;8111:3;:11;;8123:5;8111:18;;;;;;;;:::i;:::-;;;;;;;;;;8104:25;;8017:120;;;;:::o;5833:1420::-;5899:4;6017:18;6038:3;:12;;:19;6051:5;6038:19;;;;;;;;;;;;6017:40;;6088:1;6074:10;:15;6070:1176;;6449:21;6486:1;6473:10;:14;;;;:::i;:::-;6449:38;;6502:17;6543:1;6522:3;:11;;:18;;;;:22;;;;:::i;:::-;6502:42;;6578:13;6565:9;:26;6561:405;;6612:17;6632:3;:11;;6644:9;6632:22;;;;;;;;:::i;:::-;;;;;;;;;;6612:42;;6786:9;6757:3;:11;;6769:13;6757:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;6897:10;6871:3;:12;;:23;6884:9;6871:23;;;;;;;;;;;:36;;;;6593:373;6561:405;7047:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7142:3;:12;;:19;7155:5;7142:19;;;;;;;;;;;7135:26;;;7185:4;7178:11;;;;;;;6070:1176;7229:5;7222:12;;;5833:1420;;;;;:::o;5243:414::-;5306:4;5328:21;5338:3;5343:5;5328:9;:21::i;:::-;5323:327;;5366:3;:11;;5383:5;5366:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5549:3;:11;;:18;;;;5527:3;:12;;:19;5540:5;5527:19;;;;;;;;;;;:40;;;;5589:4;5582:11;;;;5323:327;5633:5;5626:12;;5243:414;;;;;:::o;7339:129::-;7412:4;7459:1;7436:3;:12;;:19;7449:5;7436:19;;;;;;;;;;;;:24;;7429:31;;7339:129;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:114::-;1243:6;1277:5;1271:12;1261:22;;1176:114;;;:::o;1296:184::-;1395:11;1429:6;1424:3;1417:19;1469:4;1464:3;1460:14;1445:29;;1296:184;;;;:::o;1486:132::-;1553:4;1576:3;1568:11;;1606:4;1601:3;1597:14;1589:22;;1486:132;;;:::o;1624:77::-;1661:7;1690:5;1679:16;;1624:77;;;:::o;1707:108::-;1784:24;1802:5;1784:24;:::i;:::-;1779:3;1772:37;1707:108;;:::o;1821:179::-;1890:10;1911:46;1953:3;1945:6;1911:46;:::i;:::-;1989:4;1984:3;1980:14;1966:28;;1821:179;;;;:::o;2006:113::-;2076:4;2108;2103:3;2099:14;2091:22;;2006:113;;;:::o;2155:732::-;2274:3;2303:54;2351:5;2303:54;:::i;:::-;2373:86;2452:6;2447:3;2373:86;:::i;:::-;2366:93;;2483:56;2533:5;2483:56;:::i;:::-;2562:7;2593:1;2578:284;2603:6;2600:1;2597:13;2578:284;;;2679:6;2673:13;2706:63;2765:3;2750:13;2706:63;:::i;:::-;2699:70;;2792:60;2845:6;2792:60;:::i;:::-;2782:70;;2638:224;2625:1;2622;2618:9;2613:14;;2578:284;;;2582:14;2878:3;2871:10;;2279:608;;;2155:732;;;;:::o;2893:373::-;3036:4;3074:2;3063:9;3059:18;3051:26;;3123:9;3117:4;3113:20;3109:1;3098:9;3094:17;3087:47;3151:108;3254:4;3245:6;3151:108;:::i;:::-;3143:116;;2893:373;;;;:::o;3272:117::-;3381:1;3378;3371:12;3395:102;3436:6;3487:2;3483:7;3478:2;3471:5;3467:14;3463:28;3453:38;;3395:102;;;:::o;3503:180::-;3551:77;3548:1;3541:88;3648:4;3645:1;3638:15;3672:4;3669:1;3662:15;3689:281;3772:27;3794:4;3772:27;:::i;:::-;3764:6;3760:40;3902:6;3890:10;3887:22;3866:18;3854:10;3851:34;3848:62;3845:88;;;3913:18;;:::i;:::-;3845:88;3953:10;3949:2;3942:22;3732:238;3689:281;;:::o;3976:129::-;4010:6;4037:20;;:::i;:::-;4027:30;;4066:33;4094:4;4086:6;4066:33;:::i;:::-;3976:129;;;:::o;4111:311::-;4188:4;4278:18;4270:6;4267:30;4264:56;;;4300:18;;:::i;:::-;4264:56;4350:4;4342:6;4338:17;4330:25;;4410:4;4404;4400:15;4392:23;;4111:311;;;:::o;4428:117::-;4537:1;4534;4527:12;4551:122;4624:24;4642:5;4624:24;:::i;:::-;4617:5;4614:35;4604:63;;4663:1;4660;4653:12;4604:63;4551:122;:::o;4679:139::-;4725:5;4763:6;4750:20;4741:29;;4779:33;4806:5;4779:33;:::i;:::-;4679:139;;;;:::o;4841:710::-;4937:5;4962:81;4978:64;5035:6;4978:64;:::i;:::-;4962:81;:::i;:::-;4953:90;;5063:5;5092:6;5085:5;5078:21;5126:4;5119:5;5115:16;5108:23;;5179:4;5171:6;5167:17;5159:6;5155:30;5208:3;5200:6;5197:15;5194:122;;;5227:79;;:::i;:::-;5194:122;5342:6;5325:220;5359:6;5354:3;5351:15;5325:220;;;5434:3;5463:37;5496:3;5484:10;5463:37;:::i;:::-;5458:3;5451:50;5530:4;5525:3;5521:14;5514:21;;5401:144;5385:4;5380:3;5376:14;5369:21;;5325:220;;;5329:21;4943:608;;4841:710;;;;;:::o;5574:370::-;5645:5;5694:3;5687:4;5679:6;5675:17;5671:27;5661:122;;5702:79;;:::i;:::-;5661:122;5819:6;5806:20;5844:94;5934:3;5926:6;5919:4;5911:6;5907:17;5844:94;:::i;:::-;5835:103;;5651:293;5574:370;;;;:::o;5950:539::-;6034:6;6083:2;6071:9;6062:7;6058:23;6054:32;6051:119;;;6089:79;;:::i;:::-;6051:119;6237:1;6226:9;6222:17;6209:31;6267:18;6259:6;6256:30;6253:117;;;6289:79;;:::i;:::-;6253:117;6394:78;6464:7;6455:6;6444:9;6440:22;6394:78;:::i;:::-;6384:88;;6180:302;5950:539;;;;:::o;6495:117::-;6604:1;6601;6594:12;6618:307;6679:4;6769:18;6761:6;6758:30;6755:56;;;6791:18;;:::i;:::-;6755:56;6829:29;6851:6;6829:29;:::i;:::-;6821:37;;6913:4;6907;6903:15;6895:23;;6618:307;;;:::o;6931:154::-;7015:6;7010:3;7005;6992:30;7077:1;7068:6;7063:3;7059:16;7052:27;6931:154;;;:::o;7091:410::-;7168:5;7193:65;7209:48;7250:6;7209:48;:::i;:::-;7193:65;:::i;:::-;7184:74;;7281:6;7274:5;7267:21;7319:4;7312:5;7308:16;7357:3;7348:6;7343:3;7339:16;7336:25;7333:112;;;7364:79;;:::i;:::-;7333:112;7454:41;7488:6;7483:3;7478;7454:41;:::i;:::-;7174:327;7091:410;;;;;:::o;7520:338::-;7575:5;7624:3;7617:4;7609:6;7605:17;7601:27;7591:122;;7632:79;;:::i;:::-;7591:122;7749:6;7736:20;7774:78;7848:3;7840:6;7833:4;7825:6;7821:17;7774:78;:::i;:::-;7765:87;;7581:277;7520:338;;;;:::o;7864:943::-;7959:6;7967;7975;7983;8032:3;8020:9;8011:7;8007:23;8003:33;8000:120;;;8039:79;;:::i;:::-;8000:120;8159:1;8184:53;8229:7;8220:6;8209:9;8205:22;8184:53;:::i;:::-;8174:63;;8130:117;8286:2;8312:53;8357:7;8348:6;8337:9;8333:22;8312:53;:::i;:::-;8302:63;;8257:118;8414:2;8440:53;8485:7;8476:6;8465:9;8461:22;8440:53;:::i;:::-;8430:63;;8385:118;8570:2;8559:9;8555:18;8542:32;8601:18;8593:6;8590:30;8587:117;;;8623:79;;:::i;:::-;8587:117;8728:62;8782:7;8773:6;8762:9;8758:22;8728:62;:::i;:::-;8718:72;;8513:287;7864:943;;;;;;;:::o;8813:149::-;8849:7;8889:66;8882:5;8878:78;8867:89;;8813:149;;;:::o;8968:115::-;9053:23;9070:5;9053:23;:::i;:::-;9048:3;9041:36;8968:115;;:::o;9089:218::-;9180:4;9218:2;9207:9;9203:18;9195:26;;9231:69;9297:1;9286:9;9282:17;9273:6;9231:69;:::i;:::-;9089:218;;;;:::o;9313:118::-;9350:7;9390:34;9383:5;9379:46;9368:57;;9313:118;;;:::o;9437:::-;9524:24;9542:5;9524:24;:::i;:::-;9519:3;9512:37;9437:118;;:::o;9561:222::-;9654:4;9692:2;9681:9;9677:18;9669:26;;9705:71;9773:1;9762:9;9758:17;9749:6;9705:71;:::i;:::-;9561:222;;;;:::o;9789:329::-;9848:6;9897:2;9885:9;9876:7;9872:23;9868:32;9865:119;;;9903:79;;:::i;:::-;9865:119;10023:1;10048:53;10093:7;10084:6;10073:9;10069:22;10048:53;:::i;:::-;10038:63;;9994:117;9789:329;;;;:::o;10124:118::-;10211:24;10229:5;10211:24;:::i;:::-;10206:3;10199:37;10124:118;;:::o;10248:222::-;10341:4;10379:2;10368:9;10364:18;10356:26;;10392:71;10460:1;10449:9;10445:17;10436:6;10392:71;:::i;:::-;10248:222;;;;:::o;10476:118::-;10563:24;10581:5;10563:24;:::i;:::-;10558:3;10551:37;10476:118;;:::o;10600:222::-;10693:4;10731:2;10720:9;10716:18;10708:26;;10744:71;10812:1;10801:9;10797:17;10788:6;10744:71;:::i;:::-;10600:222;;;;:::o;10828:60::-;10856:3;10877:5;10870:12;;10828:60;;;:::o;10894:142::-;10944:9;10977:53;10995:34;11004:24;11022:5;11004:24;:::i;:::-;10995:34;:::i;:::-;10977:53;:::i;:::-;10964:66;;10894:142;;;:::o;11042:126::-;11092:9;11125:37;11156:5;11125:37;:::i;:::-;11112:50;;11042:126;;;:::o;11174:148::-;11246:9;11279:37;11310:5;11279:37;:::i;:::-;11266:50;;11174:148;;;:::o;11328:175::-;11437:59;11490:5;11437:59;:::i;:::-;11432:3;11425:72;11328:175;;:::o;11509:266::-;11624:4;11662:2;11651:9;11647:18;11639:26;;11675:93;11765:1;11754:9;11750:17;11741:6;11675:93;:::i;:::-;11509:266;;;;:::o;11781:122::-;11854:24;11872:5;11854:24;:::i;:::-;11847:5;11844:35;11834:63;;11893:1;11890;11883:12;11834:63;11781:122;:::o;11909:139::-;11955:5;11993:6;11980:20;11971:29;;12009:33;12036:5;12009:33;:::i;:::-;11909:139;;;;:::o;12054:329::-;12113:6;12162:2;12150:9;12141:7;12137:23;12133:32;12130:119;;;12168:79;;:::i;:::-;12130:119;12288:1;12313:53;12358:7;12349:6;12338:9;12334:22;12313:53;:::i;:::-;12303:63;;12259:117;12054:329;;;;:::o;12389:141::-;12454:9;12487:37;12518:5;12487:37;:::i;:::-;12474:50;;12389:141;;;:::o;12536:161::-;12638:52;12684:5;12638:52;:::i;:::-;12633:3;12626:65;12536:161;;:::o;12703:252::-;12811:4;12849:2;12838:9;12834:18;12826:26;;12862:86;12945:1;12934:9;12930:17;12921:6;12862:86;:::i;:::-;12703:252;;;;:::o;12961:90::-;12995:7;13038:5;13031:13;13024:21;13013:32;;12961:90;;;:::o;13057:109::-;13138:21;13153:5;13138:21;:::i;:::-;13133:3;13126:34;13057:109;;:::o;13172:210::-;13259:4;13297:2;13286:9;13282:18;13274:26;;13310:65;13372:1;13361:9;13357:17;13348:6;13310:65;:::i;:::-;13172:210;;;;:::o;13388:180::-;13436:77;13433:1;13426:88;13533:4;13530:1;13523:15;13557:4;13554:1;13547:15;13574:180;13622:77;13619:1;13612:88;13719:4;13716:1;13709:15;13743:4;13740:1;13733:15;13760:233;13799:3;13822:24;13840:5;13822:24;:::i;:::-;13813:33;;13868:66;13861:5;13858:77;13855:103;;;13938:18;;:::i;:::-;13855:103;13985:1;13978:5;13974:13;13967:20;;13760:233;;;:::o;13999:169::-;14083:11;14117:6;14112:3;14105:19;14157:4;14152:3;14148:14;14133:29;;13999:169;;;;:::o;14174:167::-;14314:19;14310:1;14302:6;14298:14;14291:43;14174:167;:::o;14347:366::-;14489:3;14510:67;14574:2;14569:3;14510:67;:::i;:::-;14503:74;;14586:93;14675:3;14586:93;:::i;:::-;14704:2;14699:3;14695:12;14688:19;;14347:366;;;:::o;14719:419::-;14885:4;14923:2;14912:9;14908:18;14900:26;;14972:9;14966:4;14962:20;14958:1;14947:9;14943:17;14936:47;15000:131;15126:4;15000:131;:::i;:::-;14992:139;;14719:419;;;:::o;15144:168::-;15227:11;15261:6;15256:3;15249:19;15301:4;15296:3;15292:14;15277:29;;15144:168;;;;:::o;15318:114::-;;:::o;15438:362::-;15579:3;15600:65;15663:1;15658:3;15600:65;:::i;:::-;15593:72;;15674:93;15763:3;15674:93;:::i;:::-;15792:1;15787:3;15783:11;15776:18;;15438:362;;;:::o;15806:748::-;16055:4;16093:3;16082:9;16078:19;16070:27;;16107:71;16175:1;16164:9;16160:17;16151:6;16107:71;:::i;:::-;16188:72;16256:2;16245:9;16241:18;16232:6;16188:72;:::i;:::-;16270;16338:2;16327:9;16323:18;16314:6;16270:72;:::i;:::-;16389:9;16383:4;16379:20;16374:2;16363:9;16359:18;16352:48;16417:130;16542:4;16417:130;:::i;:::-;16409:138;;15806:748;;;;;;:::o;16560:182::-;16700:34;16696:1;16688:6;16684:14;16677:58;16560:182;:::o;16748:366::-;16890:3;16911:67;16975:2;16970:3;16911:67;:::i;:::-;16904:74;;16987:93;17076:3;16987:93;:::i;:::-;17105:2;17100:3;17096:12;17089:19;;16748:366;;;:::o;17120:419::-;17286:4;17324:2;17313:9;17309:18;17301:26;;17373:9;17367:4;17363:20;17359:1;17348:9;17344:17;17337:47;17401:131;17527:4;17401:131;:::i;:::-;17393:139;;17120:419;;;:::o;17545:634::-;17766:4;17804:2;17793:9;17789:18;17781:26;;17853:9;17847:4;17843:20;17839:1;17828:9;17824:17;17817:47;17881:108;17984:4;17975:6;17881:108;:::i;:::-;17873:116;;18036:9;18030:4;18026:20;18021:2;18010:9;18006:18;17999:48;18064:108;18167:4;18158:6;18064:108;:::i;:::-;18056:116;;17545:634;;;;;:::o;18185:160::-;18325:12;18321:1;18313:6;18309:14;18302:36;18185:160;:::o;18351:366::-;18493:3;18514:67;18578:2;18573:3;18514:67;:::i;:::-;18507:74;;18590:93;18679:3;18590:93;:::i;:::-;18708:2;18703:3;18699:12;18692:19;;18351:366;;;:::o;18723:419::-;18889:4;18927:2;18916:9;18912:18;18904:26;;18976:9;18970:4;18966:20;18962:1;18951:9;18947:17;18940:47;19004:131;19130:4;19004:131;:::i;:::-;18996:139;;18723:419;;;:::o;19148:191::-;19188:4;19208:20;19226:1;19208:20;:::i;:::-;19203:25;;19242:20;19260:1;19242:20;:::i;:::-;19237:25;;19281:1;19278;19275:8;19272:34;;;19286:18;;:::i;:::-;19272:34;19331:1;19328;19324:9;19316:17;;19148:191;;;;:::o;19345:180::-;19393:77;19390:1;19383:88;19490:4;19487:1;19480:15;19514:4;19511:1;19504:15;19531:185;19571:1;19588:20;19606:1;19588:20;:::i;:::-;19583:25;;19622:20;19640:1;19622:20;:::i;:::-;19617:25;;19661:1;19651:35;;19666:18;;:::i;:::-;19651:35;19708:1;19705;19701:9;19696:14;;19531:185;;;;:::o;19722:348::-;19762:7;19785:20;19803:1;19785:20;:::i;:::-;19780:25;;19819:20;19837:1;19819:20;:::i;:::-;19814:25;;20007:1;19939:66;19935:74;19932:1;19929:81;19924:1;19917:9;19910:17;19906:105;19903:131;;;20014:18;;:::i;:::-;19903:131;20062:1;20059;20055:9;20044:20;;19722:348;;;;:::o;20076:332::-;20197:4;20235:2;20224:9;20220:18;20212:26;;20248:71;20316:1;20305:9;20301:17;20292:6;20248:71;:::i;:::-;20329:72;20397:2;20386:9;20382:18;20373:6;20329:72;:::i;:::-;20076:332;;;;;:::o;20414:165::-;20554:17;20550:1;20542:6;20538:14;20531:41;20414:165;:::o;20585:366::-;20727:3;20748:67;20812:2;20807:3;20748:67;:::i;:::-;20741:74;;20824:93;20913:3;20824:93;:::i;:::-;20942:2;20937:3;20933:12;20926:19;;20585:366;;;:::o;20957:419::-;21123:4;21161:2;21150:9;21146:18;21138:26;;21210:9;21204:4;21200:20;21196:1;21185:9;21181:17;21174:47;21238:131;21364:4;21238:131;:::i;:::-;21230:139;;20957:419;;;:::o;21382:305::-;21422:3;21441:20;21459:1;21441:20;:::i;:::-;21436:25;;21475:20;21493:1;21475:20;:::i;:::-;21470:25;;21629:1;21561:66;21557:74;21554:1;21551:81;21548:107;;;21635:18;;:::i;:::-;21548:107;21679:1;21676;21672:9;21665:16;;21382:305;;;;:::o;21693:442::-;21842:4;21880:2;21869:9;21865:18;21857:26;;21893:71;21961:1;21950:9;21946:17;21937:6;21893:71;:::i;:::-;21974:72;22042:2;22031:9;22027:18;22018:6;21974:72;:::i;:::-;22056;22124:2;22113:9;22109:18;22100:6;22056:72;:::i;:::-;21693:442;;;;;;:::o;22141:::-;22290:4;22328:2;22317:9;22313:18;22305:26;;22341:71;22409:1;22398:9;22394:17;22385:6;22341:71;:::i;:::-;22422:72;22490:2;22479:9;22475:18;22466:6;22422:72;:::i;:::-;22504;22572:2;22561:9;22557:18;22548:6;22504:72;:::i;:::-;22141:442;;;;;;:::o;22589:332::-;22710:4;22748:2;22737:9;22733:18;22725:26;;22761:71;22829:1;22818:9;22814:17;22805:6;22761:71;:::i;:::-;22842:72;22910:2;22899:9;22895:18;22886:6;22842:72;:::i;:::-;22589:332;;;;;:::o;22927:225::-;23067:34;23063:1;23055:6;23051:14;23044:58;23136:8;23131:2;23123:6;23119:15;23112:33;22927:225;:::o;23158:366::-;23300:3;23321:67;23385:2;23380:3;23321:67;:::i;:::-;23314:74;;23397:93;23486:3;23397:93;:::i;:::-;23515:2;23510:3;23506:12;23499:19;;23158:366;;;:::o;23530:419::-;23696:4;23734:2;23723:9;23719:18;23711:26;;23783:9;23777:4;23773:20;23769:1;23758:9;23754:17;23747:47;23811:131;23937:4;23811:131;:::i;:::-;23803:139;;23530:419;;;:::o;23955:180::-;24003:77;24000:1;23993:88;24100:4;24097:1;24090:15;24124:4;24121:1;24114:15
Swarm Source
ipfs://c870cd3ed2db8209bcb5f9bb906dc44a8b41f837086236a540ffdbbcd4b02d2c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.