Address Details
contract
0x853ACb7EFA2832CBe62E819F5947EF08457d25E6
- Contract Name
- FlanTokenStaking
- Creator
- 0x92784b–86cefd at 0x6f1a96–1c5fae
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- Fetching transactions...
- Transfers
- Fetching transfers...
- Gas Used
- Fetching gas used...
- Last Balance Update
- 11893705
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- FlanTokenStaking
- Optimization enabled
- false
- Compiler version
- v0.8.5+commit.a4f2e591
- EVM Version
- berlin
- Verified at
- 2022-04-15T21:21:15.826828Z
contracts/Flan/FlanStaking.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.5; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; /* * FlanTokenStaking * */ contract FlanTokenStaking is Context, Ownable, ReentrancyGuard { using SafeERC20 for IERC20; IERC20 private _token; uint256 private _decimal=18; uint32 private _minLockDay=7; uint256 public totalStakedAmount = 0; struct Member{ uint256 totalAmount; uint32 actionTime; } mapping(address => Member) stakingAddressAmount; constructor(address token_) { require(token_ != address(0x0)); _token = IERC20(token_); } /** * @dev Emitted on stake() * @param address_ member address * @param amount_ staked amount **/ event Stake(address indexed address_, uint256 amount_); /** * @dev Emitted on withdrawAmount() * @param address_ member address * @param amount_ staked amount **/ event WithdrawAmount(address indexed address_, uint256 amount_); event WithdrawAll(address indexed address_, uint256 amount_); function stake(uint256 amount_) external payable { require(msg.sender != address(0x0), ""); require(amount_ > 0, ""); if (stakingAddressAmount[msg.sender].totalAmount == 0) { stakingAddressAmount[msg.sender].totalAmount = amount_; } else { stakingAddressAmount[msg.sender].totalAmount += amount_; } stakingAddressAmount[msg.sender].actionTime = uint32(block.timestamp); _token.safeTransferFrom(msg.sender, address(this), amount_); totalStakedAmount += amount_; emit Stake(msg.sender, amount_); } function withdrawAmount(uint256 amount_) external payable { require(msg.sender != address(0x0), "Flan Staking: None address!"); uint256 amount = _withdrawAmount(payable(msg.sender), amount_); totalStakedAmount -= amount; emit WithdrawAmount(msg.sender, amount); } function withdrawAll() external payable { require(msg.sender != address(0x0), ""); uint256 amount = stakingAddressAmount[msg.sender].totalAmount; amount = _withdrawAmount(payable(msg.sender), amount); totalStakedAmount -= amount; emit WithdrawAll(msg.sender, amount); } function _withdrawAmount(address payable address_, uint256 amount_) internal virtual returns(uint256) { require(amount_ > 0, "Flan Staking: requested amount == 0"); require(stakingAddressAmount[address_].totalAmount >= amount_, "Flan Staking: Balance < requested amount"); require(_getCurrentTime() >= stakingAddressAmount[address_].actionTime + _minLockDay * 3600, "Flan Staking: Lock Period"); _token.safeTransfer(msg.sender, amount_); stakingAddressAmount[msg.sender].totalAmount -= amount_; stakingAddressAmount[msg.sender].actionTime = uint32(block.timestamp); return amount_; } function getAmountOfMember(address address_) public view returns(uint256, uint32) { require(address_ != address(0x0), ""); (uint256 amount, uint32 time) = _getAddressAmount(address_); return (amount, time); } function getAddressMinUnlockTime(address address_) public view returns(uint32) { require(address_ != address(0x0), ""); return _getAddressMinUnlockTime(address_); } function _getAddressAmount(address address_) private view returns(uint256, uint32) { return (stakingAddressAmount[address_].totalAmount, stakingAddressAmount[address_].actionTime); } function _getAddressMinUnlockTime(address address_) private view returns(uint32) { return stakingAddressAmount[address_].actionTime + _minLockDay * 3600; } function setMinLockDay(uint32 minLockDay_) external onlyOwner { require(minLockDay_ > 36500, "Flan Staking: Too long"); _minLockDay = minLockDay_; } function getMinLockDay() public view returns(uint32) { return _minLockDay; } function _getCurrentTime() private view returns(uint32) { return uint32(block.timestamp); } function getTotalStakedAmount() public view returns(uint256) { return totalStakedAmount; } function getTotalBalance() public view returns(uint256) { return _token.balanceOf(address(this)); } }
/_openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
/_openzeppelin/contracts/security/ReentrancyGuard.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
/_openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
/_openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
/_openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
/_openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT // 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; } }
/_openzeppelin/contracts/utils/math/Math.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } }
/_openzeppelin/contracts/utils/math/SafeMath.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"token_","internalType":"address"}]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Stake","inputs":[{"type":"address","name":"address_","internalType":"address","indexed":true},{"type":"uint256","name":"amount_","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawAll","inputs":[{"type":"address","name":"address_","internalType":"address","indexed":true},{"type":"uint256","name":"amount_","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawAmount","inputs":[{"type":"address","name":"address_","internalType":"address","indexed":true},{"type":"uint256","name":"amount_","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"getAddressMinUnlockTime","inputs":[{"type":"address","name":"address_","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint32","name":"","internalType":"uint32"}],"name":"getAmountOfMember","inputs":[{"type":"address","name":"address_","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"getMinLockDay","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalStakedAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinLockDay","inputs":[{"type":"uint32","name":"minLockDay_","internalType":"uint32"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalStakedAmount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"withdrawAll","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"withdrawAmount","inputs":[{"type":"uint256","name":"amount_","internalType":"uint256"}]}]
Contract Creation Code
0x608060405260126003556007600460006101000a81548163ffffffff021916908363ffffffff16021790555060006005553480156200003d57600080fd5b5060405162002196380380620021968339818101604052810190620000639190620001f0565b62000083620000776200010d60201b60201c565b6200011560201b60201c565b60018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000c557600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000275565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620001ea816200025b565b92915050565b60006020828403121562000209576200020862000256565b5b60006200021984828501620001d9565b91505092915050565b60006200022f8262000236565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002668162000222565b81146200027257600080fd5b50565b611f1180620002856000396000f3fe6080604052600436106100c25760003560e01c8063853828b61161007f578063aab8eecf11610059578063aab8eecf146101f5578063ba88b3e914610233578063c827b3e71461025e578063f2fde38b1461029b576100c2565b8063853828b6146101a45780638da5cb5b146101ae578063a694fc3a146101d9576100c2565b80630562b9f7146100c757806312b58349146100e357806338adb6f01461010e5780633b259ffe14610139578063567e98f914610162578063715018a61461018d575b600080fd5b6100e160048036038101906100dc919061150e565b6102c4565b005b3480156100ef57600080fd5b506100f86103ad565b60405161010591906119c1565b60405180910390f35b34801561011a57600080fd5b5061012361045f565b60405161013091906119c1565b60405180910390f35b34801561014557600080fd5b50610160600480360381019061015b9190611568565b610469565b005b34801561016e57600080fd5b50610177610553565b60405161018491906119c1565b60405180910390f35b34801561019957600080fd5b506101a2610559565b005b6101ac6105e1565b005b3480156101ba57600080fd5b506101c361070e565b6040516101d091906117c4565b60405180910390f35b6101f360048036038101906101ee919061150e565b610737565b005b34801561020157600080fd5b5061021c600480360381019061021791906114b4565b6109f5565b60405161022a9291906119dc565b60405180910390f35b34801561023f57600080fd5b50610248610a85565b6040516102559190611a05565b60405180910390f35b34801561026a57600080fd5b50610285600480360381019061028091906114b4565b610a9f565b6040516102929190611a05565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd91906114b4565b610b20565b005b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032b90611901565b60405180910390fd5b60006103403383610c18565b905080600560008282546103549190611b20565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f88969340a3d69da408cfcbcad93dfc1d174b772fb92562e7d52e0a7492186ef9826040516103a191906119c1565b60405180910390a25050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161040a91906117c4565b60206040518083038186803b15801561042257600080fd5b505afa158015610436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045a919061153b565b905090565b6000600554905090565b610471610ec3565b73ffffffffffffffffffffffffffffffffffffffff1661048f61070e565b73ffffffffffffffffffffffffffffffffffffffff16146104e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104dc906118e1565b60405180910390fd5b618e948163ffffffff161161052f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610526906118a1565b60405180910390fd5b80600460006101000a81548163ffffffff021916908363ffffffff16021790555050565b60055481565b610561610ec3565b73ffffffffffffffffffffffffffffffffffffffff1661057f61070e565b73ffffffffffffffffffffffffffffffffffffffff16146105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc906118e1565b60405180910390fd5b6105df6000610ecb565b565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064890611921565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506106a23382610c18565b905080600560008282546106b69190611b20565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fd7a4aa9f3dca5f6606ac15d7e1850920201bbb02c38cd986793779f58ae0dfd38260405161070391906119c1565b60405180910390a250565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156107a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079e90611921565b60405180910390fd5b600081116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190611921565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156108815780600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506108db565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546108d39190611a52565b925050819055505b42600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555061098b333083600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f8f909392919063ffffffff16565b806005600082825461099d9190611a52565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516109ea91906119c1565b60405180910390a250565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90611921565b60405180910390fd5b600080610a7485611018565b915091508181935093505050915091565b6000600460009054906101000a900463ffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790611921565b60405180910390fd5b610b19826110ba565b9050919050565b610b28610ec3565b73ffffffffffffffffffffffffffffffffffffffff16610b4661070e565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b93906118e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390611861565b60405180910390fd5b610c1581610ecb565b50565b6000808211610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c53906118c1565b60405180910390fd5b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890611961565b60405180910390fd5b610e10600460009054906101000a900463ffffffff16610d019190611ae2565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff16610d5e9190611aa8565b63ffffffff16610d6c611140565b63ffffffff161015610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa906119a1565b60405180910390fd5b610e003383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166111489092919063ffffffff16565b81600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610e529190611b20565b9250508190555042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555081905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611012846323b872dd60e01b858585604051602401610fb0939291906117df565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ce565b50505050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff1691509150915091565b6000610e10600460009054906101000a900463ffffffff166110dc9190611ae2565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff166111399190611aa8565b9050919050565b600042905090565b6111c98363a9059cbb60e01b8484604051602401611167929190611816565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ce565b505050565b6000611230826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166112959092919063ffffffff16565b9050600081511115611290578080602001905181019061125091906114e1565b61128f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128690611981565b60405180910390fd5b5b505050565b60606112a484846000856112ad565b90509392505050565b6060824710156112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990611881565b60405180910390fd5b6112fb856113c1565b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190611941565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161136391906117ad565b60006040518083038185875af1925050503d80600081146113a0576040519150601f19603f3d011682016040523d82523d6000602084013e6113a5565b606091505b50915091506113b58282866113e4565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156113f457829050611444565b6000835111156114075782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b919061183f565b60405180910390fd5b9392505050565b60008135905061145a81611e7f565b92915050565b60008151905061146f81611e96565b92915050565b60008135905061148481611ead565b92915050565b60008151905061149981611ead565b92915050565b6000813590506114ae81611ec4565b92915050565b6000602082840312156114ca576114c9611c0e565b5b60006114d88482850161144b565b91505092915050565b6000602082840312156114f7576114f6611c0e565b5b600061150584828501611460565b91505092915050565b60006020828403121561152457611523611c0e565b5b600061153284828501611475565b91505092915050565b60006020828403121561155157611550611c0e565b5b600061155f8482850161148a565b91505092915050565b60006020828403121561157e5761157d611c0e565b5b600061158c8482850161149f565b91505092915050565b61159e81611b54565b82525050565b60006115af82611a20565b6115b98185611a36565b93506115c9818560208601611bac565b80840191505092915050565b60006115e082611a2b565b6115ea8185611a41565b93506115fa818560208601611bac565b61160381611c13565b840191505092915050565b600061161b602683611a41565b915061162682611c24565b604082019050919050565b600061163e602683611a41565b915061164982611c73565b604082019050919050565b6000611661601683611a41565b915061166c82611cc2565b602082019050919050565b6000611684602383611a41565b915061168f82611ceb565b604082019050919050565b60006116a7602083611a41565b91506116b282611d3a565b602082019050919050565b60006116ca601b83611a41565b91506116d582611d63565b602082019050919050565b60006116ed600083611a41565b91506116f882611d8c565b600082019050919050565b6000611710601d83611a41565b915061171b82611d8f565b602082019050919050565b6000611733602883611a41565b915061173e82611db8565b604082019050919050565b6000611756602a83611a41565b915061176182611e07565b604082019050919050565b6000611779601983611a41565b915061178482611e56565b602082019050919050565b61179881611b92565b82525050565b6117a781611b9c565b82525050565b60006117b982846115a4565b915081905092915050565b60006020820190506117d96000830184611595565b92915050565b60006060820190506117f46000830186611595565b6118016020830185611595565b61180e604083018461178f565b949350505050565b600060408201905061182b6000830185611595565b611838602083018461178f565b9392505050565b6000602082019050818103600083015261185981846115d5565b905092915050565b6000602082019050818103600083015261187a8161160e565b9050919050565b6000602082019050818103600083015261189a81611631565b9050919050565b600060208201905081810360008301526118ba81611654565b9050919050565b600060208201905081810360008301526118da81611677565b9050919050565b600060208201905081810360008301526118fa8161169a565b9050919050565b6000602082019050818103600083015261191a816116bd565b9050919050565b6000602082019050818103600083015261193a816116e0565b9050919050565b6000602082019050818103600083015261195a81611703565b9050919050565b6000602082019050818103600083015261197a81611726565b9050919050565b6000602082019050818103600083015261199a81611749565b9050919050565b600060208201905081810360008301526119ba8161176c565b9050919050565b60006020820190506119d6600083018461178f565b92915050565b60006040820190506119f1600083018561178f565b6119fe602083018461179e565b9392505050565b6000602082019050611a1a600083018461179e565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000611a5d82611b92565b9150611a6883611b92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a9d57611a9c611bdf565b5b828201905092915050565b6000611ab382611b9c565b9150611abe83611b9c565b92508263ffffffff03821115611ad757611ad6611bdf565b5b828201905092915050565b6000611aed82611b9c565b9150611af883611b9c565b92508163ffffffff0483118215151615611b1557611b14611bdf565b5b828202905092915050565b6000611b2b82611b92565b9150611b3683611b92565b925082821015611b4957611b48611bdf565b5b828203905092915050565b6000611b5f82611b72565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60005b83811015611bca578082015181840152602081019050611baf565b83811115611bd9576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f466c616e205374616b696e673a20546f6f206c6f6e6700000000000000000000600082015250565b7f466c616e205374616b696e673a2072657175657374656420616d6f756e74203d60008201527f3d20300000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f466c616e205374616b696e673a204e6f6e652061646472657373210000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f466c616e205374616b696e673a2042616c616e6365203c20726571756573746560008201527f6420616d6f756e74000000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f466c616e205374616b696e673a204c6f636b20506572696f6400000000000000600082015250565b611e8881611b54565b8114611e9357600080fd5b50565b611e9f81611b66565b8114611eaa57600080fd5b50565b611eb681611b92565b8114611ec157600080fd5b50565b611ecd81611b9c565b8114611ed857600080fd5b5056fea2646970667358221220c892d109e3a39e18de83e99d4b0918fff78845b2406c07ddfb1ba354748f1fe764736f6c63430008050033000000000000000000000000a5033ad7f1928566225057fa3e6f704e8401bc25
Deployed ByteCode
0x6080604052600436106100c25760003560e01c8063853828b61161007f578063aab8eecf11610059578063aab8eecf146101f5578063ba88b3e914610233578063c827b3e71461025e578063f2fde38b1461029b576100c2565b8063853828b6146101a45780638da5cb5b146101ae578063a694fc3a146101d9576100c2565b80630562b9f7146100c757806312b58349146100e357806338adb6f01461010e5780633b259ffe14610139578063567e98f914610162578063715018a61461018d575b600080fd5b6100e160048036038101906100dc919061150e565b6102c4565b005b3480156100ef57600080fd5b506100f86103ad565b60405161010591906119c1565b60405180910390f35b34801561011a57600080fd5b5061012361045f565b60405161013091906119c1565b60405180910390f35b34801561014557600080fd5b50610160600480360381019061015b9190611568565b610469565b005b34801561016e57600080fd5b50610177610553565b60405161018491906119c1565b60405180910390f35b34801561019957600080fd5b506101a2610559565b005b6101ac6105e1565b005b3480156101ba57600080fd5b506101c361070e565b6040516101d091906117c4565b60405180910390f35b6101f360048036038101906101ee919061150e565b610737565b005b34801561020157600080fd5b5061021c600480360381019061021791906114b4565b6109f5565b60405161022a9291906119dc565b60405180910390f35b34801561023f57600080fd5b50610248610a85565b6040516102559190611a05565b60405180910390f35b34801561026a57600080fd5b50610285600480360381019061028091906114b4565b610a9f565b6040516102929190611a05565b60405180910390f35b3480156102a757600080fd5b506102c260048036038101906102bd91906114b4565b610b20565b005b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610334576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032b90611901565b60405180910390fd5b60006103403383610c18565b905080600560008282546103549190611b20565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f88969340a3d69da408cfcbcad93dfc1d174b772fb92562e7d52e0a7492186ef9826040516103a191906119c1565b60405180910390a25050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161040a91906117c4565b60206040518083038186803b15801561042257600080fd5b505afa158015610436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045a919061153b565b905090565b6000600554905090565b610471610ec3565b73ffffffffffffffffffffffffffffffffffffffff1661048f61070e565b73ffffffffffffffffffffffffffffffffffffffff16146104e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104dc906118e1565b60405180910390fd5b618e948163ffffffff161161052f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610526906118a1565b60405180910390fd5b80600460006101000a81548163ffffffff021916908363ffffffff16021790555050565b60055481565b610561610ec3565b73ffffffffffffffffffffffffffffffffffffffff1661057f61070e565b73ffffffffffffffffffffffffffffffffffffffff16146105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc906118e1565b60405180910390fd5b6105df6000610ecb565b565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064890611921565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506106a23382610c18565b905080600560008282546106b69190611b20565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fd7a4aa9f3dca5f6606ac15d7e1850920201bbb02c38cd986793779f58ae0dfd38260405161070391906119c1565b60405180910390a250565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156107a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079e90611921565b60405180910390fd5b600081116107ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e190611921565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156108815780600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506108db565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282546108d39190611a52565b925050819055505b42600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555061098b333083600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f8f909392919063ffffffff16565b806005600082825461099d9190611a52565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a826040516109ea91906119c1565b60405180910390a250565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5f90611921565b60405180910390fd5b600080610a7485611018565b915091508181935093505050915091565b6000600460009054906101000a900463ffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0790611921565b60405180910390fd5b610b19826110ba565b9050919050565b610b28610ec3565b73ffffffffffffffffffffffffffffffffffffffff16610b4661070e565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b93906118e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390611861565b60405180910390fd5b610c1581610ecb565b50565b6000808211610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c53906118c1565b60405180910390fd5b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd890611961565b60405180910390fd5b610e10600460009054906101000a900463ffffffff16610d019190611ae2565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff16610d5e9190611aa8565b63ffffffff16610d6c611140565b63ffffffff161015610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa906119a1565b60405180910390fd5b610e003383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166111489092919063ffffffff16565b81600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610e529190611b20565b9250508190555042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff16021790555081905092915050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611012846323b872dd60e01b858585604051602401610fb0939291906117df565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ce565b50505050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff1691509150915091565b6000610e10600460009054906101000a900463ffffffff166110dc9190611ae2565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900463ffffffff166111399190611aa8565b9050919050565b600042905090565b6111c98363a9059cbb60e01b8484604051602401611167929190611816565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506111ce565b505050565b6000611230826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166112959092919063ffffffff16565b9050600081511115611290578080602001905181019061125091906114e1565b61128f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128690611981565b60405180910390fd5b5b505050565b60606112a484846000856112ad565b90509392505050565b6060824710156112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e990611881565b60405180910390fd5b6112fb856113c1565b61133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133190611941565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161136391906117ad565b60006040518083038185875af1925050503d80600081146113a0576040519150601f19603f3d011682016040523d82523d6000602084013e6113a5565b606091505b50915091506113b58282866113e4565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156113f457829050611444565b6000835111156114075782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b919061183f565b60405180910390fd5b9392505050565b60008135905061145a81611e7f565b92915050565b60008151905061146f81611e96565b92915050565b60008135905061148481611ead565b92915050565b60008151905061149981611ead565b92915050565b6000813590506114ae81611ec4565b92915050565b6000602082840312156114ca576114c9611c0e565b5b60006114d88482850161144b565b91505092915050565b6000602082840312156114f7576114f6611c0e565b5b600061150584828501611460565b91505092915050565b60006020828403121561152457611523611c0e565b5b600061153284828501611475565b91505092915050565b60006020828403121561155157611550611c0e565b5b600061155f8482850161148a565b91505092915050565b60006020828403121561157e5761157d611c0e565b5b600061158c8482850161149f565b91505092915050565b61159e81611b54565b82525050565b60006115af82611a20565b6115b98185611a36565b93506115c9818560208601611bac565b80840191505092915050565b60006115e082611a2b565b6115ea8185611a41565b93506115fa818560208601611bac565b61160381611c13565b840191505092915050565b600061161b602683611a41565b915061162682611c24565b604082019050919050565b600061163e602683611a41565b915061164982611c73565b604082019050919050565b6000611661601683611a41565b915061166c82611cc2565b602082019050919050565b6000611684602383611a41565b915061168f82611ceb565b604082019050919050565b60006116a7602083611a41565b91506116b282611d3a565b602082019050919050565b60006116ca601b83611a41565b91506116d582611d63565b602082019050919050565b60006116ed600083611a41565b91506116f882611d8c565b600082019050919050565b6000611710601d83611a41565b915061171b82611d8f565b602082019050919050565b6000611733602883611a41565b915061173e82611db8565b604082019050919050565b6000611756602a83611a41565b915061176182611e07565b604082019050919050565b6000611779601983611a41565b915061178482611e56565b602082019050919050565b61179881611b92565b82525050565b6117a781611b9c565b82525050565b60006117b982846115a4565b915081905092915050565b60006020820190506117d96000830184611595565b92915050565b60006060820190506117f46000830186611595565b6118016020830185611595565b61180e604083018461178f565b949350505050565b600060408201905061182b6000830185611595565b611838602083018461178f565b9392505050565b6000602082019050818103600083015261185981846115d5565b905092915050565b6000602082019050818103600083015261187a8161160e565b9050919050565b6000602082019050818103600083015261189a81611631565b9050919050565b600060208201905081810360008301526118ba81611654565b9050919050565b600060208201905081810360008301526118da81611677565b9050919050565b600060208201905081810360008301526118fa8161169a565b9050919050565b6000602082019050818103600083015261191a816116bd565b9050919050565b6000602082019050818103600083015261193a816116e0565b9050919050565b6000602082019050818103600083015261195a81611703565b9050919050565b6000602082019050818103600083015261197a81611726565b9050919050565b6000602082019050818103600083015261199a81611749565b9050919050565b600060208201905081810360008301526119ba8161176c565b9050919050565b60006020820190506119d6600083018461178f565b92915050565b60006040820190506119f1600083018561178f565b6119fe602083018461179e565b9392505050565b6000602082019050611a1a600083018461179e565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000611a5d82611b92565b9150611a6883611b92565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a9d57611a9c611bdf565b5b828201905092915050565b6000611ab382611b9c565b9150611abe83611b9c565b92508263ffffffff03821115611ad757611ad6611bdf565b5b828201905092915050565b6000611aed82611b9c565b9150611af883611b9c565b92508163ffffffff0483118215151615611b1557611b14611bdf565b5b828202905092915050565b6000611b2b82611b92565b9150611b3683611b92565b925082821015611b4957611b48611bdf565b5b828203905092915050565b6000611b5f82611b72565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b60005b83811015611bca578082015181840152602081019050611baf565b83811115611bd9576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f466c616e205374616b696e673a20546f6f206c6f6e6700000000000000000000600082015250565b7f466c616e205374616b696e673a2072657175657374656420616d6f756e74203d60008201527f3d20300000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f466c616e205374616b696e673a204e6f6e652061646472657373210000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f466c616e205374616b696e673a2042616c616e6365203c20726571756573746560008201527f6420616d6f756e74000000000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f466c616e205374616b696e673a204c6f636b20506572696f6400000000000000600082015250565b611e8881611b54565b8114611e9357600080fd5b50565b611e9f81611b66565b8114611eaa57600080fd5b50565b611eb681611b92565b8114611ec157600080fd5b50565b611ecd81611b9c565b8114611ed857600080fd5b5056fea2646970667358221220c892d109e3a39e18de83e99d4b0918fff78845b2406c07ddfb1ba354748f1fe764736f6c63430008050033