More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 98 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 14740718 | 963 days ago | IN | 0 ETH | 0.00474583 | ||||
Stake | 14711539 | 968 days ago | IN | 0 ETH | 0.00997948 | ||||
Stake | 14676817 | 974 days ago | IN | 0 ETH | 0.00640407 | ||||
Stake | 14676817 | 974 days ago | IN | 0 ETH | 0.00603507 | ||||
Stake | 14676817 | 974 days ago | IN | 0 ETH | 0.00723072 | ||||
Stake | 14656016 | 977 days ago | IN | 0 ETH | 0.01843778 | ||||
Stake | 14626776 | 981 days ago | IN | 0 ETH | 0.00927676 | ||||
Stake | 14626769 | 981 days ago | IN | 0 ETH | 0.00924824 | ||||
Stake | 14599344 | 986 days ago | IN | 0 ETH | 0.00461009 | ||||
Stake | 14587911 | 988 days ago | IN | 0 ETH | 0.00686258 | ||||
Stake | 14568038 | 991 days ago | IN | 0 ETH | 0.00861632 | ||||
Stake | 14555167 | 993 days ago | IN | 0 ETH | 0.00676697 | ||||
Stake | 14530670 | 996 days ago | IN | 0 ETH | 0.00806991 | ||||
Stake | 14530523 | 996 days ago | IN | 0 ETH | 0.01019042 | ||||
Stake | 14527732 | 997 days ago | IN | 0 ETH | 0.0157972 | ||||
Stake | 14527728 | 997 days ago | IN | 0 ETH | 0.01513185 | ||||
Stake | 14516916 | 999 days ago | IN | 0 ETH | 0.01208897 | ||||
Stake | 14507660 | 1000 days ago | IN | 0 ETH | 0.01084636 | ||||
Stake | 14507657 | 1000 days ago | IN | 0 ETH | 0.01202484 | ||||
Stake | 14507419 | 1000 days ago | IN | 0 ETH | 0.01053461 | ||||
Stake | 14507190 | 1000 days ago | IN | 0 ETH | 0.01034314 | ||||
Stake | 14507186 | 1000 days ago | IN | 0 ETH | 0.01238735 | ||||
Stake | 14496772 | 1002 days ago | IN | 0 ETH | 0.01217077 | ||||
Stake | 14493958 | 1002 days ago | IN | 0 ETH | 0.01069246 | ||||
Stake | 14489101 | 1003 days ago | IN | 0 ETH | 0.01667203 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-16 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } } // File: @openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ contract ERC1155Holder is ERC1155Receiver { function onERC1155Received( address, address, uint256, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] memory, uint256[] memory, bytes memory ) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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) /** * @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/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: Staking.sol // Staking.sol contract Staking is ERC721Holder, ERC1155Holder, Ownable { address public whaleMakerAddress = 0xA87121eDa32661C0c178f06F8b44F12f80ae4E88; address public alphaPassAddress = 0xecF78fdB130f2504fd31F70b7470A87b283EA3f5; address public podAddress = 0x5B3E42382C3AaAd8Ff9e106664E362C308CBa3BC; address public stakeMasterAddress = 0xDBef1bbCb494fAcd6cD1BF426e25dA7A10d96eAa; address nullAddress = 0x0000000000000000000000000000000000000000; uint256 public maxWalletStaked = 10; uint256 public contractPublishedAt = block.timestamp; uint256 oneMonthSeconds = 2592000; // 30 days in seconds struct StakingInfo { uint256 whaleId; uint256 alphaId; uint256 stakedAt; } mapping(address => StakingInfo[]) private _stakers; struct RewardState { uint256 unstakedRewardsAmount; uint256 claimedAmount; uint256 lastClaimedAt; } mapping(address => RewardState) private _stakerRewards; uint256 public claimStartTime = 1672531200; // Jan 1 2023 00:00:00 AM uint256[] public rewardsStepsTimestamp = [1672531199, 1704067199, 1735689599, 1767225599, 1798761599, 1830297599, 1956527999]; mapping(uint256 => uint256) public rewardsStepsMonthlyAmount; event Staked(address staker, uint256 whaleId, uint256 alphaId); event Unstaked(address staker, uint256 whaleId, uint256 alphaId); event Claimed(address staker, uint256 amount); constructor() { rewardsStepsMonthlyAmount[1672531199] = 4500; // Dec 31 2022 11:59:59 PM rewardsStepsMonthlyAmount[1704067199] = 3500; // Dec 31 2023 11:59:59 PM rewardsStepsMonthlyAmount[1735689599] = 2500; // Dec 31 2024 11:59:59 PM rewardsStepsMonthlyAmount[1767225599] = 1500; // Dec 31 2025 11:59:59 PM rewardsStepsMonthlyAmount[1798761599] = 1000; // Dec 31 2026 11:59:59 PM rewardsStepsMonthlyAmount[1830297599] = 500; // Dec 31 2027 11:59:59 PM rewardsStepsMonthlyAmount[1956527999] = 250; // Dec 31 2031 11:59:59 PM } function getTokensStaked(address staker) public view returns (StakingInfo[] memory) { return _stakers[staker]; } function _remove(address staker, uint256 index) internal { if (index >= _stakers[staker].length) return; for (uint256 i=index; i<_stakers[staker].length-1; i++) { _stakers[staker][i] = _stakers[staker][i + 1]; } _stakers[staker].pop(); } function _calculateRewards(address staker, uint256 stakeId) internal view returns (uint256) { require(stakeId<_stakers[staker].length); uint256 rewards = 0; uint256 staked_secs; // The seconds of token staken in this step StakingInfo memory staking_info = _stakers[staker][stakeId]; uint256 startTs = staking_info.stakedAt; // The timestamp that the step started for (uint256 i=0; i<rewardsStepsTimestamp.length; i++) { if (rewardsStepsTimestamp[i] < block.timestamp) { if (startTs < rewardsStepsTimestamp[i]) { staked_secs = rewardsStepsTimestamp[i] - startTs + 1; rewards = rewards + staked_secs * rewardsStepsMonthlyAmount[rewardsStepsTimestamp[i]] * 10 ** 18 / oneMonthSeconds; startTs = rewardsStepsTimestamp[i] + 1; } } else { // the current step staked_secs = block.timestamp - startTs; rewards = rewards + staked_secs * rewardsStepsMonthlyAmount[rewardsStepsTimestamp[i]] * 10 ** 18 / oneMonthSeconds; break; // Ignore the next steps } } return rewards; } function stakerRewardsState(address staker) public view returns (uint256 totalRewards, uint256 claimedAmount, uint256 lastClaimedAt) { StakingInfo[] memory staking_info = _stakers[staker]; RewardState memory reward_state = _stakerRewards[staker]; uint256 staked_rewards = 0; for (uint256 i = 0; i < staking_info.length; i++) { staked_rewards = staked_rewards + _calculateRewards(staker, i); } uint256 total_rewards = staked_rewards + reward_state.unstakedRewardsAmount; return (total_rewards, reward_state.claimedAmount, reward_state.lastClaimedAt); } function stake(uint256 whaleId, uint256 alphaId) public { require(_stakers[msg.sender].length+1<=maxWalletStaked, "EXCEED_MAX_WALLET_STAKED"); require( IERC721(whaleMakerAddress).ownerOf(whaleId) == msg.sender && IERC1155(alphaPassAddress).balanceOf(msg.sender, alphaId) > 0, "NOT_BOTH_TOKEN_OWNER" ); IERC721(whaleMakerAddress).safeTransferFrom(msg.sender, address(this), whaleId); IERC1155(alphaPassAddress).safeTransferFrom(msg.sender, address(this), alphaId, 1, ""); _stakers[msg.sender].push(StakingInfo(whaleId, alphaId, block.timestamp)); emit Staked(msg.sender, whaleId, alphaId); } function unstake(uint256 stakeId) public { require(claimStartTime < block.timestamp, "DISABLED_CLAIM"); require(stakeId<_stakers[msg.sender].length, "WRONG_STAKE_ID"); StakingInfo memory staking_info = _stakers[msg.sender][stakeId]; IERC721(whaleMakerAddress).safeTransferFrom(address(this), msg.sender, staking_info.whaleId); IERC1155(alphaPassAddress).safeTransferFrom(address(this), msg.sender, staking_info.alphaId, 1, ""); uint256 rewards_amount = _calculateRewards(msg.sender, stakeId); _stakerRewards[msg.sender].unstakedRewardsAmount = _stakerRewards[msg.sender].unstakedRewardsAmount + rewards_amount; _remove(msg.sender, stakeId); emit Unstaked(msg.sender, staking_info.whaleId, staking_info.alphaId); } function unstakeAll() public { require(claimStartTime < block.timestamp, "DISABLED_CLAIM"); require(_stakers[msg.sender].length>0, "NO_TOKEN_STAKED"); for (uint256 i = 0; i < _stakers[msg.sender].length; i++) { unstake(i); } } function claimableAmount(address staker) public view returns (uint256) { uint256 available_amount; uint256 total_rewards; uint256 claimed_amount; uint256 last_claimed_at; (total_rewards, claimed_amount, last_claimed_at) = stakerRewardsState(staker); if (last_claimed_at < claimStartTime) last_claimed_at = 1672531200; uint256 current_ts = block.timestamp; if (current_ts < claimStartTime) available_amount = uint256(0); else { if (current_ts >= 1704067200) { // after Jan 2024 available_amount = total_rewards - claimed_amount; } else { if ((current_ts - last_claimed_at) < oneMonthSeconds) { available_amount = uint256(0); } else { if (1672531200 <= current_ts && current_ts < 1675209600) { // current date is in Jan 2023 available_amount = (total_rewards - claimed_amount) * 20 / 100; // 20% } else { uint256 month_counts = (current_ts - last_claimed_at) / oneMonthSeconds; uint256 total_percent = month_counts * 727 / 100; // 7.27% per month if (total_percent > 100) total_percent = 100; available_amount = (total_rewards - claimed_amount) * total_percent / 100; } } } } return available_amount; } function nextClaimInSeconds(address staker) public view returns (uint256) { uint256 next_claim_in; RewardState memory reward_state = _stakerRewards[staker]; uint256 current_ts = block.timestamp; if (current_ts < claimStartTime) next_claim_in = claimStartTime - current_ts; else { if (current_ts >= 1704067200) { // after Jan 2024 next_claim_in = uint256(0); } else { next_claim_in = reward_state.lastClaimedAt + oneMonthSeconds - current_ts; } } return next_claim_in; } function claim() public { uint256 amount = claimableAmount(msg.sender); require(amount > 0, "ZERO_AVAILABLE_AMOUNT"); require(amount < IERC20(podAddress).balanceOf(stakeMasterAddress), "NOT_ENOUGH_POD_MASTER"); IERC20(podAddress).transferFrom(stakeMasterAddress, msg.sender, amount); _stakerRewards[msg.sender].claimedAmount = _stakerRewards[msg.sender].claimedAmount + amount; _stakerRewards[msg.sender].lastClaimedAt = block.timestamp; emit Claimed(msg.sender, amount); } function currentMonthlyRewards() public view returns (uint256) { uint256 cur_rewards = uint256(0); for (uint256 i=0; i<=rewardsStepsTimestamp.length; i++) { if (block.timestamp <= rewardsStepsTimestamp[i]) { cur_rewards = rewardsStepsMonthlyAmount[rewardsStepsTimestamp[i]] * 10 ** 18; break; } } return cur_rewards; } // Owner functions function setWhaleMakerAddress(address newAddress) public onlyOwner { whaleMakerAddress = newAddress; } function setAlphaPassAddress(address newAddress) public onlyOwner { alphaPassAddress = newAddress; } function setPodAddress(address newAddress) public onlyOwner { podAddress = newAddress; } function setStakeMasterAddress(address newAddress) public onlyOwner { stakeMasterAddress = newAddress; } function setMaxWalletStaked(uint256 newValue) public onlyOwner { maxWalletStaked = newValue; } function setClaimStartTime(uint256 newClaimStartTime) public onlyOwner { claimStartTime = newClaimStartTime; } function withdrawETH() external onlyOwner { require(address(this).balance > 0, "NO_BALANCE"); payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"whaleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"alphaId","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"whaleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"alphaId","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"alphaPassAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"claimableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractPublishedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentMonthlyRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTokensStaked","outputs":[{"components":[{"internalType":"uint256","name":"whaleId","type":"uint256"},{"internalType":"uint256","name":"alphaId","type":"uint256"},{"internalType":"uint256","name":"stakedAt","type":"uint256"}],"internalType":"struct Staking.StakingInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"nextClaimInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":[],"name":"podAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsStepsMonthlyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsStepsTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setAlphaPassAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimStartTime","type":"uint256"}],"name":"setClaimStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletStaked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setPodAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setStakeMasterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setWhaleMakerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"whaleId","type":"uint256"},{"internalType":"uint256","name":"alphaId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeMasterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"stakerRewardsState","outputs":[{"internalType":"uint256","name":"totalRewards","type":"uint256"},{"internalType":"uint256","name":"claimedAmount","type":"uint256"},{"internalType":"uint256","name":"lastClaimedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whaleMakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600180546001600160a01b031990811673a87121eda32661c0c178f06f8b44f12f80ae4e881790915560028054821673ecf78fdb130f2504fd31f70b7470a87b283ea3f5179055600380548216735b3e42382c3aaad8ff9e106664e362c308cba3bc17905560048054821673dbef1bbcb494facd6cd1bf426e25da7a10d96eaa179055600580549091169055600a60065542600790815562278d006008556363b0cd00600b556101606040526363b0ccff6080908152636592007f60a052636774857f60c052636955b8ff60e052636b36ec7f61010052636d181fff6101205263749e3f7f61014052620000f791600c919062000276565b503480156200010557600080fd5b50620001113362000226565b600d6020526111947f7e82db8f8a8c4d9cd447f03bd14186f88402c31e23193fefa12ee5e54ce8b8a255610dac7f28ac4a5a2da535e5da6738a8879546d7a7275151b96821d88e568758e41fb034556109c47fedd37dc571883c9b4e5138da0bae1bf83818ef0619bdbd8538349cf3b8b05113556105dc7f0873ff74021446e00ff57eca3339860cdbe922cf26f055e922715c60fa97d8ca556103e87f490ed8b520b4adc8bcce18c9267383a4063704e401b64bead681eb6864da4d03556101f47f16e2aa4c4f384ba93f74728ee912f1e43d8b7f18a6f9d13ccaab7289f1325e185563749e3f7f60005260fa7f662efe79e97c8a2cf172c03765407a6fc9c6e08718f57701d31e3082b76de7ea55620002e5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620002bc579160200282015b82811115620002bc578251829063ffffffff1690559160200191906001019062000297565b50620002ca929150620002ce565b5090565b5b80821115620002ca5760008155600101620002cf565b611e0c80620002f56000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806376ea2fea1161010f578063bc197c81116100a2578063f2fde38b11610071578063f2fde38b14610453578063f30f6ae614610466578063f43dbe6014610479578063f5263f721461048c57600080fd5b8063bc197c81146103fa578063c5c577a814610419578063e086e5ec1461042c578063f23a6e611461043457600080fd5b8063975433e9116100de578063975433e9146103b8578063a6a11bb1146103cb578063ac195ca1146103d4578063b7bab3f7146103e757600080fd5b806376ea2fea146103785780637b0472f01461038157806389885049146103945780638da5cb5b146103a757600080fd5b806335322f3711610187578063558e644711610156578063558e6447146103375780635cf7d2f71461034a5780636e1d6aec1461035d578063715018a61461037057600080fd5b806335322f37146102d95780633626e177146102e15780634e71d92d1461030f57806352eb77961461031757600080fd5b8063150b7a02116101c3578063150b7a0214610267578063163920391461029e5780632533a5f6146102b35780632e17de78146102c657600080fd5b806301ffc9a7146101f5578063031745881461021d5780630bab5464146102485780631425aa341461025e575b600080fd5b610208610203366004611b69565b6104ac565b60405190151581526020015b60405180910390f35b600254610230906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b6102506104e3565b604051908152602001610214565b61025060075481565b610285610275366004611a72565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b6102b16102ac366004611983565b610578565b005b6102b16102c1366004611b93565b6105cd565b6102b16102d4366004611b93565b6105fc565b6102b1610850565b6102f46102ef366004611983565b610918565b60408051938452602084019290925290820152606001610214565b6102b1610a53565b61032a610325366004611983565b610c80565b6040516102149190611c1f565b6102b1610345366004611983565b610d13565b6102b1610358366004611983565b610d5f565b600454610230906001600160a01b031681565b6102b1610dab565b61025060065481565b6102b161038f366004611bc5565b610de1565b6102506103a2366004611983565b61110d565b6000546001600160a01b0316610230565b600154610230906001600160a01b031681565b610250600b5481565b6102b16103e2366004611983565b611237565b6102506103f5366004611983565b611283565b6102856104083660046119c4565b63bc197c8160e01b95945050505050565b610250610427366004611b93565b61131f565b6102b1611340565b610285610442366004611ade565b63f23a6e6160e01b95945050505050565b6102b1610461366004611983565b6113d3565b600354610230906001600160a01b031681565b6102b1610487366004611b93565b61146b565b61025061049a366004611b93565b600d6020526000908152604090205481565b60006001600160e01b03198216630271189760e51b14806104dd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080805b600c54811161057257600c818154811061050457610504611d95565b9060005260206000200154421161056057600d6000600c838154811061052c5761052c611d95565b9060005260206000200154815260200190815260200160002054670de0b6b3a76400006105599190611d18565b9150610572565b8061056a81611d4e565b9150506104e8565b50919050565b6000546001600160a01b031633146105ab5760405162461bcd60e51b81526004016105a290611c78565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146105f75760405162461bcd60e51b81526004016105a290611c78565b600b55565b42600b541061063e5760405162461bcd60e51b815260206004820152600e60248201526d44495341424c45445f434c41494d60901b60448201526064016105a2565b33600090815260096020526040902054811061068d5760405162461bcd60e51b815260206004820152600e60248201526d15d493d391d7d4d51052d157d25160921b60448201526064016105a2565b3360009081526009602052604081208054839081106106ae576106ae611d95565b6000918252602091829020604080516060810182526003939093029091018054808452600180830154958501959095526002909101548383015292549051632142170760e11b815230600482015233602482015260448101939093529092506001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561073a57600080fd5b505af115801561074e573d6000803e3d6000fd5b50506002546020840151604051637921219560e11b81526001600160a01b03909216935063f242432a925061078c9130913391600190600401611be7565b600060405180830381600087803b1580156107a657600080fd5b505af11580156107ba573d6000803e3d6000fd5b5050505060006107ca338461149a565b336000908152600a60205260409020549091506107e8908290611cde565b336000818152600a602052604090209190915561080590846116ea565b815160208084015160408051338152928301939093528183015290517f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e9181900360600190a1505050565b42600b54106108925760405162461bcd60e51b815260206004820152600e60248201526d44495341424c45445f434c41494d60901b60448201526064016105a2565b336000908152600960205260409020546108e05760405162461bcd60e51b815260206004820152600f60248201526e1393d7d513d2d15397d4d51052d151608a1b60448201526064016105a2565b60005b3360009081526009602052604090205481101561091557610903816105fc565b8061090d81611d4e565b9150506108e3565b50565b60008060008060096000866001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156109b35783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610963565b505050506001600160a01b0386166000908152600a602090815260408083208151606081018352815481526001820154938101939093526002015490820152919250805b8351811015610a2857610a0a888261149a565b610a149083611cde565b915080610a2081611d4e565b9150506109f7565b508151600090610a389083611cde565b60208401516040909401519099939850965091945050505050565b6000610a5e3361110d565b905060008111610aa85760405162461bcd60e51b815260206004820152601560248201527416915493d7d0559052531050931157d05353d55395605a1b60448201526064016105a2565b600354600480546040516370a0823160e01b81526001600160a01b0391821692810192909252909116906370a082319060240160206040518083038186803b158015610af357600080fd5b505afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b9190611bac565b8110610b715760405162461bcd60e51b81526020600482015260156024820152742727aa2fa2a727aaa3a42fa827a22fa6a0a9aa22a960591b60448201526064016105a2565b600354600480546040516323b872dd60e01b81526001600160a01b039182169281019290925233602483015260448201849052909116906323b872dd90606401602060405180830381600087803b158015610bcb57600080fd5b505af1158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c039190611b47565b50336000908152600a6020526040902060010154610c22908290611cde565b336000818152600a602090815260409182902060018101949094554260029094019390935580519182529181018390527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a150565b6001600160a01b0381166000908152600960209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610d085783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610cb8565b505050509050919050565b6000546001600160a01b03163314610d3d5760405162461bcd60e51b81526004016105a290611c78565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d895760405162461bcd60e51b81526004016105a290611c78565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610dd55760405162461bcd60e51b81526004016105a290611c78565b610ddf600061183d565b565b60065433600090815260096020526040902054610dff906001611cde565b1115610e4d5760405162461bcd60e51b815260206004820152601860248201527f4558434545445f4d41585f57414c4c45545f5354414b4544000000000000000060448201526064016105a2565b6001546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec991906119a7565b6001600160a01b0316148015610f5d5750600254604051627eeac760e11b8152336004820152602481018390526000916001600160a01b03169062fdd58e9060440160206040518083038186803b158015610f2357600080fd5b505afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190611bac565b115b610fa05760405162461bcd60e51b81526020600482015260146024820152732727aa2fa127aa242faa27a5a2a72fa7aba722a960611b60448201526064016105a2565b600154604051632142170760e11b8152336004820152306024820152604481018490526001600160a01b03909116906342842e0e90606401600060405180830381600087803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b5050600254604051637921219560e11b81526001600160a01b03909116925063f242432a915061104190339030908690600190600401611be7565b600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b50503360008181526009602090815260408083208151606080820184528a82528185018a8152428386019081528454600180820187559589529787902093516003909802909301968755519286019290925551600290940193909355805193845290830187905282018590527f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90935001905060405180910390a15050565b600080600080600061111e86610918565b600b54929550909350915081101561113757506363b0cd005b600b54429081101561114c576000945061122c565b63659200808110611168576111618385611d37565b945061122c565b6008546111758383611d37565b1015611184576000945061122c565b806363b0cd001115801561119b57506363d9ab8081105b156111c15760646111ac8486611d37565b6111b7906014611d18565b6111619190611cf6565b6008546000906111d18484611d37565b6111db9190611cf6565b9050600060646111ed836102d7611d18565b6111f79190611cf6565b90506064811115611206575060645b6064816112138789611d37565b61121d9190611d18565b6112279190611cf6565b965050505b509295945050505050565b6000546001600160a01b031633146112615760405162461bcd60e51b81526004016105a290611c78565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600a602090815260408083208151606081018352815481526001820154938101939093526002015490820152600b5482919042908110156112e25780600b546112db9190611d37565b9250611316565b636592008081106112f65760009250611316565b8060085483604001516113099190611cde565b6113139190611d37565b92505b50909392505050565b600c818154811061132f57600080fd5b600091825260209091200154905081565b6000546001600160a01b0316331461136a5760405162461bcd60e51b81526004016105a290611c78565b600047116113a75760405162461bcd60e51b815260206004820152600a6024820152694e4f5f42414c414e434560b01b60448201526064016105a2565b60405133904780156108fc02916000818181858888f19350505050158015610915573d6000803e3d6000fd5b6000546001600160a01b031633146113fd5760405162461bcd60e51b81526004016105a290611c78565b6001600160a01b0381166114625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a2565b6109158161183d565b6000546001600160a01b031633146114955760405162461bcd60e51b81526004016105a290611c78565b600655565b6001600160a01b03821660009081526009602052604081205482106114be57600080fd5b6001600160a01b0383166000908152600960205260408120805482918291869081106114ec576114ec611d95565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008160400151905060005b600c548110156116de5742600c828154811061154f5761154f611d95565b9060005260206000200154101561165457600c818154811061157357611573611d95565b906000526020600020015482101561164f5781600c828154811061159957611599611d95565b90600052602060002001546115ae9190611d37565b6115b9906001611cde565b9350600854600d6000600c84815481106115d5576115d5611d95565b9060005260206000200154815260200190815260200160002054856115fa9190611d18565b61160c90670de0b6b3a7640000611d18565b6116169190611cf6565b6116209086611cde565b9450600c818154811061163557611635611d95565b9060005260206000200154600161164c9190611cde565b91505b6116cc565b61165e8242611d37565b9350600854600d6000600c848154811061167a5761167a611d95565b90600052602060002001548152602001908152602001600020548561169f9190611d18565b6116b190670de0b6b3a7640000611d18565b6116bb9190611cf6565b6116c59086611cde565b94506116de565b806116d681611d4e565b915050611531565b50929695505050505050565b6001600160a01b038216600090815260096020526040902054811061170d575050565b805b6001600160a01b03831660009081526009602052604090205461173490600190611d37565b8110156117ec576001600160a01b038316600090815260096020526040902061175e826001611cde565b8154811061176e5761176e611d95565b906000526020600020906003020160096000856001600160a01b03166001600160a01b0316815260200190815260200160002082815481106117b2576117b2611d95565b60009182526020909120825460039092020190815560018083015490820155600291820154910155806117e481611d4e565b91505061170f565b506001600160a01b038216600090815260096020526040902080548061181457611814611d7f565b600082815260208120600360001990930192830201818155600181018290556002015590555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082601f83011261189e57600080fd5b8135602067ffffffffffffffff8211156118ba576118ba611dab565b8160051b6118c9828201611cad565b8381528281019086840183880185018910156118e457600080fd5b600093505b858410156119075780358352600193909301929184019184016118e9565b50979650505050505050565b600082601f83011261192457600080fd5b813567ffffffffffffffff81111561193e5761193e611dab565b611951601f8201601f1916602001611cad565b81815284602083860101111561196657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561199557600080fd5b81356119a081611dc1565b9392505050565b6000602082840312156119b957600080fd5b81516119a081611dc1565b600080600080600060a086880312156119dc57600080fd5b85356119e781611dc1565b945060208601356119f781611dc1565b9350604086013567ffffffffffffffff80821115611a1457600080fd5b611a2089838a0161188d565b94506060880135915080821115611a3657600080fd5b611a4289838a0161188d565b93506080880135915080821115611a5857600080fd5b50611a6588828901611913565b9150509295509295909350565b60008060008060808587031215611a8857600080fd5b8435611a9381611dc1565b93506020850135611aa381611dc1565b925060408501359150606085013567ffffffffffffffff811115611ac657600080fd5b611ad287828801611913565b91505092959194509250565b600080600080600060a08688031215611af657600080fd5b8535611b0181611dc1565b94506020860135611b1181611dc1565b93506040860135925060608601359150608086013567ffffffffffffffff811115611b3b57600080fd5b611a6588828901611913565b600060208284031215611b5957600080fd5b815180151581146119a057600080fd5b600060208284031215611b7b57600080fd5b81356001600160e01b0319811681146119a057600080fd5b600060208284031215611ba557600080fd5b5035919050565b600060208284031215611bbe57600080fd5b5051919050565b60008060408385031215611bd857600080fd5b50508035926020909101359150565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b602080825282518282018190526000919060409081850190868401855b82811015611c6b5781518051855286810151878601528501518585015260609093019290850190600101611c3c565b5091979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611cd657611cd6611dab565b604052919050565b60008219821115611cf157611cf1611d69565b500190565b600082611d1357634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d3257611d32611d69565b500290565b600082821015611d4957611d49611d69565b500390565b6000600019821415611d6257611d62611d69565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461091557600080fdfea26469706673582212208fe90d7b749cc29780f05abcc44c73eee81eacb735fbe31ee733b964aca34ec364736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806376ea2fea1161010f578063bc197c81116100a2578063f2fde38b11610071578063f2fde38b14610453578063f30f6ae614610466578063f43dbe6014610479578063f5263f721461048c57600080fd5b8063bc197c81146103fa578063c5c577a814610419578063e086e5ec1461042c578063f23a6e611461043457600080fd5b8063975433e9116100de578063975433e9146103b8578063a6a11bb1146103cb578063ac195ca1146103d4578063b7bab3f7146103e757600080fd5b806376ea2fea146103785780637b0472f01461038157806389885049146103945780638da5cb5b146103a757600080fd5b806335322f3711610187578063558e644711610156578063558e6447146103375780635cf7d2f71461034a5780636e1d6aec1461035d578063715018a61461037057600080fd5b806335322f37146102d95780633626e177146102e15780634e71d92d1461030f57806352eb77961461031757600080fd5b8063150b7a02116101c3578063150b7a0214610267578063163920391461029e5780632533a5f6146102b35780632e17de78146102c657600080fd5b806301ffc9a7146101f5578063031745881461021d5780630bab5464146102485780631425aa341461025e575b600080fd5b610208610203366004611b69565b6104ac565b60405190151581526020015b60405180910390f35b600254610230906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b6102506104e3565b604051908152602001610214565b61025060075481565b610285610275366004611a72565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b6102b16102ac366004611983565b610578565b005b6102b16102c1366004611b93565b6105cd565b6102b16102d4366004611b93565b6105fc565b6102b1610850565b6102f46102ef366004611983565b610918565b60408051938452602084019290925290820152606001610214565b6102b1610a53565b61032a610325366004611983565b610c80565b6040516102149190611c1f565b6102b1610345366004611983565b610d13565b6102b1610358366004611983565b610d5f565b600454610230906001600160a01b031681565b6102b1610dab565b61025060065481565b6102b161038f366004611bc5565b610de1565b6102506103a2366004611983565b61110d565b6000546001600160a01b0316610230565b600154610230906001600160a01b031681565b610250600b5481565b6102b16103e2366004611983565b611237565b6102506103f5366004611983565b611283565b6102856104083660046119c4565b63bc197c8160e01b95945050505050565b610250610427366004611b93565b61131f565b6102b1611340565b610285610442366004611ade565b63f23a6e6160e01b95945050505050565b6102b1610461366004611983565b6113d3565b600354610230906001600160a01b031681565b6102b1610487366004611b93565b61146b565b61025061049a366004611b93565b600d6020526000908152604090205481565b60006001600160e01b03198216630271189760e51b14806104dd57506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080805b600c54811161057257600c818154811061050457610504611d95565b9060005260206000200154421161056057600d6000600c838154811061052c5761052c611d95565b9060005260206000200154815260200190815260200160002054670de0b6b3a76400006105599190611d18565b9150610572565b8061056a81611d4e565b9150506104e8565b50919050565b6000546001600160a01b031633146105ab5760405162461bcd60e51b81526004016105a290611c78565b60405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146105f75760405162461bcd60e51b81526004016105a290611c78565b600b55565b42600b541061063e5760405162461bcd60e51b815260206004820152600e60248201526d44495341424c45445f434c41494d60901b60448201526064016105a2565b33600090815260096020526040902054811061068d5760405162461bcd60e51b815260206004820152600e60248201526d15d493d391d7d4d51052d157d25160921b60448201526064016105a2565b3360009081526009602052604081208054839081106106ae576106ae611d95565b6000918252602091829020604080516060810182526003939093029091018054808452600180830154958501959095526002909101548383015292549051632142170760e11b815230600482015233602482015260448101939093529092506001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561073a57600080fd5b505af115801561074e573d6000803e3d6000fd5b50506002546020840151604051637921219560e11b81526001600160a01b03909216935063f242432a925061078c9130913391600190600401611be7565b600060405180830381600087803b1580156107a657600080fd5b505af11580156107ba573d6000803e3d6000fd5b5050505060006107ca338461149a565b336000908152600a60205260409020549091506107e8908290611cde565b336000818152600a602052604090209190915561080590846116ea565b815160208084015160408051338152928301939093528183015290517f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e9181900360600190a1505050565b42600b54106108925760405162461bcd60e51b815260206004820152600e60248201526d44495341424c45445f434c41494d60901b60448201526064016105a2565b336000908152600960205260409020546108e05760405162461bcd60e51b815260206004820152600f60248201526e1393d7d513d2d15397d4d51052d151608a1b60448201526064016105a2565b60005b3360009081526009602052604090205481101561091557610903816105fc565b8061090d81611d4e565b9150506108e3565b50565b60008060008060096000866001600160a01b03166001600160a01b03168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156109b35783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610963565b505050506001600160a01b0386166000908152600a602090815260408083208151606081018352815481526001820154938101939093526002015490820152919250805b8351811015610a2857610a0a888261149a565b610a149083611cde565b915080610a2081611d4e565b9150506109f7565b508151600090610a389083611cde565b60208401516040909401519099939850965091945050505050565b6000610a5e3361110d565b905060008111610aa85760405162461bcd60e51b815260206004820152601560248201527416915493d7d0559052531050931157d05353d55395605a1b60448201526064016105a2565b600354600480546040516370a0823160e01b81526001600160a01b0391821692810192909252909116906370a082319060240160206040518083038186803b158015610af357600080fd5b505afa158015610b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2b9190611bac565b8110610b715760405162461bcd60e51b81526020600482015260156024820152742727aa2fa2a727aaa3a42fa827a22fa6a0a9aa22a960591b60448201526064016105a2565b600354600480546040516323b872dd60e01b81526001600160a01b039182169281019290925233602483015260448201849052909116906323b872dd90606401602060405180830381600087803b158015610bcb57600080fd5b505af1158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c039190611b47565b50336000908152600a6020526040902060010154610c22908290611cde565b336000818152600a602090815260409182902060018101949094554260029094019390935580519182529181018390527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a150565b6001600160a01b0381166000908152600960209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610d085783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610cb8565b505050509050919050565b6000546001600160a01b03163314610d3d5760405162461bcd60e51b81526004016105a290611c78565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610d895760405162461bcd60e51b81526004016105a290611c78565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610dd55760405162461bcd60e51b81526004016105a290611c78565b610ddf600061183d565b565b60065433600090815260096020526040902054610dff906001611cde565b1115610e4d5760405162461bcd60e51b815260206004820152601860248201527f4558434545445f4d41585f57414c4c45545f5354414b4544000000000000000060448201526064016105a2565b6001546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610e9157600080fd5b505afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec991906119a7565b6001600160a01b0316148015610f5d5750600254604051627eeac760e11b8152336004820152602481018390526000916001600160a01b03169062fdd58e9060440160206040518083038186803b158015610f2357600080fd5b505afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b9190611bac565b115b610fa05760405162461bcd60e51b81526020600482015260146024820152732727aa2fa127aa242faa27a5a2a72fa7aba722a960611b60448201526064016105a2565b600154604051632142170760e11b8152336004820152306024820152604481018490526001600160a01b03909116906342842e0e90606401600060405180830381600087803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b5050600254604051637921219560e11b81526001600160a01b03909116925063f242432a915061104190339030908690600190600401611be7565b600060405180830381600087803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b50503360008181526009602090815260408083208151606080820184528a82528185018a8152428386019081528454600180820187559589529787902093516003909802909301968755519286019290925551600290940193909355805193845290830187905282018590527f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90935001905060405180910390a15050565b600080600080600061111e86610918565b600b54929550909350915081101561113757506363b0cd005b600b54429081101561114c576000945061122c565b63659200808110611168576111618385611d37565b945061122c565b6008546111758383611d37565b1015611184576000945061122c565b806363b0cd001115801561119b57506363d9ab8081105b156111c15760646111ac8486611d37565b6111b7906014611d18565b6111619190611cf6565b6008546000906111d18484611d37565b6111db9190611cf6565b9050600060646111ed836102d7611d18565b6111f79190611cf6565b90506064811115611206575060645b6064816112138789611d37565b61121d9190611d18565b6112279190611cf6565b965050505b509295945050505050565b6000546001600160a01b031633146112615760405162461bcd60e51b81526004016105a290611c78565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600a602090815260408083208151606081018352815481526001820154938101939093526002015490820152600b5482919042908110156112e25780600b546112db9190611d37565b9250611316565b636592008081106112f65760009250611316565b8060085483604001516113099190611cde565b6113139190611d37565b92505b50909392505050565b600c818154811061132f57600080fd5b600091825260209091200154905081565b6000546001600160a01b0316331461136a5760405162461bcd60e51b81526004016105a290611c78565b600047116113a75760405162461bcd60e51b815260206004820152600a6024820152694e4f5f42414c414e434560b01b60448201526064016105a2565b60405133904780156108fc02916000818181858888f19350505050158015610915573d6000803e3d6000fd5b6000546001600160a01b031633146113fd5760405162461bcd60e51b81526004016105a290611c78565b6001600160a01b0381166114625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a2565b6109158161183d565b6000546001600160a01b031633146114955760405162461bcd60e51b81526004016105a290611c78565b600655565b6001600160a01b03821660009081526009602052604081205482106114be57600080fd5b6001600160a01b0383166000908152600960205260408120805482918291869081106114ec576114ec611d95565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008160400151905060005b600c548110156116de5742600c828154811061154f5761154f611d95565b9060005260206000200154101561165457600c818154811061157357611573611d95565b906000526020600020015482101561164f5781600c828154811061159957611599611d95565b90600052602060002001546115ae9190611d37565b6115b9906001611cde565b9350600854600d6000600c84815481106115d5576115d5611d95565b9060005260206000200154815260200190815260200160002054856115fa9190611d18565b61160c90670de0b6b3a7640000611d18565b6116169190611cf6565b6116209086611cde565b9450600c818154811061163557611635611d95565b9060005260206000200154600161164c9190611cde565b91505b6116cc565b61165e8242611d37565b9350600854600d6000600c848154811061167a5761167a611d95565b90600052602060002001548152602001908152602001600020548561169f9190611d18565b6116b190670de0b6b3a7640000611d18565b6116bb9190611cf6565b6116c59086611cde565b94506116de565b806116d681611d4e565b915050611531565b50929695505050505050565b6001600160a01b038216600090815260096020526040902054811061170d575050565b805b6001600160a01b03831660009081526009602052604090205461173490600190611d37565b8110156117ec576001600160a01b038316600090815260096020526040902061175e826001611cde565b8154811061176e5761176e611d95565b906000526020600020906003020160096000856001600160a01b03166001600160a01b0316815260200190815260200160002082815481106117b2576117b2611d95565b60009182526020909120825460039092020190815560018083015490820155600291820154910155806117e481611d4e565b91505061170f565b506001600160a01b038216600090815260096020526040902080548061181457611814611d7f565b600082815260208120600360001990930192830201818155600181018290556002015590555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082601f83011261189e57600080fd5b8135602067ffffffffffffffff8211156118ba576118ba611dab565b8160051b6118c9828201611cad565b8381528281019086840183880185018910156118e457600080fd5b600093505b858410156119075780358352600193909301929184019184016118e9565b50979650505050505050565b600082601f83011261192457600080fd5b813567ffffffffffffffff81111561193e5761193e611dab565b611951601f8201601f1916602001611cad565b81815284602083860101111561196657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561199557600080fd5b81356119a081611dc1565b9392505050565b6000602082840312156119b957600080fd5b81516119a081611dc1565b600080600080600060a086880312156119dc57600080fd5b85356119e781611dc1565b945060208601356119f781611dc1565b9350604086013567ffffffffffffffff80821115611a1457600080fd5b611a2089838a0161188d565b94506060880135915080821115611a3657600080fd5b611a4289838a0161188d565b93506080880135915080821115611a5857600080fd5b50611a6588828901611913565b9150509295509295909350565b60008060008060808587031215611a8857600080fd5b8435611a9381611dc1565b93506020850135611aa381611dc1565b925060408501359150606085013567ffffffffffffffff811115611ac657600080fd5b611ad287828801611913565b91505092959194509250565b600080600080600060a08688031215611af657600080fd5b8535611b0181611dc1565b94506020860135611b1181611dc1565b93506040860135925060608601359150608086013567ffffffffffffffff811115611b3b57600080fd5b611a6588828901611913565b600060208284031215611b5957600080fd5b815180151581146119a057600080fd5b600060208284031215611b7b57600080fd5b81356001600160e01b0319811681146119a057600080fd5b600060208284031215611ba557600080fd5b5035919050565b600060208284031215611bbe57600080fd5b5051919050565b60008060408385031215611bd857600080fd5b50508035926020909101359150565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b602080825282518282018190526000919060409081850190868401855b82811015611c6b5781518051855286810151878601528501518585015260609093019290850190600101611c3c565b5091979650505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611cd657611cd6611dab565b604052919050565b60008219821115611cf157611cf1611d69565b500190565b600082611d1357634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d3257611d32611d69565b500290565b600082821015611d4957611d49611d69565b500390565b6000600019821415611d6257611d62611d69565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461091557600080fdfea26469706673582212208fe90d7b749cc29780f05abcc44c73eee81eacb735fbe31ee733b964aca34ec364736f6c63430008070033
Deployed Bytecode Sourcemap
22909:10181:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8897:223;;;;;;:::i;:::-;;:::i;:::-;;;8346:14:1;;8339:22;8321:41;;8309:2;8294:18;8897:223:0;;;;;;;;23057:76;;;;;-1:-1:-1;;;;;23057:76:0;;;;;;-1:-1:-1;;;;;5634:32:1;;;5616:51;;5604:2;5589:18;23057:76:0;5470:203:1;31749:419:0;;;:::i;:::-;;;12265:25:1;;;12253:2;12238:18;31749:419:0;12119:177:1;23415:52:0;;;;;;16492:207;;;;;;:::i;:::-;-1:-1:-1;;;16492:207:0;;;;;;;;;;-1:-1:-1;;;;;;8535:33:1;;;8517:52;;8505:2;8490:18;16492:207:0;8373:202:1;32320:114:0;;;;;;:::i;:::-;;:::i;:::-;;32786:124;;;;;;:::i;:::-;;:::i;27967:799::-;;;;;;:::i;:::-;;:::i;28772:280::-;;;:::i;26639:632::-;;;;;;:::i;:::-;;:::i;:::-;;;;12503:25:1;;;12559:2;12544:18;;12537:34;;;;12587:18;;;12580:34;12491:2;12476:18;26639:632:0;12301:319:1;31200:541:0;;;:::i;24976:126::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32548:118::-;;;;;;:::i;:::-;;:::i;32198:116::-;;;;;;:::i;:::-;;:::i;23217:78::-;;;;;-1:-1:-1;;;;;23217:78:0;;;19230:103;;;:::i;23373:35::-;;;;;;27277:684;;;;;;:::i;:::-;;:::i;29058:1520::-;;;;;;:::i;:::-;;:::i;18583:87::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;18583:87;;22973:77;;;;;-1:-1:-1;;;;;22973:77:0;;;23903:42;;;;;;32440:102;;;;;;:::i;:::-;;:::i;30584:610::-;;;;;;:::i;:::-;;:::i;9850:255::-;;;;;;:::i;:::-;-1:-1:-1;;;9850:255:0;;;;;;;;23980:125;;;;;;:::i;:::-;;:::i;32916:171::-;;;:::i;9617:227::-;;;;;;:::i;:::-;-1:-1:-1;;;9617:227:0;;;;;;;;19486:201;;;;;;:::i;:::-;;:::i;23140:70::-;;;;;-1:-1:-1;;;;;23140:70:0;;;32672:108;;;;;;:::i;:::-;;:::i;24113:60::-;;;;;;:::i;:::-;;;;;;;;;;;;;;8897:223;8999:4;-1:-1:-1;;;;;;9023:49:0;;-1:-1:-1;;;9023:49:0;;:89;;-1:-1:-1;;;;;;;;;;6000:40:0;;;9076:36;9016:96;8897:223;-1:-1:-1;;8897:223:0:o;31749:419::-;31803:7;;;31866:266;31887:21;:28;31884:31;;31866:266;;31960:21;31982:1;31960:24;;;;;;;;:::i;:::-;;;;;;;;;31941:15;:43;31937:184;;32019:25;:51;32045:21;32067:1;32045:24;;;;;;;;:::i;:::-;;;;;;;;;32019:51;;;;;;;;;;;;32073:8;32019:62;;;;:::i;:::-;32005:76;;32100:5;;31937:184;31917:3;;;;:::i;:::-;;;;31866:266;;;-1:-1:-1;32149:11:0;31749:419;-1:-1:-1;31749:419:0:o;32320:114::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;;;;;;;;;32397:16:::1;:29:::0;;-1:-1:-1;;;;;;32397:29:0::1;-1:-1:-1::0;;;;;32397:29:0;;;::::1;::::0;;;::::1;::::0;;32320:114::o;32786:124::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;32868:14:::1;:34:::0;32786:124::o;27967:799::-;28044:15;28027:14;;:32;28019:59;;;;-1:-1:-1;;;28019:59:0;;11625:2:1;28019:59:0;;;11607:21:1;11664:2;11644:18;;;11637:30;-1:-1:-1;;;11683:18:1;;;11676:44;11737:18;;28019:59:0;11423:338:1;28019:59:0;28114:10;28105:20;;;;:8;:20;;;;;:27;28097:35;;28089:62;;;;-1:-1:-1;;;28089:62:0;;11282:2:1;28089:62:0;;;11264:21:1;11321:2;11301:18;;;11294:30;-1:-1:-1;;;11340:18:1;;;11333:44;11394:18;;28089:62:0;11080:338:1;28089:62:0;28205:10;28162:31;28196:20;;;:8;:20;;;;;:29;;28217:7;;28196:29;;;;;;:::i;:::-;;;;;;;;;;28162:63;;;;;;;;28196:29;;;;;;;;28162:63;;;;;;;;;;;;;;;;;;;;;;;;;;28244:17;;28236:92;;-1:-1:-1;;;28236:92:0;;28288:4;28236:92;;;5918:34:1;28295:10:0;5968:18:1;;;5961:43;6020:18;;;6013:34;;;;28162:63:0;;-1:-1:-1;;;;;;28244:17:0;;28236:43;;5853:18:1;;28236:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28348:16:0;;28410:20;;;;28339:99;;-1:-1:-1;;;28339:99:0;;-1:-1:-1;;;;;28348:16:0;;;;-1:-1:-1;28339:43:0;;-1:-1:-1;28339:99:0;;28391:4;;28398:10;;28348:16;;28339:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28449:22;28474:38;28492:10;28504:7;28474:17;:38::i;:::-;28589:10;28574:26;;;;:14;:26;;;;;:48;28449:63;;-1:-1:-1;28574:65:0;;28449:63;;28574:65;:::i;:::-;28538:10;28523:26;;;;:14;:26;;;;;:116;;;;28650:28;;28670:7;28650;:28::i;:::-;28715:20;;28737;;;;;28694:64;;;28703:10;7179:51:1;;7246:18;;;7239:34;;;;7289:18;;;7282:34;28694:64:0;;;;;;;7167:2:1;28694:64:0;;;28008:758;;27967:799;:::o;28772:280::-;28837:15;28820:14;;:32;28812:59;;;;-1:-1:-1;;;28812:59:0;;11625:2:1;28812:59:0;;;11607:21:1;11664:2;11644:18;;;11637:30;-1:-1:-1;;;11683:18:1;;;11676:44;11737:18;;28812:59:0;11423:338:1;28812:59:0;28899:10;28918:1;28890:20;;;:8;:20;;;;;:27;28882:57;;;;-1:-1:-1;;;28882:57:0;;9189:2:1;28882:57:0;;;9171:21:1;9228:2;9208:18;;;9201:30;-1:-1:-1;;;9247:18:1;;;9240:45;9302:18;;28882:57:0;8987:339:1;28882:57:0;28955:9;28950:95;28983:10;28974:20;;;;:8;:20;;;;;:27;28970:31;;28950:95;;;29023:10;29031:1;29023:7;:10::i;:::-;29003:3;;;;:::i;:::-;;;;28950:95;;;;28772:280::o;26639:632::-;26704:20;26726:21;26749;26783:33;26819:8;:16;26828:6;-1:-1:-1;;;;;26819:16:0;-1:-1:-1;;;;;26819:16:0;;;;;;;;;;;;26783:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;26880:22:0;;26846:31;26880:22;;;:14;:22;;;;;;;;26846:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26783:52;;-1:-1:-1;26846:31:0;26950:139;26974:12;:19;26970:1;:23;26950:139;;;27049:28;27067:6;27075:1;27049:17;:28::i;:::-;27032:45;;:14;:45;:::i;:::-;27015:62;-1:-1:-1;26995:3:0;;;;:::i;:::-;;;;26950:139;;;-1:-1:-1;27140:34:0;;27099:21;;27123:51;;:14;:51;:::i;:::-;27208:26;;;;27236;;;;;27099:75;;27208:26;;-1:-1:-1;27236:26:0;-1:-1:-1;26639:632:0;;-1:-1:-1;;;;;26639:632:0:o;31200:541::-;31235:14;31252:27;31268:10;31252:15;:27::i;:::-;31235:44;;31307:1;31298:6;:10;31290:44;;;;-1:-1:-1;;;31290:44:0;;10222:2:1;31290:44:0;;;10204:21:1;10261:2;10241:18;;;10234:30;-1:-1:-1;;;10280:18:1;;;10273:51;10341:18;;31290:44:0;10020:345:1;31290:44:0;31369:10;;31391:18;;;31362:48;;-1:-1:-1;;;31362:48:0;;-1:-1:-1;;;;;31391:18:0;;;31362:48;;;5616:51:1;;;;31369:10:0;;;;31362:28;;5589:18:1;;31362:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31353:6;:57;31345:91;;;;-1:-1:-1;;;31345:91:0;;9872:2:1;31345:91:0;;;9854:21:1;9911:2;9891:18;;;9884:30;-1:-1:-1;;;9930:18:1;;;9923:51;9991:18;;31345:91:0;9670:345:1;31345:91:0;31454:10;;31479:18;;;31447:71;;-1:-1:-1;;;31447:71:0;;-1:-1:-1;;;;;31479:18:0;;;31447:71;;;5918:34:1;;;;31499:10:0;5968:18:1;;;5961:43;6020:18;;;6013:34;;;31454:10:0;;;;31447:31;;5853:18:1;;31447:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;31587:10:0;31572:26;;;;:14;:26;;;;;:40;;;:49;;31615:6;;31572:49;:::i;:::-;31544:10;31529:26;;;;:14;:26;;;;;;;;;:40;;;:92;;;;31675:15;31632:40;;;;:58;;;;31706:27;;6872:51:1;;;6939:18;;;6932:34;;;31706:27:0;;6845:18:1;31706:27:0;;;;;;;31224:517;31200:541::o;24976:126::-;-1:-1:-1;;;;;25078:16:0;;;;;;:8;:16;;;;;;;;25071:23;;;;;;;;;;;;;;;;;25038:20;;25071:23;;25078:16;;25071:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24976:126;;;:::o;32548:118::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;32627:18:::1;:31:::0;;-1:-1:-1;;;;;;32627:31:0::1;-1:-1:-1::0;;;;;32627:31:0;;;::::1;::::0;;;::::1;::::0;;32548:118::o;32198:116::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;32276:17:::1;:30:::0;;-1:-1:-1;;;;;;32276:30:0::1;-1:-1:-1::0;;;;;32276:30:0;;;::::1;::::0;;;::::1;::::0;;32198:116::o;19230:103::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;19295:30:::1;19322:1;19295:18;:30::i;:::-;19230:103::o:0;27277:684::-;27383:15;;27361:10;27352:20;;;;:8;:20;;;;;:27;:29;;27380:1;27352:29;:::i;:::-;:46;;27344:83;;;;-1:-1:-1;;;27344:83:0;;11968:2:1;27344:83:0;;;11950:21:1;12007:2;11987:18;;;11980:30;12046:26;12026:18;;;12019:54;12090:18;;27344:83:0;11766:348:1;27344:83:0;27468:17;;27460:43;;-1:-1:-1;;;27460:43:0;;;;;12265:25:1;;;27507:10:0;;-1:-1:-1;;;;;27468:17:0;;27460:34;;12238:18:1;;27460:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;27460:57:0;;:122;;;;-1:-1:-1;27530:16:0;;27521:57;;-1:-1:-1;;;27521:57:0;;27558:10;27521:57;;;6872:51:1;6939:18;;;6932:34;;;27581:1:0;;-1:-1:-1;;;;;27530:16:0;;27521:36;;6845:18:1;;27521:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;27460:122;27438:192;;;;-1:-1:-1;;;27438:192:0;;10933:2:1;27438:192:0;;;10915:21:1;10972:2;10952:18;;;10945:30;-1:-1:-1;;;10991:18:1;;;10984:50;11051:18;;27438:192:0;10731:344:1;27438:192:0;27649:17;;27641:79;;-1:-1:-1;;;27641:79:0;;27685:10;27641:79;;;5918:34:1;27705:4:0;5968:18:1;;;5961:43;6020:18;;;6013:34;;;-1:-1:-1;;;;;27649:17:0;;;;27641:43;;5853:18:1;;27641:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27740:16:0;;27731:86;;-1:-1:-1;;;27731:86:0;;-1:-1:-1;;;;;27740:16:0;;;;-1:-1:-1;27731:43:0;;-1:-1:-1;27731:86:0;;27775:10;;27795:4;;27802:7;;27740:16;;27731:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27837:10:0;27828:20;;;;:8;:20;;;;;;;;27854:46;;;;;;;;;;;;;;;;;27884:15;27854:46;;;;;;27828:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27917:36;;7179:51:1;;;7246:18;;;7239:34;;;7289:18;;7282:34;;;27917:36:0;;-1:-1:-1;7152:18:1;;-1:-1:-1;27917:36:0;;;;;;;27277:684;;:::o;29058:1520::-;29120:7;29140:24;29175:21;29207:22;29240:23;29325:26;29344:6;29325:18;:26::i;:::-;29384:14;;29274:77;;-1:-1:-1;29274:77:0;;-1:-1:-1;29274:77:0;-1:-1:-1;29366:32:0;;29362:66;;;-1:-1:-1;29418:10:0;29362:66;29503:14;;29460:15;;29490:27;;29486:1051;;;29546:1;29519:29;;29486:1051;;;29597:10;29583;:24;29579:947;;29665:30;29681:14;29665:13;:30;:::i;:::-;29646:49;;29579:947;;;29773:15;;29741:28;29754:15;29741:10;:28;:::i;:::-;29740:48;29736:775;;;29840:1;29813:29;;29736:775;;;29909:10;29895;:24;;:51;;;;;29936:10;29923;:23;29895:51;29891:601;;;30065:3;30026:30;30042:14;30026:13;:30;:::i;:::-;30025:37;;30060:2;30025:37;:::i;:::-;:43;;;;:::i;29891:601::-;30188:15;;30132:20;;30156:28;30169:15;30156:10;:28;:::i;:::-;30155:48;;;;:::i;:::-;30132:71;-1:-1:-1;30230:21:0;30275:3;30254:18;30132:71;30269:3;30254:18;:::i;:::-;:24;;;;:::i;:::-;30230:48;;30344:3;30328:13;:19;30324:44;;;-1:-1:-1;30365:3:0;30324:44;30465:3;30449:13;30415:30;30431:14;30415:13;:30;:::i;:::-;30414:48;;;;:::i;:::-;:54;;;;:::i;:::-;30395:73;;30105:387;;29891:601;-1:-1:-1;30554:16:0;;29058:1520;-1:-1:-1;;;;;29058:1520:0:o;32440:102::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;32511:10:::1;:23:::0;;-1:-1:-1;;;;;;32511:23:0::1;-1:-1:-1::0;;;;;32511:23:0;;;::::1;::::0;;;::::1;::::0;;32440:102::o;30584:610::-;-1:-1:-1;;;;;30735:22:0;;30649:7;30735:22;;;:14;:22;;;;;;;;30701:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30832:14;;30649:7;;30701:56;30789:15;;30819:27;;30815:341;;;30881:10;30864:14;;:27;;;;:::i;:::-;30848:43;;30815:341;;;30940:10;30926;:24;30922:223;;31013:1;30989:26;;30922:223;;;31119:10;31101:15;;31072:12;:26;;;:44;;;;:::i;:::-;:57;;;;:::i;:::-;31056:73;;30922:223;-1:-1:-1;31173:13:0;;30584:610;-1:-1:-1;;;30584:610:0:o;23980:125::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23980:125:0;:::o;32916:171::-;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;33001:1:::1;32977:21;:25;32969:48;;;::::0;-1:-1:-1;;;32969:48:0;;9533:2:1;32969:48:0::1;::::0;::::1;9515:21:1::0;9572:2;9552:18;;;9545:30;-1:-1:-1;;;9591:18:1;;;9584:40;9641:18;;32969:48:0::1;9331:334:1::0;32969:48:0::1;33028:51;::::0;33036:10:::1;::::0;33057:21:::1;33028:51:::0;::::1;;;::::0;::::1;::::0;;;33057:21;33036:10;33028:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;19486:201:::0;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19575:22:0;::::1;19567:73;;;::::0;-1:-1:-1;;;19567:73:0;;8782:2:1;19567:73:0::1;::::0;::::1;8764:21:1::0;8821:2;8801:18;;;8794:30;8860:34;8840:18;;;8833:62;-1:-1:-1;;;8911:18:1;;;8904:36;8957:19;;19567:73:0::1;8580:402:1::0;19567:73:0::1;19651:28;19670:8;19651:18;:28::i;32672:108::-:0;18629:7;18656:6;-1:-1:-1;;;;;18656:6:0;17430:10;18801:23;18793:68;;;;-1:-1:-1;;;18793:68:0;;;;;;;:::i;:::-;32746:15:::1;:26:::0;32672:108::o;25405:1228::-;-1:-1:-1;;;;;25524:16:0;;25488:7;25524:16;;;:8;:16;;;;;:23;25516:31;;25508:40;;;;;;-1:-1:-1;;;;;25697:16:0;;25559:15;25697:16;;;:8;:16;;;;;:25;;25559:15;;;;25714:7;;25697:25;;;;;;:::i;:::-;;;;;;;;;;;25663:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25733:15;25751:12;:21;;;25733:39;;25827:9;25822:779;25842:21;:28;25840:30;;25822:779;;;25923:15;25896:21;25918:1;25896:24;;;;;;;;:::i;:::-;;;;;;;;;:42;25892:698;;;25973:21;25995:1;25973:24;;;;;;;;:::i;:::-;;;;;;;;;25963:7;:34;25959:333;;;26063:7;26036:21;26058:1;26036:24;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;:::i;:::-;:38;;26073:1;26036:38;:::i;:::-;26022:52;;26196:15;;26131:25;:51;26157:21;26179:1;26157:24;;;;;;;;:::i;:::-;;;;;;;;;26131:51;;;;;;;;;;;;26117:11;:65;;;;:::i;:::-;:76;;26185:8;26117:76;:::i;:::-;:94;;;;:::i;:::-;26107:104;;:7;:104;:::i;:::-;26097:114;;26244:21;26266:1;26244:24;;;;;;;;:::i;:::-;;;;;;;;;26271:1;26244:28;;;;:::i;:::-;26234:38;;25959:333;25892:698;;;26366:25;26384:7;26366:15;:25;:::i;:::-;26352:39;;26510:15;;26445:25;:51;26471:21;26493:1;26471:24;;;;;;;;:::i;:::-;;;;;;;;;26445:51;;;;;;;;;;;;26431:11;:65;;;;:::i;:::-;:76;;26499:8;26431:76;:::i;:::-;:94;;;;:::i;:::-;26421:104;;:7;:104;:::i;:::-;26411:114;;26544:5;;25892:698;25872:3;;;;:::i;:::-;;;;25822:779;;;-1:-1:-1;26618:7:0;;25405:1228;-1:-1:-1;;;;;;25405:1228:0:o;25108:291::-;-1:-1:-1;;;;;25189:16:0;;;;;;:8;:16;;;;;:23;25180:32;;25176:45;;25108:291;;:::o;25176:45::-;25246:5;25231:128;-1:-1:-1;;;;;25255:16:0;;;;;;:8;:16;;;;;:23;:25;;25279:1;;25255:25;:::i;:::-;25253:1;:27;25231:128;;;-1:-1:-1;;;;;25324:16:0;;;;;;:8;:16;;;;;25341:5;:1;25345;25341:5;:::i;:::-;25324:23;;;;;;;;:::i;:::-;;;;;;;;;;;25302:8;:16;25311:6;-1:-1:-1;;;;;25302:16:0;-1:-1:-1;;;;;25302:16:0;;;;;;;;;;;;25319:1;25302:19;;;;;;;;:::i;:::-;;;;;;;;;:45;;:19;;;;;:45;;;;;;;;;;;;;;;;;;;;25282:3;;;;:::i;:::-;;;;25231:128;;;-1:-1:-1;;;;;;25369:16:0;;;;;;:8;:16;;;;;:22;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;25369:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25108:291:0:o;19845:191::-;19919:16;19938:6;;-1:-1:-1;;;;;19955:17:0;;;-1:-1:-1;;;;;;19955:17:0;;;;;;19988:40;;19938:6;;;;;;;19988:40;;19919:16;19988:40;19908:128;19845:191;:::o;14:723:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;224:18;220:2;217:26;214:52;;;246:18;;:::i;:::-;292:2;289:1;285:10;315:28;339:2;335;331:11;315:28;:::i;:::-;377:15;;;408:12;;;;440:15;;;474;;;470:24;;467:33;-1:-1:-1;464:53:1;;;513:1;510;503:12;464:53;535:1;526:10;;545:163;559:2;556:1;553:9;545:163;;;616:17;;604:30;;577:1;570:9;;;;;654:12;;;;686;;545:163;;;-1:-1:-1;726:5:1;14:723;-1:-1:-1;;;;;;;14:723:1:o;742:530::-;784:5;837:3;830:4;822:6;818:17;814:27;804:55;;855:1;852;845:12;804:55;891:6;878:20;917:18;913:2;910:26;907:52;;;939:18;;:::i;:::-;983:55;1026:2;1007:13;;-1:-1:-1;;1003:27:1;1032:4;999:38;983:55;:::i;:::-;1063:2;1054:7;1047:19;1109:3;1102:4;1097:2;1089:6;1085:15;1081:26;1078:35;1075:55;;;1126:1;1123;1116:12;1075:55;1191:2;1184:4;1176:6;1172:17;1165:4;1156:7;1152:18;1139:55;1239:1;1214:16;;;1232:4;1210:27;1203:38;;;;1218:7;742:530;-1:-1:-1;;;742:530:1:o;1277:247::-;1336:6;1389:2;1377:9;1368:7;1364:23;1360:32;1357:52;;;1405:1;1402;1395:12;1357:52;1444:9;1431:23;1463:31;1488:5;1463:31;:::i;:::-;1513:5;1277:247;-1:-1:-1;;;1277:247:1:o;1529:251::-;1599:6;1652:2;1640:9;1631:7;1627:23;1623:32;1620:52;;;1668:1;1665;1658:12;1620:52;1700:9;1694:16;1719:31;1744:5;1719:31;:::i;1785:1071::-;1939:6;1947;1955;1963;1971;2024:3;2012:9;2003:7;1999:23;1995:33;1992:53;;;2041:1;2038;2031:12;1992:53;2080:9;2067:23;2099:31;2124:5;2099:31;:::i;:::-;2149:5;-1:-1:-1;2206:2:1;2191:18;;2178:32;2219:33;2178:32;2219:33;:::i;:::-;2271:7;-1:-1:-1;2329:2:1;2314:18;;2301:32;2352:18;2382:14;;;2379:34;;;2409:1;2406;2399:12;2379:34;2432:61;2485:7;2476:6;2465:9;2461:22;2432:61;:::i;:::-;2422:71;;2546:2;2535:9;2531:18;2518:32;2502:48;;2575:2;2565:8;2562:16;2559:36;;;2591:1;2588;2581:12;2559:36;2614:63;2669:7;2658:8;2647:9;2643:24;2614:63;:::i;:::-;2604:73;;2730:3;2719:9;2715:19;2702:33;2686:49;;2760:2;2750:8;2747:16;2744:36;;;2776:1;2773;2766:12;2744:36;;2799:51;2842:7;2831:8;2820:9;2816:24;2799:51;:::i;:::-;2789:61;;;1785:1071;;;;;;;;:::o;2861:665::-;2956:6;2964;2972;2980;3033:3;3021:9;3012:7;3008:23;3004:33;3001:53;;;3050:1;3047;3040:12;3001:53;3089:9;3076:23;3108:31;3133:5;3108:31;:::i;:::-;3158:5;-1:-1:-1;3215:2:1;3200:18;;3187:32;3228:33;3187:32;3228:33;:::i;:::-;3280:7;-1:-1:-1;3334:2:1;3319:18;;3306:32;;-1:-1:-1;3389:2:1;3374:18;;3361:32;3416:18;3405:30;;3402:50;;;3448:1;3445;3438:12;3402:50;3471:49;3512:7;3503:6;3492:9;3488:22;3471:49;:::i;:::-;3461:59;;;2861:665;;;;;;;:::o;3531:734::-;3635:6;3643;3651;3659;3667;3720:3;3708:9;3699:7;3695:23;3691:33;3688:53;;;3737:1;3734;3727:12;3688:53;3776:9;3763:23;3795:31;3820:5;3795:31;:::i;:::-;3845:5;-1:-1:-1;3902:2:1;3887:18;;3874:32;3915:33;3874:32;3915:33;:::i;:::-;3967:7;-1:-1:-1;4021:2:1;4006:18;;3993:32;;-1:-1:-1;4072:2:1;4057:18;;4044:32;;-1:-1:-1;4127:3:1;4112:19;;4099:33;4155:18;4144:30;;4141:50;;;4187:1;4184;4177:12;4141:50;4210:49;4251:7;4242:6;4231:9;4227:22;4210:49;:::i;4270:277::-;4337:6;4390:2;4378:9;4369:7;4365:23;4361:32;4358:52;;;4406:1;4403;4396:12;4358:52;4438:9;4432:16;4491:5;4484:13;4477:21;4470:5;4467:32;4457:60;;4513:1;4510;4503:12;4552:286;4610:6;4663:2;4651:9;4642:7;4638:23;4634:32;4631:52;;;4679:1;4676;4669:12;4631:52;4705:23;;-1:-1:-1;;;;;;4757:32:1;;4747:43;;4737:71;;4804:1;4801;4794:12;4843:180;4902:6;4955:2;4943:9;4934:7;4930:23;4926:32;4923:52;;;4971:1;4968;4961:12;4923:52;-1:-1:-1;4994:23:1;;4843:180;-1:-1:-1;4843:180:1:o;5028:184::-;5098:6;5151:2;5139:9;5130:7;5126:23;5122:32;5119:52;;;5167:1;5164;5157:12;5119:52;-1:-1:-1;5190:16:1;;5028:184;-1:-1:-1;5028:184:1:o;5217:248::-;5285:6;5293;5346:2;5334:9;5325:7;5321:23;5317:32;5314:52;;;5362:1;5359;5352:12;5314:52;-1:-1:-1;;5385:23:1;;;5455:2;5440:18;;;5427:32;;-1:-1:-1;5217:248:1:o;6058:635::-;-1:-1:-1;;;;;6417:15:1;;;6399:34;;6469:15;;;;6464:2;6449:18;;6442:43;6516:2;6501:18;;6494:34;6559:2;6544:18;;6537:34;;;;6379:3;6602;6587:19;;6580:32;;;6342:4;6628:19;;;6621:30;6683:3;6668:19;;6058:635::o;7327:849::-;7554:2;7606:21;;;7676:13;;7579:18;;;7698:22;;;7525:4;;7554:2;7739;;7757:18;;;;7798:15;;;7525:4;7841:309;7855:6;7852:1;7849:13;7841:309;;;7914:13;;7952:9;;7940:22;;8002:11;;;7996:18;7982:12;;;7975:40;8055:11;;8049:18;8035:12;;;8028:40;8097:4;8088:14;;;;8125:15;;;;7877:1;7870:9;7841:309;;;-1:-1:-1;8167:3:1;;7327:849;-1:-1:-1;;;;;;;7327:849:1:o;10370:356::-;10572:2;10554:21;;;10591:18;;;10584:30;10650:34;10645:2;10630:18;;10623:62;10717:2;10702:18;;10370:356::o;12625:275::-;12696:2;12690:9;12761:2;12742:13;;-1:-1:-1;;12738:27:1;12726:40;;12796:18;12781:34;;12817:22;;;12778:62;12775:88;;;12843:18;;:::i;:::-;12879:2;12872:22;12625:275;;-1:-1:-1;12625:275:1:o;12905:128::-;12945:3;12976:1;12972:6;12969:1;12966:13;12963:39;;;12982:18;;:::i;:::-;-1:-1:-1;13018:9:1;;12905:128::o;13038:217::-;13078:1;13104;13094:132;;13148:10;13143:3;13139:20;13136:1;13129:31;13183:4;13180:1;13173:15;13211:4;13208:1;13201:15;13094:132;-1:-1:-1;13240:9:1;;13038:217::o;13260:168::-;13300:7;13366:1;13362;13358:6;13354:14;13351:1;13348:21;13343:1;13336:9;13329:17;13325:45;13322:71;;;13373:18;;:::i;:::-;-1:-1:-1;13413:9:1;;13260:168::o;13433:125::-;13473:4;13501:1;13498;13495:8;13492:34;;;13506:18;;:::i;:::-;-1:-1:-1;13543:9:1;;13433:125::o;13563:135::-;13602:3;-1:-1:-1;;13623:17:1;;13620:43;;;13643:18;;:::i;:::-;-1:-1:-1;13690:1:1;13679:13;;13563:135::o;13703:127::-;13764:10;13759:3;13755:20;13752:1;13745:31;13795:4;13792:1;13785:15;13819:4;13816:1;13809:15;13835:127;13896:10;13891:3;13887:20;13884:1;13877:31;13927:4;13924:1;13917:15;13951:4;13948:1;13941:15;13967:127;14028:10;14023:3;14019:20;14016:1;14009:31;14059:4;14056:1;14049:15;14083:4;14080:1;14073:15;14099:127;14160:10;14155:3;14151:20;14148:1;14141:31;14191:4;14188:1;14181:15;14215:4;14212:1;14205:15;14231:131;-1:-1:-1;;;;;14306:31:1;;14296:42;;14286:70;;14352:1;14349;14342:12
Swarm Source
ipfs://8fe90d7b749cc29780f05abcc44c73eee81eacb735fbe31ee733b964aca34ec3
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.