More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 569 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 74915906 | 227 days ago | IN | 0 FTM | 0.00029173 | ||||
Deposit | 74915760 | 227 days ago | IN | 0 FTM | 0.00064955 | ||||
Deposit | 66970963 | 396 days ago | IN | 0 FTM | 0.00077192 | ||||
Deposit | 66970963 | 396 days ago | IN | 0 FTM | 0.00078872 | ||||
Deposit | 66970955 | 396 days ago | IN | 0 FTM | 0.00078872 | ||||
Deposit | 66970952 | 396 days ago | IN | 0 FTM | 0.00078803 | ||||
Deposit | 66970940 | 396 days ago | IN | 0 FTM | 0.00078798 | ||||
Withdraw | 66970928 | 396 days ago | IN | 0 FTM | 0.00108225 | ||||
Deposit | 58252939 | 539 days ago | IN | 0 FTM | 0.0037657 | ||||
Deposit | 58252935 | 539 days ago | IN | 0 FTM | 0.00376217 | ||||
Deposit | 58252888 | 539 days ago | IN | 0 FTM | 0.00427293 | ||||
Deposit | 55977225 | 574 days ago | IN | 0 FTM | 0.00465211 | ||||
Deposit | 53265611 | 617 days ago | IN | 0 FTM | 0.00369606 | ||||
Deposit | 53265584 | 617 days ago | IN | 0 FTM | 0.00369776 | ||||
Deposit | 53265570 | 617 days ago | IN | 0 FTM | 0.00368822 | ||||
Deposit | 53265542 | 617 days ago | IN | 0 FTM | 0.00364456 | ||||
Deposit | 53265518 | 617 days ago | IN | 0 FTM | 0.00362747 | ||||
Deposit | 53265501 | 617 days ago | IN | 0 FTM | 0.00422452 | ||||
Deposit | 53085304 | 620 days ago | IN | 0 FTM | 0.00033266 | ||||
Deposit | 52846701 | 628 days ago | IN | 0 FTM | 0.0055231 | ||||
Deposit | 52142057 | 642 days ago | IN | 0 FTM | 0.00240599 | ||||
Deposit | 51226328 | 662 days ago | IN | 0 FTM | 0.00907697 | ||||
Deposit | 50080267 | 687 days ago | IN | 0 FTM | 0.00016869 | ||||
Deposit | 49955736 | 689 days ago | IN | 0 FTM | 0.00015525 | ||||
Deposit | 49816654 | 691 days ago | IN | 0 FTM | 0.00015152 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
34374844 | 903 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-03-25 */ // SPDX-License-Identifier: MIT // Sources flattened with hardhat v2.9.1 https://hardhat.org // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File contracts/libs/IBEP20.sol pragma solidity >=0.4.0; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.2 <0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/libs/SafeBEP20.sol pragma solidity >=0.6.0; /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer( IBEP20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IBEP20 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 * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 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' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeBEP20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeBEP20: decreased allowance below zero" ); _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(IBEP20 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, "SafeBEP20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeBEP20: BEP20 operation did not succeed" ); } } } // File contracts/libs/IReferral.sol pragma solidity >=0.6.12; interface IFantaReferral { /** * @dev Record referral. */ function recordReferral(address user, address referrer) external; /** * @dev Get the referrer address that referred the user. */ function getReferrer(address user) external view returns (address); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.0 <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() internal { _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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/libs/BEP20.sol pragma solidity >=0.4.0; /** * @dev Implementation of the {IBEP20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {BEP20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-BEP20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of BEP20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IBEP20-approve}. */ contract BEP20 is Context, IBEP20, Ownable { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the bep token owner. */ function getOwner() external view override returns (address) { return owner(); } /** * @dev Returns the token name. */ function name() public view override returns (string memory) { return _name; } /** * @dev Returns the token decimals. */ function decimals() public view override returns (uint8) { return _decimals; } /** * @dev Returns the token symbol. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {BEP20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {BEP20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {BEP20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {BEP20-allowance}. */ function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {BEP20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {BEP20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {BEP20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "BEP20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "BEP20: decreased allowance below zero" ) ); return true; } /** * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing * the total supply. * * Requirements * * - `msg.sender` must be the token owner */ function mint(uint256 amount) public onlyOwner returns (bool) { _mint(_msgSender(), amount); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "BEP20: transfer from the zero address"); require(recipient != address(0), "BEP20: transfer to the zero address"); _balances[sender] = _balances[sender].sub( amount, "BEP20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "BEP20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "BEP20: burn from the zero address"); _balances[account] = _balances[account].sub( amount, "BEP20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal { require(owner != address(0), "BEP20: approve from the zero address"); require(spender != address(0), "BEP20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve( account, _msgSender(), _allowances[account][_msgSender()].sub( amount, "BEP20: burn amount exceeds allowance" ) ); } } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File @uniswap/v2-core/contracts/interfaces/[email protected] pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File contracts/Token.sol pragma solidity >=0.6.12; // FantaToken with Governance. contract FantaToken is BEP20 { // Transfer tax rate in basis points. uint16 public transferTaxRate; // Burn rate % of transfer tax. uint16 public burnRate; // Max transfer tax rate: 20%. uint16 public constant MAXIMUM_TRANSFER_TAX_RATE = 2000; // Burn address address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // Max transfer amount rate in basis points. uint16 public maxTransferAmountRate; // Addresses that excluded from antiWhale mapping(address => bool) private _excludedFromAntiWhale; // Automatic swap and liquify enabled bool public swapAndLiquifyEnabled = false; // Min amount to liquify. (default 500 FANTAs) uint256 public minAmountToLiquify = 500 ether; // The swap router, modifiable. Will be changed to FantaSwap's router when our own AMM release IUniswapV2Router02 public fantaSwapRouter; // The trading pair address public fantaSwapPair; // In swap and liquify bool private _inSwapAndLiquify; // Addresses that are excluded from transfer tax (for presale and masterchef contract only) mapping(address => bool) private _excludedFromTransferTax; // The operator can only update the transfer tax rate address private _operator; // Events event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); event TransferTaxRateUpdated( address indexed operator, uint256 previousRate, uint256 newRate ); event BurnRateUpdated( address indexed operator, uint256 previousRate, uint256 newRate ); event MaxTransferAmountRateUpdated( address indexed operator, uint256 previousRate, uint256 newRate ); event SwapAndLiquifyEnabledUpdated(address indexed operator, bool enabled); event MinAmountToLiquifyUpdated( address indexed operator, uint256 previousAmount, uint256 newAmount ); event FantaSwapRouterUpdated( address indexed operator, address indexed router, address indexed pair ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier onlyOperator() { require( _operator == msg.sender, "operator: caller is not the operator" ); _; } modifier antiWhale( address sender, address recipient, uint256 amount ) { if (maxTransferAmount() > 0) { if ( _excludedFromAntiWhale[sender] == false && _excludedFromAntiWhale[recipient] == false ) { require( amount <= maxTransferAmount(), "FANTA::antiWhale: Transfer amount exceeds the maxTransferAmount" ); } } _; } modifier lockTheSwap() { _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } modifier transferTaxFree() { uint16 _transferTaxRate = transferTaxRate; transferTaxRate = 0; _; transferTaxRate = _transferTaxRate; } /** * @notice Constructs the FantaToken contract. */ constructor( uint16 _transferTaxRate, uint16 _burnRate, uint16 _maxTransferAmountRate ) public BEP20("Fanta Token", "FANTA") { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); transferTaxRate = _transferTaxRate; burnRate = _burnRate; maxTransferAmountRate = _maxTransferAmountRate; _excludedFromAntiWhale[msg.sender] = true; _excludedFromAntiWhale[address(0)] = true; _excludedFromAntiWhale[address(this)] = true; _excludedFromAntiWhale[BURN_ADDRESS] = true; } /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } /// @dev overrides transfer function to meet tokenomics of FANTA function _transfer( address sender, address recipient, uint256 amount ) internal virtual override antiWhale(sender, recipient, amount) { // swap and liquify if ( swapAndLiquifyEnabled == true && _inSwapAndLiquify == false && address(fantaSwapRouter) != address(0) && fantaSwapPair != address(0) && sender != fantaSwapPair && sender != owner() ) { swapAndLiquify(); } if ( recipient == BURN_ADDRESS || transferTaxRate == 0 || _excludedFromTransferTax[sender] || _excludedFromTransferTax[recipient] ) { super._transfer(sender, recipient, amount); } else { // default tax is 5% of every transfer uint256 taxAmount = amount.mul(transferTaxRate).div(10000); uint256 burnAmount = taxAmount.mul(burnRate).div(100); uint256 liquidityAmount = taxAmount.sub(burnAmount); require( taxAmount == burnAmount + liquidityAmount, "FANTA::transfer: Burn value invalid" ); // default 95% of transfer sent to recipient uint256 sendAmount = amount.sub(taxAmount); require( amount == sendAmount + taxAmount, "FANTA::transfer: Tax value invalid" ); super._transfer(sender, BURN_ADDRESS, burnAmount); super._transfer(sender, address(this), liquidityAmount); super._transfer(sender, recipient, sendAmount); amount = sendAmount; } } /// @dev Swap and liquify function swapAndLiquify() private lockTheSwap transferTaxFree { uint256 contractTokenBalance = balanceOf(address(this)); uint256 maxTransferAmount = maxTransferAmount(); contractTokenBalance = contractTokenBalance > maxTransferAmount ? maxTransferAmount : contractTokenBalance; if (contractTokenBalance >= minAmountToLiquify) { // only min amount to liquify uint256 liquifyAmount = minAmountToLiquify; // split the liquify amount into halves uint256 half = liquifyAmount.div(2); uint256 otherHalf = liquifyAmount.sub(half); // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } } /// @dev Swap tokens for eth function swapTokensForEth(uint256 tokenAmount) private { // generate the fantaSwap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = fantaSwapRouter.WETH(); _approve(address(this), address(fantaSwapRouter), tokenAmount); // make the swap fantaSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } /// @dev Add liquidity function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(fantaSwapRouter), tokenAmount); // add the liquidity fantaSwapRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable operator(), block.timestamp ); } /** * @dev Returns the max transfer amount. */ function maxTransferAmount() public view returns (uint256) { return totalSupply().mul(maxTransferAmountRate).div(10000); } /** * @dev Returns the address is excluded from antiWhale or not. */ function isExcludedFromAntiWhale(address _account) public view returns (bool) { return _excludedFromAntiWhale[_account]; } /** * @dev Returns if the address is excluded from transferTax or not. */ function isExcludedFromTransferTax(address _account) public view returns (bool) { return _excludedFromTransferTax[_account]; } // To receive BNB from fantaSwapRouter when swapping receive() external payable {} /** * @dev Update the transfer tax rate. * Can only be called by the current operator. */ function updateTransferTaxRate(uint16 _transferTaxRate) public onlyOperator { require( _transferTaxRate <= MAXIMUM_TRANSFER_TAX_RATE, "FANTA::updateTransferTaxRate: Transfer tax rate must not exceed the maximum rate." ); emit TransferTaxRateUpdated( msg.sender, transferTaxRate, _transferTaxRate ); transferTaxRate = _transferTaxRate; } /** * @dev Update the burn rate. * Can only be called by the current operator. */ function updateBurnRate(uint16 _burnRate) public onlyOperator { require( _burnRate <= 100, "FANTA::updateBurnRate: Burn rate must not exceed the maximum rate." ); emit BurnRateUpdated(msg.sender, burnRate, _burnRate); burnRate = _burnRate; } /** * @dev Update the max transfer amount rate. * Can only be called by the current operator. */ function updateMaxTransferAmountRate(uint16 _maxTransferAmountRate) public onlyOperator { require( _maxTransferAmountRate <= 10000, "FANTA::updateMaxTransferAmountRate: Max transfer amount rate must not exceed the maximum rate." ); emit MaxTransferAmountRateUpdated( msg.sender, maxTransferAmountRate, _maxTransferAmountRate ); maxTransferAmountRate = _maxTransferAmountRate; } /** * @dev Update the min amount to liquify. * Can only be called by the current operator. */ function updateMinAmountToLiquify(uint256 _minAmount) public onlyOperator { emit MinAmountToLiquifyUpdated( msg.sender, minAmountToLiquify, _minAmount ); minAmountToLiquify = _minAmount; } /** * @dev Exclude or include an address from antiWhale. * Can only be called by the current operator. */ function setExcludedFromAntiWhale(address _account, bool _excluded) public onlyOperator { _excludedFromAntiWhale[_account] = _excluded; } /** * @dev Exclude or include an address from transferTax. * Can only be called by the current operator. */ function setExcludedFromTransferTax(address _account, bool _excluded) public onlyOperator { _excludedFromTransferTax[_account] = _excluded; } /** * @dev Update the swapAndLiquifyEnabled. * Can only be called by the current operator. */ function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOperator { emit SwapAndLiquifyEnabledUpdated(msg.sender, _enabled); swapAndLiquifyEnabled = _enabled; } /** * @dev Update the swap router. * Can only be called by the current operator. */ function updateSwapRouter(address _router) public onlyOperator { fantaSwapRouter = IUniswapV2Router02(_router); fantaSwapPair = IUniswapV2Factory(fantaSwapRouter.factory()).getPair( address(this), fantaSwapRouter.WETH() ); require( fantaSwapPair != address(0), "FANTA::updateFantaSwapRouter: Invalid pair address." ); emit FantaSwapRouterUpdated( msg.sender, address(fantaSwapRouter), fantaSwapPair ); } /** * @dev Returns the address of the current operator. */ function operator() public view returns (address) { return _operator; } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) public onlyOperator { require( newOperator != address(0), "FANTA::transferOperator: new operator is the zero address" ); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @dev A record of each accounts delegate mapping(address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "FANTA::delegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "FANTA::delegateBySig: invalid nonce" ); require(now <= expiry, "FANTA::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) { require( blockNumber < block.number, "FANTA::getPriorVotes: not yet determined" ); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying FANTAs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates( address srcRep, address dstRep, uint256 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32( block.number, "FANTA::_writeCheckpoint: block number exceeds 32 bits" ); if ( nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber ) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint( blockNumber, newVotes ); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } // File contracts/MasterChef.sol pragma solidity 0.6.12; // MasterChef is the master of Fanta. He can make Fanta and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once FANTA is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterChef is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of FANTAs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accFantaPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accFantaPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. FANTAs to distribute per block. uint256 lastRewardBlock; // Last block number that FANTAs distribution occurs. uint256 accFantaPerShare; // Accumulated FANTAs per share, times 1e12. See below. uint16 depositFeeBP; // Deposit fee in basis points } // The FANTA TOKEN! FantaToken public fanta; // Dev address. address public devAddress; // Deposit Fee address address public feeAddress; // FANTA tokens created per block. uint256 public fantaPerBlock; // Bonus muliplier for early fanta makers. uint256 public constant BONUS_MULTIPLIER = 1; // Max supply uint256 public MAX_TOKEN_SUPPLY; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when FANTA mining starts. uint256 public startBlock; // Fanta referral contract address. IFantaReferral public fantaReferral; // Referral commission rate in basis points. uint16 public referralCommissionRate; // Max referral commission rate: 20%. uint16 public constant MAXIMUM_REFERRAL_COMMISSION_RATE = 2000; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event ReferralCommissionPaid( address indexed user, address indexed referrer, uint256 commissionAmount ); constructor( FantaToken _fanta, uint256 _startBlock, uint256 _emissionRate, uint256 _maxSupply, uint16 _referralRate ) public { fanta = _fanta; startBlock = _startBlock; fantaPerBlock = _emissionRate * 0.0001 ether; MAX_TOKEN_SUPPLY = _maxSupply * 1 ether; referralCommissionRate = _referralRate; devAddress = msg.sender; feeAddress = msg.sender; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add( uint256 _allocPoint, IBEP20 _lpToken, uint16 _depositFeeBP, bool _withUpdate ) public onlyOwner { require(_depositFeeBP <= 400, "add: invalid deposit fee basis points"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accFantaPerShare: 0, depositFeeBP: _depositFeeBP }) ); } // Update the given pool's FANTA allocation point and deposit fee. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, bool _withUpdate ) public onlyOwner { require(_depositFeeBP <= 400, "set: invalid deposit fee basis points"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } // View function to see pending FANTAs on frontend. function pendingFanta(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accFantaPerShare = pool.accFantaPerShare; if (fanta.totalSupply() >= MAX_TOKEN_SUPPLY) { return user.amount.mul(accFantaPerShare).div(1e12).sub( user.rewardDebt ); } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier( pool.lastRewardBlock, block.number ); uint256 fantaReward = multiplier .mul(fantaPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); accFantaPerShare = accFantaPerShare.add( fantaReward.mul(1e12).div(lpSupply) ); } return user.amount.mul(accFantaPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (fanta.totalSupply() >= MAX_TOKEN_SUPPLY) { pool.lastRewardBlock = block.number; return; } if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 fantaReward = multiplier .mul(fantaPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); if (fanta.totalSupply().add(fantaReward) > MAX_TOKEN_SUPPLY) { fantaReward = MAX_TOKEN_SUPPLY.sub(fanta.totalSupply()); } else { fanta.mint(devAddress, fantaReward.div(10)); } fanta.mint(address(this), fantaReward); pool.accFantaPerShare = pool.accFantaPerShare.add( fantaReward.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterChef for FANTA allocation. function deposit( uint256 _pid, uint256 _amount, address _referrer ) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if ( _amount > 0 && address(fantaReferral) != address(0) && _referrer != address(0) && _referrer != msg.sender ) { fantaReferral.recordReferral(msg.sender, _referrer); } if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accFantaPerShare) .div(1e12) .sub(user.rewardDebt); if (pending > 0) { safeFantaTransfer(msg.sender, pending); payReferralCommission(msg.sender, pending); } } if (_amount > 0) { pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); if (address(pool.lpToken) == address(fanta)) { uint256 transferTax = _amount.mul(fanta.transferTaxRate()).div( 10000 ); _amount = _amount.sub(transferTax); } if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); pool.lpToken.safeTransfer(feeAddress, depositFee); user.amount = user.amount.add(_amount).sub(depositFee); } else { user.amount = user.amount.add(_amount); } } user.rewardDebt = user.amount.mul(pool.accFantaPerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accFantaPerShare).div(1e12).sub( user.rewardDebt ); if (pending > 0) { safeFantaTransfer(msg.sender, pending); payReferralCommission(msg.sender, pending); } if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accFantaPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; pool.lpToken.safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // Safe fanta transfer function, just in case if rounding error causes pool to not have enough FANTAs. function safeFantaTransfer(address _to, uint256 _amount) internal { uint256 fantaBal = fanta.balanceOf(address(this)); bool transferSuccess = false; if (_amount > fantaBal) { transferSuccess = fanta.transfer(_to, fantaBal); } else { transferSuccess = fanta.transfer(_to, _amount); } require(transferSuccess, "safeFantaTransfer: Transfer failed"); } // Update dev address by the previous dev. function setDevAddress(address _devAddress) public { require(msg.sender == devAddress, "setDevAddress: FORBIDDEN"); devAddress = _devAddress; } function setFeeAddress(address _feeAddress) public { require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN"); feeAddress = _feeAddress; } function updateEmissionRate(uint256 _newEmissionRate) public onlyOwner { massUpdatePools(); fantaPerBlock = _newEmissionRate; } function updateStartBlock(uint256 _newStartBlock) public onlyOwner { require( block.number > startBlock, "Farms have already started, cannot change startBlock" ); startBlock = _newStartBlock; } // Update the fanta referral contract address by the owner function setReferral(IFantaReferral _fantaReferral) public onlyOwner { fantaReferral = _fantaReferral; } // Update referral commission rate by the owner function setReferralCommissionRate(uint16 _referralCommissionRate) public onlyOwner { require( _referralCommissionRate <= MAXIMUM_REFERRAL_COMMISSION_RATE, "setReferralCommissionRate: invalid referral commission rate basis points" ); referralCommissionRate = _referralCommissionRate; } // Pay referral commission to the referrer who referred this user. function payReferralCommission(address _user, uint256 _pending) internal { if ( address(fantaReferral) != address(0) && referralCommissionRate > 0 ) { address referrer = fantaReferral.getReferrer(_user); uint256 commissionAmount = _pending.mul(referralCommissionRate).div( 10000 ); if (referrer != address(0) && commissionAmount > 0) { fanta.mint(referrer, commissionAmount); emit ReferralCommissionPaid(_user, referrer, commissionAmount); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract FantaToken","name":"_fanta","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_emissionRate","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint16","name":"_referralRate","type":"uint16"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"uint256","name":"commissionAmount","type":"uint256"}],"name":"ReferralCommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_REFERRAL_COMMISSION_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBEP20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fanta","outputs":[{"internalType":"contract FantaToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fantaPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fantaReferral","outputs":[{"internalType":"contract IFantaReferral","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingFanta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accFantaPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCommissionRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devAddress","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IFantaReferral","name":"_fantaReferral","type":"address"}],"name":"setReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_referralCommissionRate","type":"uint16"}],"name":"setReferralCommissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newEmissionRate","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartBlock","type":"uint256"}],"name":"updateStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006009553480156200001657600080fd5b5060405162003d2c38038062003d2c833981810160405260a08110156200003c57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000876200023e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555084600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600a81905550655af3107a40008302600581905550670de0b6b3a7640000820260068190555080600b60146101000a81548161ffff021916908361ffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000246565b600033905090565b613ad680620002566000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f5780639e5914da116100a2578063d963842211610071578063d9638422146107f6578063e489d51014610848578063f2fde38b14610866578063fac2b9ba146108aa576101f0565b80639e5914da146106ea578063b157c1f81461072e578063d0d41fe114610790578063d30ef61b146107d4576101f0565b80638da5cb5b116100de5780638da5cb5b146105a95780638dbb1e3a146105dd5780638dbdbe6d1461062957806393f1a40b14610681576101f0565b8063715018a6146104d557806384e82a33146104df5780638705fcd4146105475780638aa285501461058b576101f0565b806348b22bfb1161018757806355dbc8261161015657806355dbc826146104475780636233a01d14610479578063630b5ba1146104975780636df00670146104a1576101f0565b806348b22bfb146103ab57806348cd4cb1146103cd57806351eb05a6146103eb5780635312ea8e14610419576101f0565b806317caf6f1116101c357806317caf6f1146102ed5780633ad10ef61461030b578063412753581461033f578063441a3e7014610373576101f0565b806302d8f98c146101f5578063081e3eda146102295780630ba84cd2146102475780631526fe2714610275575b600080fd5b6101fd6108d8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102316108fe565b6040518082815260200191505060405180910390f35b6102736004803603602081101561025d57600080fd5b810190808035906020019092919050505061090b565b005b6102a16004803603602081101561028b57600080fd5b81019080803590602001909291905050506109cc565b604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018261ffff1681526020019550505050505060405180910390f35b6102f5610a3d565b6040518082815260200191505060405180910390f35b610313610a43565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610347610a69565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103a96004803603604081101561038957600080fd5b810190808035906020019092919080359060200190929190505050610a8f565b005b6103b3610d7f565b604051808261ffff16815260200191505060405180910390f35b6103d5610d85565b6040518082815260200191505060405180910390f35b6104176004803603602081101561040157600080fd5b8101908080359060200190929190505050610d8b565b005b6104456004803603602081101561042f57600080fd5b810190808035906020019092919050505061131d565b005b6104776004803603602081101561045d57600080fd5b81019080803561ffff1690602001909291905050506114d9565b005b61048161160b565b6040518082815260200191505060405180910390f35b61049f611611565b005b6104a961163e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dd611664565b005b610545600480360360808110156104f557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff1690602001909291908035151590602001909291905050506117d1565b005b6105896004803603602081101561055d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1e565b005b610593611b25565b6040518082815260200191505060405180910390f35b6105b1611b2a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610613600480360360408110156105f357600080fd5b810190808035906020019092919080359060200190929190505050611b53565b6040518082815260200191505060405180910390f35b61067f6004803603606081101561063f57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b83565b005b6106cd6004803603604081101561069757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061220c565b604051808381526020018281526020019250505060405180910390f35b61072c6004803603602081101561070057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061223d565b005b61077a6004803603604081101561074457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612330565b6040518082815260200191505060405180910390f35b6107d2600480360360208110156107a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612670565b005b6107dc612777565b604051808261ffff16815260200191505060405180910390f35b6108466004803603608081101561080c57600080fd5b810190808035906020019092919080359060200190929190803561ffff16906020019092919080351515906020019092919050505061278b565b005b610850612955565b6040518082815260200191505060405180910390f35b6108a86004803603602081101561087c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061295b565b005b6108d6600480360360208110156108c057600080fd5b8101908080359060200190929190505050612b4d565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600780549050905090565b610913612c60565b73ffffffffffffffffffffffffffffffffffffffff16610931611b2a565b73ffffffffffffffffffffffffffffffffffffffff16146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109c2611611565b8060058190555050565b600781815481106109d957fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900461ffff16905085565b60095481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415610b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600060078381548110610b1f57fe5b9060005260206000209060050201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610bfd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b610c0684610d8b565b6000610c508260010154610c4264e8d4a51000610c3487600301548760000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b90506000811115610c7057610c653382612dfa565b610c6f33826130ce565b5b6000841115610ce857610c90848360000154612d7790919063ffffffff16565b8260000181905550610ce733858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133a79092919063ffffffff16565b5b610d1a64e8d4a51000610d0c85600301548560000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a3505050600180819055505050565b6107d081565b600a5481565b600060078281548110610d9a57fe5b90600052602060002090600502019050600654600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1557600080fd5b505afa158015610e29573d6000803e3d6000fd5b505050506040513d6020811015610e3f57600080fd5b810190808051906020019092919050505010610e64574381600201819055505061131a565b80600201544311610e75575061131a565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f0257600080fd5b505afa158015610f16573d6000803e3d6000fd5b505050506040513d6020811015610f2c57600080fd5b810190808051906020019092919050505090506000811480610f52575060008260010154145b15610f6757438260020181905550505061131a565b6000610f77836002015443611b53565b90506000610fba600954610fac8660010154610f9e60055487612c6890919063ffffffff16565b612c6890919063ffffffff16565b612cee90919063ffffffff16565b905060065461107482600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102b57600080fd5b505afa15801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b810190808051906020019092919050505061344990919063ffffffff16565b111561113857611131600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d602081101561110f57600080fd5b8101908080519060200190929190505050600654612d7790919063ffffffff16565b9050611219565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166111ad600a85612cee90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b505050506113046112f1846112e364e8d4a5100085612c6890919063ffffffff16565b612cee90919063ffffffff16565b856003015461344990919063ffffffff16565b8460030181905550438460020181905550505050505b50565b60026001541415611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600782815481106113ad57fe5b9060005260206000209060050201905060006008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555061147d33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133a79092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a35050506001808190555050565b6114e1612c60565b73ffffffffffffffffffffffffffffffffffffffff166114ff611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6107d061ffff168161ffff1611156115eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001806139476048913960600191505060405180910390fd5b80600b60146101000a81548161ffff021916908361ffff16021790555050565b60055481565b6000600780549050905060005b8181101561163a5761162f81610d8b565b80600101905061161e565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61166c612c60565b73ffffffffffffffffffffffffffffffffffffffff1661168a611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614611713576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6117d9612c60565b73ffffffffffffffffffffffffffffffffffffffff166117f7611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614611880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6101908261ffff1611156118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806139226025913960400191505060405180910390fd5b80156118ee576118ed611611565b5b6000600a54431161190157600a54611903565b435b905061191a8560095461344990919063ffffffff16565b60098190555060076040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001838152602001600081526020018561ffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548161ffff021916908361ffff16021790555050505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f736574466565416464726573733a20464f5242494444454e000000000000000081525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600181565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611b7b6001611b6d8585612d7790919063ffffffff16565b612c6890919063ffffffff16565b905092915050565b60026001541415611bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600060078481548110611c1357fe5b9060005260206000209060050201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611c8085610d8b565b600084118015611cdf5750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611d185750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611d5057503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611e1757600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c7f7b6b33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505050505b600081600001541115611e90576000611e6e8260010154611e6064e8d4a51000611e5287600301548760000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b90506000811115611e8e57611e833382612dfa565b611e8d33826130ce565b5b505b600084111561217557611eea3330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134d1909392919063ffffffff16565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561204c576000612033612710612025600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b65d08b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d602081101561200157600080fd5b810190808051906020019092919050505061ffff1688612c6890919063ffffffff16565b612cee90919063ffffffff16565b90506120488186612d7790919063ffffffff16565b9450505b60008260040160009054906101000a900461ffff1661ffff1611156121545760006120aa61271061209c8560040160009054906101000a900461ffff1661ffff1688612c6890919063ffffffff16565b612cee90919063ffffffff16565b905061211d600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133a79092919063ffffffff16565b6121468161213887856000015461344990919063ffffffff16565b612d7790919063ffffffff16565b826000018190555050612174565b61216b84826000015461344990919063ffffffff16565b81600001819055505b5b6121a764e8d4a5100061219984600301548460000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b8160010181905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a3505060018081905550505050565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b612245612c60565b73ffffffffffffffffffffffffffffffffffffffff16612263611b2a565b73ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806007848154811061234057fe5b9060005260206000209060050201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600301549050600654600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561241857600080fd5b505afa15801561242c573d6000803e3d6000fd5b505050506040513d602081101561244257600080fd5b8101908080519060200190929190505050106124a65761249c826001015461248e64e8d4a51000612480858760000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b935050505061266a565b60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561253357600080fd5b505afa158015612547573d6000803e3d6000fd5b505050506040513d602081101561255d57600080fd5b81019080805190602001909291905050509050836002015443118015612584575060008114155b1561261f576000612599856002015443611b53565b905060006125dc6009546125ce88600101546125c060055487612c6890919063ffffffff16565b612c6890919063ffffffff16565b612cee90919063ffffffff16565b905061261a61260b846125fd64e8d4a5100085612c6890919063ffffffff16565b612cee90919063ffffffff16565b8561344990919063ffffffff16565b935050505b612663836001015461265564e8d4a51000612647868860000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b9450505050505b92915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f736574446576416464726573733a20464f5242494444454e000000000000000081525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60149054906101000a900461ffff1681565b612793612c60565b73ffffffffffffffffffffffffffffffffffffffff166127b1611b2a565b73ffffffffffffffffffffffffffffffffffffffff161461283a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6101908261ffff161115612899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613a7c6025913960400191505060405180910390fd5b80156128a8576128a7611611565b5b6128ed836128df600787815481106128bc57fe5b906000526020600020906005020160010154600954612d7790919063ffffffff16565b61344990919063ffffffff16565b600981905550826007858154811061290157fe5b906000526020600020906005020160010181905550816007858154811061292457fe5b906000526020600020906005020160040160006101000a81548161ffff021916908361ffff16021790555050505050565b60065481565b612963612c60565b73ffffffffffffffffffffffffffffffffffffffff16612981611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614612a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139b96026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612b55612c60565b73ffffffffffffffffffffffffffffffffffffffff16612b73611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614612bfc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a544311612c56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806139df6034913960400191505060405180910390fd5b80600a8190555050565b600033905090565b600080831415612c7b5760009050612ce8565b6000828402905082848281612c8c57fe5b0414612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613a5b6021913960400191505060405180910390fd5b809150505b92915050565b6000808211612d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b818381612d6e57fe5b04905092915050565b600082821115612def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e8557600080fd5b505afa158015612e99573d6000803e3d6000fd5b505050506040513d6020811015612eaf57600080fd5b81019080805190602001909291905050509050600081831115612fa157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f5f57600080fd5b505af1158015612f73573d6000803e3d6000fd5b505050506040513d6020811015612f8957600080fd5b81019080805190602001909291905050509050613072565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b505050506040513d602081101561305e57600080fd5b810190808051906020019092919050505090505b806130c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613a396022913960400191505060405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561314157506000600b60149054906101000a900461ffff1661ffff16115b156133a3576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634a9fefc7846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156131d157600080fd5b505afa1580156131e5573d6000803e3d6000fd5b505050506040513d60208110156131fb57600080fd5b81019080805190602001909291905050509050600061324b61271061323d600b60149054906101000a900461ffff1661ffff1686612c6890919063ffffffff16565b612cee90919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561328a5750600081115b156133a057600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561332257600080fd5b505af1158015613336573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f86ddab457291316e0f5496737e5ca67c4037234c32c3be04c48ae96186893a7b836040518082815260200191505060405180910390a35b50505b5050565b6134448363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613592565b505050565b6000808284019050838110156134c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61358c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613592565b50505050565b60606135f4826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136819092919063ffffffff16565b905060008151111561367c5780806020019051602081101561361557600080fd5b810190808051906020019092919050505061367b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061398f602a913960400191505060405180910390fd5b5b505050565b60606136908484600085613699565b90509392505050565b6060824710156136f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a136026913960400191505060405180910390fd5b6136fd85613842565b61376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106137bf578051825260208201915060208101905060208303925061379c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613821576040519150601f19603f3d011682016040523d82523d6000602084013e613826565b606091505b5091509150613836828286613855565b92505050949350505050565b600080823b905060008111915050919050565b606083156138655782905061391a565b6000835111156138785782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138df5780820151818401526020810190506138c4565b50505050905090810190601f16801561390c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe6164643a20696e76616c6964206465706f7369742066656520626173697320706f696e7473736574526566657272616c436f6d6d697373696f6e526174653a20696e76616c696420726566657272616c20636f6d6d697373696f6e207261746520626173697320706f696e74735361666542455032303a204245503230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734661726d73206861766520616c726561647920737461727465642c2063616e6e6f74206368616e6765207374617274426c6f636b416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c7361666546616e74615472616e736665723a205472616e73666572206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777365743a20696e76616c6964206465706f7369742066656520626173697320706f696e7473a26469706673582212204b3d8c0f2a50d2469a5adc9393331cdf3bd6dc63c434f42870d1a216d39fd7db64736f6c634300060c0033000000000000000000000000899175a3a3e579a4c19dd0377b39f1f645f077a300000000000000000000000000000000000000000000000000000000021c438d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000001f4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f5780639e5914da116100a2578063d963842211610071578063d9638422146107f6578063e489d51014610848578063f2fde38b14610866578063fac2b9ba146108aa576101f0565b80639e5914da146106ea578063b157c1f81461072e578063d0d41fe114610790578063d30ef61b146107d4576101f0565b80638da5cb5b116100de5780638da5cb5b146105a95780638dbb1e3a146105dd5780638dbdbe6d1461062957806393f1a40b14610681576101f0565b8063715018a6146104d557806384e82a33146104df5780638705fcd4146105475780638aa285501461058b576101f0565b806348b22bfb1161018757806355dbc8261161015657806355dbc826146104475780636233a01d14610479578063630b5ba1146104975780636df00670146104a1576101f0565b806348b22bfb146103ab57806348cd4cb1146103cd57806351eb05a6146103eb5780635312ea8e14610419576101f0565b806317caf6f1116101c357806317caf6f1146102ed5780633ad10ef61461030b578063412753581461033f578063441a3e7014610373576101f0565b806302d8f98c146101f5578063081e3eda146102295780630ba84cd2146102475780631526fe2714610275575b600080fd5b6101fd6108d8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102316108fe565b6040518082815260200191505060405180910390f35b6102736004803603602081101561025d57600080fd5b810190808035906020019092919050505061090b565b005b6102a16004803603602081101561028b57600080fd5b81019080803590602001909291905050506109cc565b604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018261ffff1681526020019550505050505060405180910390f35b6102f5610a3d565b6040518082815260200191505060405180910390f35b610313610a43565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610347610a69565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103a96004803603604081101561038957600080fd5b810190808035906020019092919080359060200190929190505050610a8f565b005b6103b3610d7f565b604051808261ffff16815260200191505060405180910390f35b6103d5610d85565b6040518082815260200191505060405180910390f35b6104176004803603602081101561040157600080fd5b8101908080359060200190929190505050610d8b565b005b6104456004803603602081101561042f57600080fd5b810190808035906020019092919050505061131d565b005b6104776004803603602081101561045d57600080fd5b81019080803561ffff1690602001909291905050506114d9565b005b61048161160b565b6040518082815260200191505060405180910390f35b61049f611611565b005b6104a961163e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dd611664565b005b610545600480360360808110156104f557600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff1690602001909291908035151590602001909291905050506117d1565b005b6105896004803603602081101561055d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a1e565b005b610593611b25565b6040518082815260200191505060405180910390f35b6105b1611b2a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610613600480360360408110156105f357600080fd5b810190808035906020019092919080359060200190929190505050611b53565b6040518082815260200191505060405180910390f35b61067f6004803603606081101561063f57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b83565b005b6106cd6004803603604081101561069757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061220c565b604051808381526020018281526020019250505060405180910390f35b61072c6004803603602081101561070057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061223d565b005b61077a6004803603604081101561074457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612330565b6040518082815260200191505060405180910390f35b6107d2600480360360208110156107a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612670565b005b6107dc612777565b604051808261ffff16815260200191505060405180910390f35b6108466004803603608081101561080c57600080fd5b810190808035906020019092919080359060200190929190803561ffff16906020019092919080351515906020019092919050505061278b565b005b610850612955565b6040518082815260200191505060405180910390f35b6108a86004803603602081101561087c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061295b565b005b6108d6600480360360208110156108c057600080fd5b8101908080359060200190929190505050612b4d565b005b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600780549050905090565b610913612c60565b73ffffffffffffffffffffffffffffffffffffffff16610931611b2a565b73ffffffffffffffffffffffffffffffffffffffff16146109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109c2611611565b8060058190555050565b600781815481106109d957fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900461ffff16905085565b60095481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026001541415610b08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600060078381548110610b1f57fe5b9060005260206000209060050201905060006008600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610bfd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b610c0684610d8b565b6000610c508260010154610c4264e8d4a51000610c3487600301548760000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b90506000811115610c7057610c653382612dfa565b610c6f33826130ce565b5b6000841115610ce857610c90848360000154612d7790919063ffffffff16565b8260000181905550610ce733858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133a79092919063ffffffff16565b5b610d1a64e8d4a51000610d0c85600301548560000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568866040518082815260200191505060405180910390a3505050600180819055505050565b6107d081565b600a5481565b600060078281548110610d9a57fe5b90600052602060002090600502019050600654600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1557600080fd5b505afa158015610e29573d6000803e3d6000fd5b505050506040513d6020811015610e3f57600080fd5b810190808051906020019092919050505010610e64574381600201819055505061131a565b80600201544311610e75575061131a565b60008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f0257600080fd5b505afa158015610f16573d6000803e3d6000fd5b505050506040513d6020811015610f2c57600080fd5b810190808051906020019092919050505090506000811480610f52575060008260010154145b15610f6757438260020181905550505061131a565b6000610f77836002015443611b53565b90506000610fba600954610fac8660010154610f9e60055487612c6890919063ffffffff16565b612c6890919063ffffffff16565b612cee90919063ffffffff16565b905060065461107482600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561102b57600080fd5b505afa15801561103f573d6000803e3d6000fd5b505050506040513d602081101561105557600080fd5b810190808051906020019092919050505061344990919063ffffffff16565b111561113857611131600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d602081101561110f57600080fd5b8101908080519060200190929190505050600654612d7790919063ffffffff16565b9050611219565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f19600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166111ad600a85612cee90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050505b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b505050506113046112f1846112e364e8d4a5100085612c6890919063ffffffff16565b612cee90919063ffffffff16565b856003015461344990919063ffffffff16565b8460030181905550438460020181905550505050505b50565b60026001541415611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026001819055506000600782815481106113ad57fe5b9060005260206000209060050201905060006008600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600082600001819055506000826001018190555061147d33828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133a79092919063ffffffff16565b833373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a35050506001808190555050565b6114e1612c60565b73ffffffffffffffffffffffffffffffffffffffff166114ff611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614611588576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6107d061ffff168161ffff1611156115eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260488152602001806139476048913960600191505060405180910390fd5b80600b60146101000a81548161ffff021916908361ffff16021790555050565b60055481565b6000600780549050905060005b8181101561163a5761162f81610d8b565b80600101905061161e565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61166c612c60565b73ffffffffffffffffffffffffffffffffffffffff1661168a611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614611713576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6117d9612c60565b73ffffffffffffffffffffffffffffffffffffffff166117f7611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614611880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6101908261ffff1611156118df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806139226025913960400191505060405180910390fd5b80156118ee576118ed611611565b5b6000600a54431161190157600a54611903565b435b905061191a8560095461344990919063ffffffff16565b60098190555060076040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff168152602001878152602001838152602001600081526020018561ffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548161ffff021916908361ffff16021790555050505050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f736574466565416464726573733a20464f5242494444454e000000000000000081525060200191505060405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600181565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611b7b6001611b6d8585612d7790919063ffffffff16565b612c6890919063ffffffff16565b905092915050565b60026001541415611bfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600181905550600060078481548110611c1357fe5b9060005260206000209060050201905060006008600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611c8085610d8b565b600084118015611cdf5750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b8015611d185750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015611d5057503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15611e1757600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c7f7b6b33856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505050505b600081600001541115611e90576000611e6e8260010154611e6064e8d4a51000611e5287600301548760000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b90506000811115611e8e57611e833382612dfa565b611e8d33826130ce565b5b505b600084111561217557611eea3330868560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134d1909392919063ffffffff16565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561204c576000612033612710612025600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b65d08b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd757600080fd5b505afa158015611feb573d6000803e3d6000fd5b505050506040513d602081101561200157600080fd5b810190808051906020019092919050505061ffff1688612c6890919063ffffffff16565b612cee90919063ffffffff16565b90506120488186612d7790919063ffffffff16565b9450505b60008260040160009054906101000a900461ffff1661ffff1611156121545760006120aa61271061209c8560040160009054906101000a900461ffff1661ffff1688612c6890919063ffffffff16565b612cee90919063ffffffff16565b905061211d600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166133a79092919063ffffffff16565b6121468161213887856000015461344990919063ffffffff16565b612d7790919063ffffffff16565b826000018190555050612174565b61216b84826000015461344990919063ffffffff16565b81600001819055505b5b6121a764e8d4a5100061219984600301548460000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b8160010181905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040518082815260200191505060405180910390a3505060018081905550505050565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b612245612c60565b73ffffffffffffffffffffffffffffffffffffffff16612263611b2a565b73ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806007848154811061234057fe5b9060005260206000209060050201905060006008600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600301549050600654600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561241857600080fd5b505afa15801561242c573d6000803e3d6000fd5b505050506040513d602081101561244257600080fd5b8101908080519060200190929190505050106124a65761249c826001015461248e64e8d4a51000612480858760000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b935050505061266a565b60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561253357600080fd5b505afa158015612547573d6000803e3d6000fd5b505050506040513d602081101561255d57600080fd5b81019080805190602001909291905050509050836002015443118015612584575060008114155b1561261f576000612599856002015443611b53565b905060006125dc6009546125ce88600101546125c060055487612c6890919063ffffffff16565b612c6890919063ffffffff16565b612cee90919063ffffffff16565b905061261a61260b846125fd64e8d4a5100085612c6890919063ffffffff16565b612cee90919063ffffffff16565b8561344990919063ffffffff16565b935050505b612663836001015461265564e8d4a51000612647868860000154612c6890919063ffffffff16565b612cee90919063ffffffff16565b612d7790919063ffffffff16565b9450505050505b92915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612733576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f736574446576416464726573733a20464f5242494444454e000000000000000081525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60149054906101000a900461ffff1681565b612793612c60565b73ffffffffffffffffffffffffffffffffffffffff166127b1611b2a565b73ffffffffffffffffffffffffffffffffffffffff161461283a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6101908261ffff161115612899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613a7c6025913960400191505060405180910390fd5b80156128a8576128a7611611565b5b6128ed836128df600787815481106128bc57fe5b906000526020600020906005020160010154600954612d7790919063ffffffff16565b61344990919063ffffffff16565b600981905550826007858154811061290157fe5b906000526020600020906005020160010181905550816007858154811061292457fe5b906000526020600020906005020160040160006101000a81548161ffff021916908361ffff16021790555050505050565b60065481565b612963612c60565b73ffffffffffffffffffffffffffffffffffffffff16612981611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614612a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806139b96026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612b55612c60565b73ffffffffffffffffffffffffffffffffffffffff16612b73611b2a565b73ffffffffffffffffffffffffffffffffffffffff1614612bfc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600a544311612c56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806139df6034913960400191505060405180910390fd5b80600a8190555050565b600033905090565b600080831415612c7b5760009050612ce8565b6000828402905082848281612c8c57fe5b0414612ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613a5b6021913960400191505060405180910390fd5b809150505b92915050565b6000808211612d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b818381612d6e57fe5b04905092915050565b600082821115612def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e8557600080fd5b505afa158015612e99573d6000803e3d6000fd5b505050506040513d6020811015612eaf57600080fd5b81019080805190602001909291905050509050600081831115612fa157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f5f57600080fd5b505af1158015612f73573d6000803e3d6000fd5b505050506040513d6020811015612f8957600080fd5b81019080805190602001909291905050509050613072565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561303457600080fd5b505af1158015613048573d6000803e3d6000fd5b505050506040513d602081101561305e57600080fd5b810190808051906020019092919050505090505b806130c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613a396022913960400191505060405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561314157506000600b60149054906101000a900461ffff1661ffff16115b156133a3576000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634a9fefc7846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156131d157600080fd5b505afa1580156131e5573d6000803e3d6000fd5b505050506040513d60208110156131fb57600080fd5b81019080805190602001909291905050509050600061324b61271061323d600b60149054906101000a900461ffff1661ffff1686612c6890919063ffffffff16565b612cee90919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561328a5750600081115b156133a057600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1983836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561332257600080fd5b505af1158015613336573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f86ddab457291316e0f5496737e5ca67c4037234c32c3be04c48ae96186893a7b836040518082815260200191505060405180910390a35b50505b5050565b6134448363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613592565b505050565b6000808284019050838110156134c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b61358c846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613592565b50505050565b60606135f4826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136819092919063ffffffff16565b905060008151111561367c5780806020019051602081101561361557600080fd5b810190808051906020019092919050505061367b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061398f602a913960400191505060405180910390fd5b5b505050565b60606136908484600085613699565b90509392505050565b6060824710156136f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a136026913960400191505060405180910390fd5b6136fd85613842565b61376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106137bf578051825260208201915060208101905060208303925061379c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613821576040519150601f19603f3d011682016040523d82523d6000602084013e613826565b606091505b5091509150613836828286613855565b92505050949350505050565b600080823b905060008111915050919050565b606083156138655782905061391a565b6000835111156138785782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138df5780820151818401526020810190506138c4565b50505050905090810190601f16801561390c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe6164643a20696e76616c6964206465706f7369742066656520626173697320706f696e7473736574526566657272616c436f6d6d697373696f6e526174653a20696e76616c696420726566657272616c20636f6d6d697373696f6e207261746520626173697320706f696e74735361666542455032303a204245503230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734661726d73206861766520616c726561647920737461727465642c2063616e6e6f74206368616e6765207374617274426c6f636b416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c7361666546616e74615472616e736665723a205472616e73666572206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777365743a20696e76616c6964206465706f7369742066656520626173697320706f696e7473a26469706673582212204b3d8c0f2a50d2469a5adc9393331cdf3bd6dc63c434f42870d1a216d39fd7db64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000899175a3a3e579a4c19dd0377b39f1f645f077a300000000000000000000000000000000000000000000000000000000021c438d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000001f4
-----Decoded View---------------
Arg [0] : _fanta (address): 0x899175a3A3e579A4c19DD0377b39F1F645F077a3
Arg [1] : _startBlock (uint256): 35406733
Arg [2] : _emissionRate (uint256): 1
Arg [3] : _maxSupply (uint256): 2000
Arg [4] : _referralRate (uint16): 500
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000899175a3a3e579a4c19dd0377b39f1f645f077a3
Arg [1] : 00000000000000000000000000000000000000000000000000000000021c438d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001f4
Deployed Bytecode Sourcemap
74342:14035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75790:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;77755:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;86660:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76195:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76436:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;75841:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;75901;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;84399:839;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76781:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;76528:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;81236:1196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;85309:398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;87320:366;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;75973:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;80980:180;;;:::i;:::-;;76603:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27380:148;;;:::i;:::-;;78019:776;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;86486:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76056:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26729:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;79512:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;82502:1845;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76277:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;87141:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;79752:1145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;86312:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76695:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;78908:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76128:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27683:281;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;86818:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;75790:23;;;;;;;;;;;;;:::o;77755:95::-;77800:7;77827:8;:15;;;;77820:22;;77755:95;:::o;86660:150::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86742:17:::1;:15;:17::i;:::-;86786:16;86770:13;:32;;;;86660:150:::0;:::o;76195:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76436:34::-;;;;:::o;75841:25::-;;;;;;;;;;;;;:::o;75901:::-;;;;;;;;;;;;;:::o;84399:839::-;29725:1;30330:7;;:19;;30322:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29725:1;30463:7;:18;;;;84479:21:::1;84503:8;84512:4;84503:14;;;;;;;;;;;;;;;;;;84479:38;;84528:21;84552:8;:14;84561:4;84552:14;;;;;;;;;;;:26;84567:10;84552:26;;;;;;;;;;;;;;;84528:50;;84612:7;84597:4;:11;;;:22;;84589:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;84653:16;84664:4;84653:10;:16::i;:::-;84680:15;84698:93;84765:4;:15;;;84698:48;84741:4;84698:38;84714:4;:21;;;84698:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;:52;;:93;;;;:::i;:::-;84680:111;;84816:1;84806:7;:11;84802:139;;;84834:38;84852:10;84864:7;84834:17;:38::i;:::-;84887:42;84909:10;84921:7;84887:21;:42::i;:::-;84802:139;84965:1;84955:7;:11;84951:152;;;84997:24;85013:7;84997:4;:11;;;:15;;:24;;;;:::i;:::-;84983:4;:11;;:38;;;;85036:55;85070:10;85083:7;85036:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;84951:152;85131:48;85174:4;85131:38;85147:4;:21;;;85131:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;85113:4;:15;;:66;;;;85216:4;85204:10;85195:35;;;85222:7;85195:35;;;;;;;;;;;;;;;;;;30494:1;;;29681::::0;30642:7;:22;;;;84399:839;;:::o;76781:62::-;76839:4;76781:62;:::o;76528:25::-;;;;:::o;81236:1196::-;81288:21;81312:8;81321:4;81312:14;;;;;;;;;;;;;;;;;;81288:38;;81364:16;;81341:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;81337:128;;81420:12;81397:4;:20;;:35;;;;81447:7;;;81337:128;81495:4;:20;;;81479:12;:36;81475:75;;81532:7;;;81475:75;81560:16;81579:4;:12;;;;;;;;;;;;:22;;;81610:4;81579:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81560:56;;81643:1;81631:8;:13;:37;;;;81667:1;81648:4;:15;;;:20;81631:37;81627:126;;;81708:12;81685:4;:20;;:35;;;;81735:7;;;;81627:126;81763:18;81784:49;81798:4;:20;;;81820:12;81784:13;:49::i;:::-;81763:70;;81844:19;81866:113;81963:15;;81866:78;81928:4;:15;;;81866:43;81895:13;;81866:10;:28;;:43;;;;:::i;:::-;:61;;:78;;;;:::i;:::-;:96;;:113;;;;:::i;:::-;81844:135;;82033:16;;81994:36;82018:11;81994:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:36;;;;:::i;:::-;:55;81990:219;;;82080:41;82101:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82080:16;;:20;;:41;;;;:::i;:::-;82066:55;;81990:219;;;82154:5;;;;;;;;;;;:10;;;82165;;;;;;;;;;;82177:19;82193:2;82177:11;:15;;:19;;;;:::i;:::-;82154:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81990:219;82219:5;;;;;;;;;;;:10;;;82238:4;82245:11;82219:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82292:86;82332:35;82358:8;82332:21;82348:4;82332:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;82292:4;:21;;;:25;;:86;;;;:::i;:::-;82268:4;:21;;:110;;;;82412:12;82389:4;:20;;:35;;;;81236:1196;;;;;;:::o;85309:398::-;29725:1;30330:7;;:19;;30322:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29725:1;30463:7;:18;;;;85381:21:::1;85405:8;85414:4;85405:14;;;;;;;;;;;;;;;;;;85381:38;;85430:21;85454:8;:14;85463:4;85454:14;;;;;;;;;;;:26;85469:10;85454:26;;;;;;;;;;;;;;;85430:50;;85491:14;85508:4;:11;;;85491:28;;85544:1;85530:4;:11;;:15;;;;85574:1;85556:4;:15;;:19;;;;85586:54;85620:10;85633:6;85586:4;:12;;;;;;;;;;;;:25;;;;:54;;;;;:::i;:::-;85686:4;85674:10;85656:43;;;85692:6;85656:43;;;;;;;;;;;;;;;;;;30494:1;;;29681::::0;30642:7;:22;;;;85309:398;:::o;87320:366::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76839:4:::1;87460:59;;:23;:59;;;;87438:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87655:23;87630:22;;:48;;;;;;;;;;;;;;;;;;87320:366:::0;:::o;75973:28::-;;;;:::o;80980:180::-;81025:14;81042:8;:15;;;;81025:32;;81073:11;81068:85;81096:6;81090:3;:12;81068:85;;;81126:15;81137:3;81126:10;:15::i;:::-;81104:5;;;;;81068:85;;;;80980:180;:::o;76603:35::-;;;;;;;;;;;;;:::o;27380:148::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27487:1:::1;27450:40;;27471:6;::::0;::::1;;;;;;;;27450:40;;;;;;;;;;;;27518:1;27501:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;27380:148::o:0;78019:776::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78206:3:::1;78189:13;:20;;;;78181:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78266:11;78262:61;;;78294:17;:15;:17::i;:::-;78262:61;78333:23;78374:10;;78359:12;:25;:79;;78428:10;;78359:79;;;78400:12;78359:79;78333:105;;78467:32;78487:11;78467:15;;:19;;:32;;;;:::i;:::-;78449:15;:50;;;;78510:8;78538:238;;;;;;;;78575:8;78538:238;;;;;;78614:11;78538:238;;;;78661:15;78538:238;;;;78713:1;78538:238;;;;78747:13;78538:238;;;;::::0;78510:277:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27020:1;78019:776:::0;;;;:::o;86486:166::-;86570:10;;;;;;;;;;;86556:24;;:10;:24;;;86548:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86633:11;86620:10;;:24;;;;;;;;;;;;;;;;;;86486:166;:::o;76056:44::-;76099:1;76056:44;:::o;26729:87::-;26775:7;26802:6;;;;;;;;;;;26795:13;;26729:87;:::o;79512:175::-;79611:7;79643:36;76099:1;79643:14;79651:5;79643:3;:7;;:14;;;;:::i;:::-;:18;;:36;;;;:::i;:::-;79636:43;;79512:175;;;;:::o;82502:1845::-;29725:1;30330:7;;:19;;30322:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29725:1;30463:7;:18;;;;82634:21:::1;82658:8;82667:4;82658:14;;;;;;;;;;;;;;;;;;82634:38;;82683:21;82707:8;:14;82716:4;82707:14;;;;;;;;;;;:26;82722:10;82707:26;;;;;;;;;;;;;;;82683:50;;82744:16;82755:4;82744:10;:16::i;:::-;82799:1;82789:7;:11;:64;;;;;82851:1;82817:36;;82825:13;;;;;;;;;;;82817:36;;;;82789:64;:104;;;;;82891:1;82870:23;;:9;:23;;;;82789:104;:144;;;;;82923:10;82910:23;;:9;:23;;;;82789:144;82771:252;;;82960:13;;;;;;;;;;;:28;;;82989:10;83001:9;82960:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;82771:252;83051:1;83037:4;:11;;;:15;83033:372;;;83069:15;83087:141;83212:4;:15;;;83087:102;83184:4;83087:74;83139:4;:21;;;83087:4;:29;;;:51;;:74;;;;:::i;:::-;:96;;:102;;;;:::i;:::-;:124;;:141;;;;:::i;:::-;83069:159;;83257:1;83247:7;:11;83243:151;;;83279:38;83297:10;83309:7;83279:17;:38::i;:::-;83336:42;83358:10;83370:7;83336:21;:42::i;:::-;83243:151;83033:372;;83429:1;83419:7;:11;83415:798;;;83447:140;83503:10;83541:4;83565:7;83447:4;:12;;;;;;;;;;;;:29;;;;:140;;;;;;:::i;:::-;83639:5;;;;;;;;;;;83606:39;;83614:4;:12;;;;;;;;;;;;83606:39;;;83602:242;;;83666:19;83688:87;83751:5;83688:36;83700:5;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;83688:36;;:7;:11;;:36;;;;:::i;:::-;:40;;:87;;;;:::i;:::-;83666:109;;83804:24;83816:11;83804:7;:11;;:24;;;;:::i;:::-;83794:34;;83602:242;;83882:1;83862:4;:17;;;;;;;;;;;;:21;;;83858:344;;;83904:18;83925:41;83960:5;83925:30;83937:4;:17;;;;;;;;;;;;83925:30;;:7;:11;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;83904:62;;83985:49;84011:10;;;;;;;;;;;84023;83985:4;:12;;;;;;;;;;;;:25;;;;:49;;;;;:::i;:::-;84067:40;84096:10;84067:24;84083:7;84067:4;:11;;;:15;;:24;;;;:::i;:::-;:28;;:40;;;;:::i;:::-;84053:4;:11;;:54;;;;83858:344;;;;84162:24;84178:7;84162:4;:11;;;:15;;:24;;;;:::i;:::-;84148:4;:11;;:38;;;;83858:344;83415:798;84241:48;84284:4;84241:38;84257:4;:21;;;84241:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;84223:4;:15;;:66;;;;84325:4;84313:10;84305:34;;;84331:7;84305:34;;;;;;;;;;;;;;;;;;30494:1;;29681::::0;30642:7;:22;;;;82502:1845;;;:::o;76277:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;87141:118::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87237:14:::1;87221:13;;:30;;;;;;;;;;;;;;;;;;87141:118:::0;:::o;79752:1145::-;79853:7;79878:21;79902:8;79911:4;79902:14;;;;;;;;;;;;;;;;;;79878:38;;79927:21;79951:8;:14;79960:4;79951:14;;;;;;;;;;;:21;79966:5;79951:21;;;;;;;;;;;;;;;79927:45;;79983:24;80010:4;:21;;;79983:48;;80069:16;;80046:5;;;;;;;;;;;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;80042:200;;80126:104;80196:4;:15;;;80126:43;80164:4;80126:33;80142:16;80126:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:104;;;;:::i;:::-;80102:128;;;;;;;80042:200;80252:16;80271:4;:12;;;;;;;;;;;;:22;;;80302:4;80271:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80252:56;;80338:4;:20;;;80323:12;:35;:52;;;;;80374:1;80362:8;:13;;80323:52;80319:489;;;80392:18;80413:98;80445:4;:20;;;80484:12;80413:13;:98::i;:::-;80392:119;;80526:19;80548:125;80657:15;;80548:86;80618:4;:15;;;80548:47;80581:13;;80548:10;:32;;:47;;;;:::i;:::-;:69;;:86;;;;:::i;:::-;:108;;:125;;;;:::i;:::-;80526:147;;80707:89;80746:35;80772:8;80746:21;80762:4;80746:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;80707:16;:20;;:89;;;;:::i;:::-;80688:108;;80319:489;;;80825:64;80873:4;:15;;;80825:43;80863:4;80825:33;80841:16;80825:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:64;;;;:::i;:::-;80818:71;;;;;;79752:1145;;;;;:::o;86312:166::-;86396:10;;;;;;;;;;;86382:24;;:10;:24;;;86374:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86459:11;86446:10;;:24;;;;;;;;;;;;;;;;;;86312:166;:::o;76695:36::-;;;;;;;;;;;;;:::o;78908:528::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79092:3:::1;79075:13;:20;;;;79067:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79152:11;79148:61;;;79180:17;:15;:17::i;:::-;79148:61;79237:87;79302:11;79237:46;79257:8;79266:4;79257:14;;;;;;;;;;;;;;;;;;:25;;;79237:15;;:19;;:46;;;;:::i;:::-;:50;;:87;;;;:::i;:::-;79219:15;:105;;;;79363:11;79335:8;79344:4;79335:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;79415:13;79385:8;79394:4;79385:14;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;78908:528:::0;;;;:::o;76128:31::-;;;;:::o;27683:281::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27806:1:::1;27786:22;;:8;:22;;;;27764:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27919:8;27890:38;;27911:6;::::0;::::1;;;;;;;;27890:38;;;;;;;;;;;;27948:8;27939:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;27683:281:::0;:::o;86818:251::-;26960:12;:10;:12::i;:::-;26949:23;;:7;:5;:7::i;:::-;:23;;;26941:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86933:10:::1;;86918:12;:25;86896:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87047:14;87034:10;:27;;;;86818:251:::0;:::o;25238:106::-;25291:15;25326:10;25319:17;;25238:106;:::o;3935:220::-;3993:7;4022:1;4017;:6;4013:20;;;4032:1;4025:8;;;;4013:20;4044:9;4060:1;4056;:5;4044:17;;4089:1;4084;4080;:5;;;;;;:10;4072:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4146:1;4139:8;;;3935:220;;;;;:::o;4633:153::-;4691:7;4723:1;4719;:5;4711:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4777:1;4773;:5;;;;;;4766:12;;4633:153;;;;:::o;3518:158::-;3576:7;3609:1;3604;:6;;3596:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3667:1;3663;:5;3656:12;;3518:158;;;;:::o;85823:433::-;85900:16;85919:5;;;;;;;;;;;:15;;;85943:4;85919:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85900:49;;85960:20;86013:8;86003:7;:18;85999:177;;;86056:5;;;;;;;;;;;:14;;;86071:3;86076:8;86056:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86038:47;;85999:177;;;86136:5;;;;;;;;;;;:14;;;86151:3;86156:7;86136:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86118:46;;85999:177;86194:15;86186:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85823:433;;;;:::o;87766:608::-;87902:1;87868:36;;87876:13;;;;;;;;;;;87868:36;;;;:66;;;;;87933:1;87908:22;;;;;;;;;;;:26;;;87868:66;87850:517;;;87961:16;87980:13;;;;;;;;;;;:25;;;88006:5;87980:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87961:51;;88027:24;88054:79;88113:5;88054:36;88067:22;;;;;;;;;;;88054:36;;:8;:12;;:36;;;;:::i;:::-;:40;;:79;;;;:::i;:::-;88027:106;;88174:1;88154:22;;:8;:22;;;;:46;;;;;88199:1;88180:16;:20;88154:46;88150:206;;;88221:5;;;;;;;;;;;:10;;;88232:8;88242:16;88221:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88313:8;88283:57;;88306:5;88283:57;;;88323:16;88283:57;;;;;;;;;;;;;;;;;;88150:206;87850:517;;;87766:608;;:::o;20481:248::-;20598:123;20632:5;20675:23;;;20700:2;20704:5;20652:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20598:19;:123::i;:::-;20481:248;;;:::o;3056:179::-;3114:7;3134:9;3150:1;3146;:5;3134:17;;3175:1;3170;:6;;3162:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3226:1;3219:8;;;3056:179;;;;:::o;20737:285::-;20881:133;20915:5;20958:27;;;20987:4;20993:2;20997:5;20935:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20881:19;:133::i;:::-;20737:285;;;;:::o;23357:860::-;23781:23;23807:106;23849:4;23807:106;;;;;;;;;;;;;;;;;23815:5;23807:27;;;;:106;;;;;:::i;:::-;23781:132;;23948:1;23928:10;:17;:21;23924:286;;;24101:10;24090:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24064:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23924:286;23357:860;;;:::o;14931:229::-;15068:12;15100:52;15122:6;15130:4;15136:1;15139:12;15100:21;:52::i;:::-;15093:59;;14931:229;;;;;:::o;16147:632::-;16317:12;16389:5;16364:21;:30;;16342:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16479:18;16490:6;16479:10;:18::i;:::-;16471:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16605:12;16619:23;16646:6;:11;;16665:5;16686:4;16646:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16604:97;;;;16719:52;16737:7;16746:10;16758:12;16719:17;:52::i;:::-;16712:59;;;;16147:632;;;;;;:::o;11894:444::-;11954:4;12162:12;12286:7;12274:20;12266:28;;12329:1;12322:4;:8;12315:15;;;11894:444;;;:::o;19070:777::-;19220:12;19249:7;19245:595;;;19280:10;19273:17;;;;19245:595;19414:1;19394:10;:17;:21;19390:439;;;19657:10;19651:17;19718:15;19705:10;19701:2;19697:19;19690:44;19605:148;19800:12;19793:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:777;;;;;;:::o
Swarm Source
ipfs://4b3d8c0f2a50d2469a5adc9393331cdf3bd6dc63c434f42870d1a216d39fd7db
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.