Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 105 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Create Token | 21478280 | 423 days ago | IN | 0.035 ETH | 0.03497881 | ||||
| Create Token | 21238813 | 457 days ago | IN | 0.035 ETH | 0.12989119 | ||||
| Create Token | 21214000 | 460 days ago | IN | 0.035 ETH | 0.09817033 | ||||
| Create Token | 21145055 | 470 days ago | IN | 0.035 ETH | 0.12268598 | ||||
| Create Token | 21118754 | 474 days ago | IN | 0.035 ETH | 0.0366 | ||||
| Create Token | 21081730 | 479 days ago | IN | 0.035 ETH | 0.08235291 | ||||
| Create Token | 21018164 | 488 days ago | IN | 0.035 ETH | 0.05159348 | ||||
| Create Token | 20958856 | 496 days ago | IN | 0.035 ETH | 0.18589043 | ||||
| Create Token | 20906593 | 503 days ago | IN | 0.035 ETH | 0.06140196 | ||||
| Create Token | 20779668 | 521 days ago | IN | 0.035 ETH | 0.09286469 | ||||
| Create Token | 20746394 | 526 days ago | IN | 0.035 ETH | 0.01026046 | ||||
| Create Token | 20723143 | 529 days ago | IN | 0.035 ETH | 0.1460937 | ||||
| Create Token | 20692542 | 533 days ago | IN | 0.035 ETH | 0.12451602 | ||||
| Create Token | 20664754 | 537 days ago | IN | 0.035 ETH | 0.05351018 | ||||
| Create Token | 20631062 | 542 days ago | IN | 0.035 ETH | 0.01044498 | ||||
| Create Token | 20625959 | 542 days ago | IN | 0.035 ETH | 0.01507721 | ||||
| Create Token | 20616688 | 544 days ago | IN | 0.035 ETH | 0.01133193 | ||||
| Create Token | 20587214 | 548 days ago | IN | 0 ETH | 0.00003198 | ||||
| Create Token | 20587210 | 548 days ago | IN | 0 ETH | 0.0000347 | ||||
| Create Token | 20587204 | 548 days ago | IN | 0 ETH | 0.00004298 | ||||
| Create Token | 20575836 | 549 days ago | IN | 0.035 ETH | 0.01490558 | ||||
| Create Token | 20565606 | 551 days ago | IN | 0.035 ETH | 0.00887514 | ||||
| Create Token | 20559672 | 552 days ago | IN | 0.035 ETH | 0.00925877 | ||||
| Create Token | 20497534 | 560 days ago | IN | 0.035 ETH | 0.011043 | ||||
| Create Token | 20294056 | 589 days ago | IN | 0.035 ETH | 0.0123239 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 21478280 | 423 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21478280 | 423 days ago | 0.035 ETH | ||||
| 0x60806040 | 21238813 | 457 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21238813 | 457 days ago | 0.035 ETH | ||||
| 0x60806040 | 21214000 | 460 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21214000 | 460 days ago | 0.035 ETH | ||||
| 0x60806040 | 21145055 | 470 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21145055 | 470 days ago | 0.035 ETH | ||||
| 0x60806040 | 21118754 | 474 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21118754 | 474 days ago | 0.035 ETH | ||||
| 0x60806040 | 21081730 | 479 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21081730 | 479 days ago | 0.035 ETH | ||||
| 0x60806040 | 21018164 | 488 days ago | Contract Creation | 0 ETH | |||
| Transfer | 21018164 | 488 days ago | 0.035 ETH | ||||
| 0x60806040 | 20958856 | 496 days ago | Contract Creation | 0 ETH | |||
| Transfer | 20958856 | 496 days ago | 0.035 ETH | ||||
| 0x60806040 | 20906593 | 503 days ago | Contract Creation | 0 ETH | |||
| Transfer | 20906593 | 503 days ago | 0.035 ETH | ||||
| 0x60806040 | 20779668 | 521 days ago | Contract Creation | 0 ETH | |||
| Transfer | 20779668 | 521 days ago | 0.035 ETH | ||||
| 0x60806040 | 20746394 | 526 days ago | Contract Creation | 0 ETH | |||
| Transfer | 20746394 | 526 days ago | 0.035 ETH | ||||
| 0x60806040 | 20723143 | 529 days ago | Contract Creation | 0 ETH | |||
| Transfer | 20723143 | 529 days ago | 0.035 ETH | ||||
| 0x60806040 | 20692542 | 533 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MintGenerator
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-06-16
*/
// Sources flattened with hardhat v2.12.6 https://hardhat.org
// File contracts/interfaces/IMintFactory.sol
// SPDX-License-Identifier: UNLICENSED
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
pragma solidity 0.8.17;
interface IMintFactory {
struct TaxHelper {
string Name;
address Address;
uint Index;
}
function addTaxHelper(string calldata _name, address _address) external;
function updateTaxHelper(uint _index, address _address) external;
function getTaxHelperAddress(uint _index) external view returns(address);
function getTaxHelpersDataByIndex(uint _index) external view returns(TaxHelper memory);
function registerToken (address _tokenOwner, address _tokenAddress) external;
function tokenIsRegistered(address _tokenAddress) external view returns (bool);
function tokenGeneratorsLength() external view returns (uint256);
function tokenGeneratorIsAllowed(address _tokenGenerator) external view returns (bool);
function getFacetHelper() external view returns (address);
function updateFacetHelper(address _newFacetHelperAddress) external;
function getFeeHelper() external view returns (address);
function updateFeeHelper(address _newFeeHelperAddress) external;
function getLosslessController() external view returns (address);
function updateLosslessController(address _newLosslessControllerAddress) external;
}
// File contracts/interfaces/ITaxHelper.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface ITaxHelper {
function initiateBuyBackTax(
address _token,
address _wallet
) external returns (bool);
function initiateLPTokenTax(
address _token,
address _wallet
) external returns (bool);
function lpTokenHasReserves(address _lpToken) external view returns (bool);
function createLPToken() external returns (address lpToken);
function sync(address _lpToken) external;
}
// File contracts/interfaces/IERC20.sol
// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v4.0.0
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File contracts/interfaces/ITaxToken.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface ITaxToken is IERC20 {
function taxHelperIndex()external view returns(uint);
function buyBackBurn(uint256 _amount) external;
function owner() external view returns (address);
function pairAddress() external view returns (address);
function decimals() external view returns (uint8);
}
// File contracts/libraries/Context.sol
//
// File @openzeppelin/contracts/utils/Context.sol@v4.0.0
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File contracts/libraries/Ownable.sol
//
// File @openzeppelin/contracts/access/Ownable.sol@v4.0.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 () {
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 contracts/BuyBackWallet.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract BuyBackWallet is Ownable{
ITaxToken public token;
IMintFactory public factory;
uint256 private threshold;
event UpdatedThreshold(uint256 _newThreshold);
event ETHtoTaxHelper(uint256 amount);
constructor(address _factory, address _token, uint256 _newThreshold) {
token = ITaxToken(_token);
factory = IMintFactory(_factory);
threshold = _newThreshold;
emit UpdatedThreshold(_newThreshold);
transferOwnership(_token);
}
function checkBuyBackTrigger() public view returns (bool) {
return address(this).balance > threshold;
}
function getBalance() public view returns (uint256) {
return address(this).balance;
}
function sendEthToTaxHelper() external returns (uint256) {
uint index = token.taxHelperIndex();
require(msg.sender == factory.getTaxHelperAddress(index), "RA");
uint256 amount = address(this).balance;
(bool sent,) = msg.sender.call{value: amount}("");
require(sent, "Failed to send Ether");
emit ETHtoTaxHelper(amount);
return amount;
}
function updateThreshold(uint256 _newThreshold) external onlyOwner {
threshold = _newThreshold;
emit UpdatedThreshold(_newThreshold);
}
function getThreshold() external view returns (uint256) {
return threshold;
}
receive() payable external {
}
}
// File contracts/FacetHelper.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract FacetHelper is Ownable{
event AddedFacet(address _newFacet);
event AddedSelector(address _facet, bytes4 _sig);
event RemovedSelector(bytes4 _sig);
event ResetStorage();
event UpdatedSettingsFacet(address _newAddress);
event UpdatedLosslessFacet(address _newAddress);
event UpdatedTaxFacet(address _newAddress);
event UpdatedConstructorFacet(address _newAddress);
event UpdatedWalletsFacet(address _newAddress);
event UpdatedAntiBotFacet(address _newAddress);
event UpdatedMulticallFacet(address _newAddress);
struct Facets {
address Settings;
address Lossless;
address Tax;
address Constructor;
address Wallets;
address AntiBot;
address Multicall;
}
struct FacetAddressAndPosition {
address facetAddress;
uint16 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
}
struct FacetFunctionSelectors {
bytes4[] functionSelectors;
uint16 facetAddressPosition; // position of facetAddress in facetAddresses array
}
// maps function selector to the facet address and
// the position of the selector in the facetFunctionSelectors.selectors array
mapping(bytes4 => FacetAddressAndPosition) _selectorToFacetAndPosition;
// maps facet addresses to function selectors
mapping(address => FacetFunctionSelectors) _facetFunctionSelectors;
// facet addresses
address[] _facetAddresses;
// Used to query if a contract implements an interface.
// Used to implement ERC-165.
mapping(bytes4 => bool) supportedInterfaces;
Facets public facetsInfo;
enum FacetCutAction {Add, Replace, Remove}
// Add=0, Replace=1, Remove=2
struct FacetCut {
address facetAddress;
FacetCutAction action;
bytes4[] functionSelectors;
}
struct Facet {
address facetAddress;
bytes4[] functionSelectors;
}
/// @notice Gets all facets and their selectors.
/// @return facets_ Facet
function facets() external view returns (Facet[] memory facets_) {
uint256 numFacets = _facetAddresses.length;
facets_ = new Facet[](numFacets);
for (uint256 i; i < numFacets; i++) {
address facetAddress_ = _facetAddresses[i];
facets_[i].facetAddress = facetAddress_;
facets_[i].functionSelectors = _facetFunctionSelectors[facetAddress_].functionSelectors;
}
}
/// @notice Gets all the function selectors provided by a facet.
/// @param _facet The facet address.
/// @return facetFunctionSelectors_
function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_) {
facetFunctionSelectors_ = _facetFunctionSelectors[_facet].functionSelectors;
}
/// @notice Get all the facet addresses used by a diamond.
/// @return facetAddresses_
function facetAddresses() external view returns (address[] memory facetAddresses_) {
facetAddresses_ = _facetAddresses;
}
/// @notice Gets the facet that supports the given selector.
/// @dev If facet is not found return address(0).
/// @param _functionSelector The function selector.
/// @return facetAddress_ The facet address.
function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_) {
facetAddress_ = _selectorToFacetAndPosition[_functionSelector].facetAddress;
}
// This implements ERC-165.
function supportsInterface(bytes4 _interfaceId) external view returns (bool) {
return supportedInterfaces[_interfaceId];
}
event DiamondCut(FacetCut[] _diamondCut);
function diamondCut(
FacetCut[] memory _diamondCut
) public onlyOwner {
for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
FacetCutAction action = _diamondCut[facetIndex].action;
if (action == FacetCutAction.Add) {
addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
} else if (action == FacetCutAction.Replace) {
replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
} else if (action == FacetCutAction.Remove) {
removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
} else {
revert("LibDiamondCut: Incorrect FacetCutAction");
}
}
emit DiamondCut(_diamondCut);
}
function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
// uint16 selectorCount = uint16(diamondStorage().selectors.length);
require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
uint16 selectorPosition = uint16(_facetFunctionSelectors[_facetAddress].functionSelectors.length);
// add new facet address if it does not exist
if (selectorPosition == 0) {
enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code");
_facetFunctionSelectors[_facetAddress].facetAddressPosition = uint16(_facetAddresses.length);
_facetAddresses.push(_facetAddress);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = _selectorToFacetAndPosition[selector].facetAddress;
require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists");
_facetFunctionSelectors[_facetAddress].functionSelectors.push(selector);
_selectorToFacetAndPosition[selector].facetAddress = _facetAddress;
_selectorToFacetAndPosition[selector].functionSelectorPosition = selectorPosition;
selectorPosition++;
}
}
function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
uint16 selectorPosition = uint16(_facetFunctionSelectors[_facetAddress].functionSelectors.length);
// add new facet address if it does not exist
if (selectorPosition == 0) {
enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code");
_facetFunctionSelectors[_facetAddress].facetAddressPosition = uint16(_facetAddresses.length);
_facetAddresses.push(_facetAddress);
}
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = _selectorToFacetAndPosition[selector].facetAddress;
require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function");
removeFunction(oldFacetAddress, selector);
// add function
_selectorToFacetAndPosition[selector].functionSelectorPosition = selectorPosition;
_facetFunctionSelectors[_facetAddress].functionSelectors.push(selector);
_selectorToFacetAndPosition[selector].facetAddress = _facetAddress;
selectorPosition++;
}
}
function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
// if function does not exist then do nothing and return
require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)");
for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
bytes4 selector = _functionSelectors[selectorIndex];
address oldFacetAddress = _selectorToFacetAndPosition[selector].facetAddress;
removeFunction(oldFacetAddress, selector);
}
}
function removeFunction(address _facetAddress, bytes4 _selector) internal {
require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist");
// an immutable function is a function defined directly in a diamond
require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function");
// replace selector with last selector, then delete last selector
uint256 selectorPosition = _selectorToFacetAndPosition[_selector].functionSelectorPosition;
uint256 lastSelectorPosition = _facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;
// if not the same then replace _selector with lastSelector
if (selectorPosition != lastSelectorPosition) {
bytes4 lastSelector = _facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];
_facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;
_selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint16(selectorPosition);
}
// delete the last selector
_facetFunctionSelectors[_facetAddress].functionSelectors.pop();
delete _selectorToFacetAndPosition[_selector];
// if no more selectors for facet address then delete the facet address
if (lastSelectorPosition == 0) {
// replace facet address with last facet address and delete last facet address
uint256 lastFacetAddressPosition = _facetAddresses.length - 1;
uint256 facetAddressPosition = _facetFunctionSelectors[_facetAddress].facetAddressPosition;
if (facetAddressPosition != lastFacetAddressPosition) {
address lastFacetAddress = _facetAddresses[lastFacetAddressPosition];
_facetAddresses[facetAddressPosition] = lastFacetAddress;
_facetFunctionSelectors[lastFacetAddress].facetAddressPosition = uint16(facetAddressPosition);
}
_facetAddresses.pop();
delete _facetFunctionSelectors[_facetAddress].facetAddressPosition;
}
}
function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {
uint256 contractSize;
assembly {
contractSize := extcodesize(_contract)
}
require(contractSize > 0, _errorMessage);
}
// mapping(bytes4 => address) public selectorToFacet;
// bytes4[] public selectorsList;
// mapping(address => bool) public isFacet;
// address[] public facetsList;
// function addFacet(address _newFacet) public onlyOwner {
// isFacet[_newFacet] = true;
// facetsList.push(_newFacet);
// emit AddedFacet(_newFacet);
// }
// function batchAddSelectors(address _facet, bytes4[] memory _sigs) public onlyOwner {
// for(uint256 index; index < _sigs.length; index++) {
// addSelector(_facet, _sigs[index]);
// }
// }
// function addSelector(address _facet, bytes4 _sig) public onlyOwner {
// require(selectorToFacet[_sig] == address(0));
// // require(isFacet[_facet]);
// selectorToFacet[_sig] = _facet;
// selectorsList.push(_sig);
// emit AddedSelector(_facet, _sig);
// }
// Removing of the selectors occurs during resetFacetStorage();
// it is easier to reset and rebuild using the script when deploying and updating the facets
// function removeSelector(bytes4 _sig) public onlyOwner {
// selectorToFacet[_sig] = address(0);
// emit RemovedSelector(_sig);
// }
// function getFacetAddressFromSelector(bytes4 _sig) public view returns (address) {
// return selectorToFacet[_sig];
// }
// function getFacetByIndex(uint256 _index) public view returns(address) {
// return facetsList[_index];
// }
// function resetFacetStorage() public onlyOwner {
// for(uint i = 0; i < selectorsList.length; i++) {
// bytes4 sig = selectorsList[i];
// selectorToFacet[sig] = address(0);
// }
// delete selectorsList;
// for(uint i = 0; i < facetsList.length; i++) {
// address facet = facetsList[i];
// isFacet[facet] = false;
// }
// delete facetsList;
// emit ResetStorage();
// }
// Facet getters and setters
function getSettingsFacet() public view returns (address) {
return facetsInfo.Settings;
}
function updateSettingsFacet(address _newSettingsAddress) public onlyOwner {
facetsInfo.Settings = _newSettingsAddress;
emit UpdatedSettingsFacet(_newSettingsAddress);
}
function getLosslessFacet() public view returns (address) {
return facetsInfo.Lossless;
}
function updateLosslessFacet(address _newLosslessAddress) public onlyOwner {
facetsInfo.Lossless = _newLosslessAddress;
emit UpdatedLosslessFacet(_newLosslessAddress);
}
function getTaxFacet() public view returns (address) {
return facetsInfo.Tax;
}
function updateTaxFacet(address _newTaxAddress) public onlyOwner {
facetsInfo.Tax = _newTaxAddress;
emit UpdatedTaxFacet(_newTaxAddress);
}
function getConstructorFacet() public view returns (address) {
return facetsInfo.Constructor;
}
function updateConstructorFacet(address _newConstructorAddress) public onlyOwner {
facetsInfo.Constructor = _newConstructorAddress;
emit UpdatedConstructorFacet(_newConstructorAddress);
}
function getWalletsFacet() public view returns (address) {
return facetsInfo.Wallets;
}
function updateWalletsFacet(address _newWalletsAddress) public onlyOwner {
facetsInfo.Wallets = _newWalletsAddress;
emit UpdatedWalletsFacet(_newWalletsAddress);
}
function getAntiBotFacet() public view returns (address) {
return facetsInfo.AntiBot;
}
function updateAntiBotFacet(address _newAntiBotAddress) public onlyOwner {
facetsInfo.AntiBot = _newAntiBotAddress;
emit UpdatedAntiBotFacet(_newAntiBotAddress);
}
function getMulticallFacet() public view returns (address) {
return facetsInfo.Multicall;
}
function updateMulticallFacet(address _newWalletsAddress) public onlyOwner {
facetsInfo.Multicall = _newWalletsAddress;
emit UpdatedMulticallFacet(_newWalletsAddress);
}
}
// File contracts/interfaces/ILosslessController.sol
//
interface ILosslessController {
function pause() external;
function unpause() external;
function setAdmin(address _newAdmin) external;
function setRecoveryAdmin(address _newRecoveryAdmin) external;
function beforeTransfer(address _sender, address _recipient, uint256 _amount) external;
function beforeTransferFrom(address _msgSender, address _sender, address _recipient, uint256 _amount) external;
function beforeApprove(address _sender, address _spender, uint256 _amount) external;
function beforeIncreaseAllowance(address _msgSender, address _spender, uint256 _addedValue) external;
function beforeDecreaseAllowance(address _msgSender, address _spender, uint256 _subtractedValue) external;
function beforeMint(address _to, uint256 _amount) external;
function beforeBurn(address _account, uint256 _amount) external;
function afterTransfer(address _sender, address _recipient, uint256 _amount) external;
event AdminChange(address indexed _newAdmin);
event RecoveryAdminChange(address indexed _newAdmin);
}
// File contracts/facets/Storage.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
struct Storage {
uint256 CONTRACT_VERSION;
TaxSettings taxSettings;
TaxSettings isLocked;
Fees fees;
CustomTax[] customTaxes;
address transactionTaxWallet;
uint256 customTaxLength;
uint256 MaxTax;
uint8 MaxCustom;
uint256 DENOMINATOR;
mapping (address => uint256) _rOwned;
mapping (address => uint256) _tOwned;
mapping (address => mapping (address => uint256)) _allowances;
mapping (address => bool) _isExcluded;
address[] _excluded;
uint256 MAX;
uint256 _tTotal;
uint256 _rTotal;
uint256 _tFeeTotal;
mapping (address => bool) lpTokens;
string _name;
string _symbol;
uint8 _decimals;
address _creator;
address factory;
address buyBackWallet;
address lpWallet;
bool isPaused;
bool isTaxed;
mapping(address => bool) blacklist;
mapping(address => bool) swapWhitelist;
mapping(address => bool) maxBalanceWhitelist;
mapping(address => bool) taxWhitelist;
address pairAddress;
uint256 taxHelperIndex;
// AntiBot Variables
bool marketInit;
uint256 marketInitBlockTime;
AntiBotSettings antiBotSettings;
mapping (address => uint256) antiBotBalanceTracker;
uint256 maxBalanceAfterBuy;
SwapWhitelistingSettings swapWhitelistingSettings;
// Lossless data and events
address recoveryAdmin;
address recoveryAdminCandidate;
bytes32 recoveryAdminKeyHash;
address admin;
uint256 timelockPeriod;
uint256 losslessTurnOffTimestamp;
bool isLosslessTurnOffProposed;
bool isLosslessOn;
}
struct TaxSettings {
bool transactionTax;
bool buyBackTax;
bool holderTax;
bool lpTax;
bool canBlacklist;
bool canMint;
bool canPause;
bool maxBalanceAfterBuy;
}
struct Fee {
uint256 buy;
uint256 sell;
}
struct Fees {
Fee transactionTax;
uint256 buyBackTax;
uint256 holderTax;
uint256 lpTax;
}
struct CustomTax {
string name;
Fee fee;
address wallet;
bool withdrawAsGas;
}
struct AntiBotSettings {
uint256 startBlock;
uint256 endDate;
uint256 increment;
uint256 initialMaxHold;
bool isActive;
}
struct SwapWhitelistingSettings {
uint256 endDate;
bool isActive;
}
// File contracts/facets/AntiBot.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract AntiBotFacet is Ownable {
Storage internal s;
event UpdatedAntiBotIncrement(uint256 _updatedIncrement);
event UpdatedAntiBotEndDate(uint256 _updatedEndDate);
event UpdatedAntiBotInitialMaxHold(uint256 _updatedInitialMaxHold);
event UpdatedAntiBotActiveStatus(bool _isActive);
event UpdatedSwapWhitelistingEndDate(uint256 _updatedEndDate);
event UpdatedSwapWhitelistingActiveStatus(bool _isActive);
event UpdatedMaxBalanceAfterBuy(uint256 _newMaxBalance);
event AddedMaxBalanceWhitelistAddress(address _address);
event RemovedMaxBalanceWhitelistAddress(address _address);
event AddedSwapWhitelistAddress(address _address);
event RemovedSwapWhitelistAddress(address _address);
// AntiBot
function antiBotIsActiveModifier() view internal {
require(s.antiBotSettings.isActive, "ABD");
}
modifier antiBotIsActive() {
antiBotIsActiveModifier();
_;
}
function setIncrement(uint256 _updatedIncrement) public onlyOwner antiBotIsActive {
s.antiBotSettings.increment = _updatedIncrement;
emit UpdatedAntiBotIncrement(_updatedIncrement);
}
function setEndDate( uint256 _updatedEndDate) public onlyOwner antiBotIsActive {
require(_updatedEndDate <= 48, "ED");
s.antiBotSettings.endDate = _updatedEndDate;
emit UpdatedAntiBotEndDate(_updatedEndDate);
}
function setInitialMaxHold( uint256 _updatedInitialMaxHold) public onlyOwner antiBotIsActive {
s.antiBotSettings.initialMaxHold = _updatedInitialMaxHold;
emit UpdatedAntiBotInitialMaxHold(_updatedInitialMaxHold);
}
function updateAntiBot(bool _isActive) public onlyOwner {
require(!s.marketInit, "AMIE");
s.antiBotSettings.isActive = _isActive;
emit UpdatedAntiBotActiveStatus(_isActive);
}
function antiBotCheck(uint256 amount, address receiver) public returns(bool) {
// restrict it to being only called by registered tokens
require(IMintFactory(s.factory).tokenIsRegistered(address(this)));
require(s.marketInit, "AMIE");
if(block.timestamp > s.marketInitBlockTime + (s.antiBotSettings.endDate * 1 hours)) {
s.antiBotSettings.isActive = false;
return true;
}
s.antiBotBalanceTracker[receiver] += amount;
uint256 userAntiBotBalance = s.antiBotBalanceTracker[receiver];
uint256 maxAntiBotBalance = ((block.number - s.antiBotSettings.startBlock) * s.antiBotSettings.increment) + s.antiBotSettings.initialMaxHold;
require((userAntiBotBalance <= maxAntiBotBalance), "ABMSA");
return true;
}
// MaxBalanceAfterBuy
function addMaxBalanceWhitelistedAddress(address _address) public onlyOwner {
require(s.taxSettings.maxBalanceAfterBuy, "AMBABD");
s.maxBalanceWhitelist[_address] = true;
emit AddedMaxBalanceWhitelistAddress(_address);
}
function removeMaxBalanceWhitelistedAddress(address _address) public onlyOwner {
require(s.taxSettings.maxBalanceAfterBuy, "AMBABD");
s.maxBalanceWhitelist[_address] = false;
emit RemovedMaxBalanceWhitelistAddress(_address);
}
function updateMaxBalanceWhitelistBatch(address[] calldata _updatedAddresses, bool _isMaxBalanceWhitelisted) public onlyOwner {
require(s.taxSettings.maxBalanceAfterBuy, "AMBABD");
for(uint i = 0; i < _updatedAddresses.length; i++) {
s.maxBalanceWhitelist[_updatedAddresses[i]] = _isMaxBalanceWhitelisted;
if(_isMaxBalanceWhitelisted) {
emit AddedMaxBalanceWhitelistAddress(_updatedAddresses[i]);
} else {
emit RemovedMaxBalanceWhitelistAddress(_updatedAddresses[i]);
}
}
}
function isMaxBalanceWhitelisted(address _address) public view returns (bool) {
return s.maxBalanceWhitelist[_address];
}
function updateMaxBalanceAfterBuy(uint256 _updatedMaxBalanceAfterBuy) public onlyOwner {
require(s.taxSettings.maxBalanceAfterBuy, "AMBABD");
s.maxBalanceAfterBuy = _updatedMaxBalanceAfterBuy;
emit UpdatedMaxBalanceAfterBuy(_updatedMaxBalanceAfterBuy);
}
function maxBalanceAfterBuyCheck(uint256 amount, address receiver) public view returns(bool) {
if(s.maxBalanceWhitelist[receiver]) {
return true;
}
require(s.taxSettings.maxBalanceAfterBuy);
uint256 receiverBalance;
if(s.taxSettings.holderTax) {
receiverBalance = s._rOwned[receiver];
} else {
receiverBalance = s._tOwned[receiver];
}
receiverBalance += amount;
require(receiverBalance <= s.maxBalanceAfterBuy, "MBAB");
return true;
}
// SwapWhitelist
function addSwapWhitelistedAddress(address _address) public onlyOwner {
require(s.swapWhitelistingSettings.isActive, "ASWD");
s.swapWhitelist[_address] = true;
emit AddedSwapWhitelistAddress(_address);
}
function removeSwapWhitelistedAddress(address _address) public onlyOwner {
require(s.swapWhitelistingSettings.isActive, "ASWD");
s.swapWhitelist[_address] = false;
emit RemovedSwapWhitelistAddress(_address);
}
function updateSwapWhitelistBatch(address[] calldata _updatedAddresses, bool _isSwapWhitelisted) public onlyOwner {
require(s.swapWhitelistingSettings.isActive, "ASWD");
for(uint i = 0; i < _updatedAddresses.length; i++) {
s.swapWhitelist[_updatedAddresses[i]] = _isSwapWhitelisted;
if(_isSwapWhitelisted) {
emit AddedSwapWhitelistAddress(_updatedAddresses[i]);
} else {
emit RemovedSwapWhitelistAddress(_updatedAddresses[i]);
}
}
}
function isSwapWhitelisted(address _address) public view returns (bool) {
return s.swapWhitelist[_address];
}
function setSwapWhitelistEndDate( uint256 _updatedEndDate) public onlyOwner {
require(s.swapWhitelistingSettings.isActive, "ASWD");
require(_updatedEndDate <= 48, "ED");
s.swapWhitelistingSettings.endDate = _updatedEndDate;
emit UpdatedSwapWhitelistingEndDate(_updatedEndDate);
}
function updateSwapWhitelisting(bool _isActive) public onlyOwner {
require(!s.marketInit, "AMIE");
s.swapWhitelistingSettings.isActive = _isActive;
emit UpdatedSwapWhitelistingActiveStatus(_isActive);
}
function swapWhitelistingCheck(address receiver) public returns(bool) {
require(s.marketInit, "AMIE");
if(block.timestamp > s.marketInitBlockTime + (s.swapWhitelistingSettings.endDate * 1 hours)) {
s.swapWhitelistingSettings.isActive = false;
return true;
}
require(s.swapWhitelist[receiver], "SWL");
return true;
}
}
// File contracts/interfaces/IBuyBackWallet.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface IBuyBackWallet {
function checkBuyBackTrigger() external view returns (bool);
function getBalance() external view returns (uint256);
function sendEthToTaxHelper() external returns(uint256);
function updateThreshold(uint256 _newThreshold) external;
function getThreshold() external view returns (uint256);
}
// File contracts/interfaces/IFacetHelper.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface IFacetHelper {
struct Facet {
address facetAddress;
bytes4[] functionSelectors;
}
/// @notice Gets all facet addresses and their four byte function selectors.
/// @return facets_ Facet
function facets() external view returns (Facet[] memory facets_);
/// @notice Gets all the function selectors supported by a specific facet.
/// @param _facet The facet address.
/// @return facetFunctionSelectors_
function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_);
/// @notice Get all the facet addresses used by a diamond.
/// @return facetAddresses_
function facetAddresses() external view returns (address[] memory facetAddresses_);
/// @notice Gets the facet that supports the given selector.
/// @dev If facet is not found return address(0).
/// @param _functionSelector The function selector.
/// @return facetAddress_ The facet address.
function facetAddress(bytes4 _functionSelector) external view returns (address facetAddress_);
// function addFacet(address _newFacet) external;
// function addSelector(address _facet, bytes4 _sig) external;
// function removeSelector(bytes4 _sig) external;
function getFacetAddressFromSelector(bytes4 _sig) external view returns (address);
function getSettingsFacet() external view returns (address);
function updateSettingsFacet(address _newSettingsAddress) external;
function getTaxFacet() external view returns (address);
function updateTaxFacet(address _newTaxesAddress) external;
function getLosslessFacet() external view returns (address);
function updateLosslessFacet(address _newLosslessAddress) external;
function getConstructorFacet() external view returns (address);
function updateConstructorFacet(address _newConstructorAddress) external;
function getWalletsFacet() external view returns (address);
function updateWalletsFacet(address _newWalletsAddress) external;
function getAntiBotFacet() external view returns (address);
function updateAntiBotFacet(address _newWalletsAddress) external;
function getMulticallFacet() external view returns (address);
function updateMulticallFacet(address _newWalletsAddress) external;
}
// File contracts/interfaces/ILPWallet.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface ILPWallet {
function checkLPTrigger() external view returns (bool);
function getBalance() external view returns (uint256);
function sendEthToTaxHelper() external returns(uint256);
function transferBalanceToTaxHelper() external;
function updateThreshold(uint256 _newThreshold) external;
function getThreshold() external view returns (uint256);
}
// File contracts/interfaces/ISettings.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface ISettingsFacet {
function getFacetAddressFromSelector(bytes4 _sig) external view returns (address);
function createBuyBackWallet(address _factory, address _token) external returns (address);
function createLPWallet(address _factory, address _token) external returns (address);
}
// File contracts/interfaces/IWallets.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface IWalletsFacet {
function createBuyBackWallet(address _factory, address _token, uint256 _newThreshold) external returns (address);
function createLPWallet(address _factory, address _token, uint256 _newThreshold) external returns (address);
function updateBuyBackWalletThreshold(uint256 _newThreshold) external;
function updateLPWalletThreshold(uint256 _newThreshold) external;
}
// File contracts/facets/Constructor.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract ConstructorFacet is Ownable {
Storage internal s;
event ExcludedAccount(address account);
event AdminChanged(address indexed previousAdmin, address indexed newAdmin);
event RecoveryAdminChanged(address indexed previousAdmin, address indexed newAdmin);
event UpdatedCustomTaxes(CustomTax[] _customTaxes);
event UpdatedTaxFees(Fees _updatedFees);
event UpdatedTransactionTaxAddress(address _newAddress);
event UpdatedLockedSettings(TaxSettings _updatedLocks);
event UpdatedSettings(TaxSettings _updatedSettings);
event UpdatedTaxHelperIndex(uint _newIndex);
event UpdatedAntiBotSettings(AntiBotSettings _antiBotSettings);
event UpdatedSwapWhitelistingSettings(SwapWhitelistingSettings _swapWhitelistingSettings);
event UpdatedMaxBalanceAfterBuy(uint256 _newMaxBalance);
event AddedLPToken(address _newLPToken);
event TokenCreated(string name, string symbol, uint8 decimals, uint256 totalSupply, uint256 reflectionTotalSupply);
event Transfer(address indexed from, address indexed to, uint256 value);
struct ConstructorParams {
string name_;
string symbol_;
uint8 decimals_;
address creator_;
uint256 tTotal_;
uint256 _maxTax;
TaxSettings _settings;
TaxSettings _lockedSettings;
Fees _fees;
address _transactionTaxWallet;
CustomTax[] _customTaxes;
uint256 lpWalletThreshold;
uint256 buyBackWalletThreshold;
uint256 _taxHelperIndex;
address admin_;
address recoveryAdmin_;
bool isLossless_;
AntiBotSettings _antiBotSettings;
uint256 _maxBalanceAfterBuy;
SwapWhitelistingSettings _swapWhitelistingSettings;
}
function constructorHandler(ConstructorParams calldata params, address _factory) external {
require(IMintFactory(_factory).tokenGeneratorIsAllowed(msg.sender), "RA");
require(params.creator_ != address(0), "ZA");
require(params._transactionTaxWallet != address(0), "ZA");
require(params.admin_ != address(0), "ZA");
require(params.recoveryAdmin_ != address(0), "ZA");
require(_factory != address(0), "ZA");
// Set inital values
s.CONTRACT_VERSION = 1;
s.customTaxLength = 0;
s.MaxTax = 3000;
s.MaxCustom = 10;
s.MAX = ~uint256(0);
s.isPaused = false;
s.isTaxed = false;
s.marketInit = false;
s._name = params.name_;
s._symbol = params.symbol_;
s._decimals = params.decimals_;
s._creator = params.creator_;
s._isExcluded[params.creator_] = true;
s._excluded.push(params.creator_);
emit ExcludedAccount(s._creator);
// Lossless
s.isLosslessOn = params.isLossless_;
s.admin = params.admin_;
emit AdminChanged(address(0), s.admin);
s.recoveryAdmin = params.recoveryAdmin_;
emit RecoveryAdminChanged(address(0), s.recoveryAdmin);
s.timelockPeriod = 7 days;
address lossless = IMintFactory(_factory).getLosslessController();
s._isExcluded[lossless] = true;
s._excluded.push(lossless);
emit ExcludedAccount(lossless);
// Tax Settings
require(params._maxTax <= s.MaxTax, "MT");
s.MaxTax = params._maxTax;
s.taxSettings = params._settings;
emit UpdatedSettings(s.taxSettings);
s.isLocked = params._lockedSettings;
s.isLocked.holderTax = true;
if(s.taxSettings.holderTax) {
s.taxSettings.canMint = false;
s.isLocked.canMint = true;
}
emit UpdatedLockedSettings(s.isLocked);
s.fees = params._fees;
emit UpdatedTaxFees(s.fees);
require(params._customTaxes.length < s.MaxCustom + 1, "MCT");
for(uint i = 0; i < params._customTaxes.length; i++) {
require(params._customTaxes[i].wallet != address(0));
s.customTaxes.push(params._customTaxes[i]);
}
emit UpdatedCustomTaxes(s.customTaxes);
s.customTaxLength = params._customTaxes.length;
s.transactionTaxWallet = params._transactionTaxWallet;
emit UpdatedTransactionTaxAddress(s.transactionTaxWallet);
// Factory, Wallets, Pair Address
s.factory = _factory;
s.taxHelperIndex = params._taxHelperIndex;
emit UpdatedTaxHelperIndex(s.taxHelperIndex);
address taxHelper = IMintFactory(s.factory).getTaxHelperAddress(s.taxHelperIndex);
s.pairAddress = ITaxHelper(taxHelper).createLPToken();
addLPToken(s.pairAddress);
address wallets = IFacetHelper(IMintFactory(s.factory).getFacetHelper()).getWalletsFacet();
s.buyBackWallet = IWalletsFacet(wallets).createBuyBackWallet(s.factory, address(this), params.buyBackWalletThreshold);
s.lpWallet = IWalletsFacet(wallets).createLPWallet(s.factory, address(this), params.lpWalletThreshold);
// Total Supply and other info
s._rTotal = (s.MAX - (s.MAX % params.tTotal_));
s._rOwned[params.creator_] = s._rTotal;
s.DENOMINATOR = 10000;
s._isExcluded[taxHelper] = true;
s._excluded.push(taxHelper);
emit ExcludedAccount(taxHelper);
require(checkMaxTax(true), "BF");
require(checkMaxTax(false), "SF");
transferOwnership(params.creator_);
_mintInitial(params.creator_, params.tTotal_);
// AntiBot Settings
require(params._antiBotSettings.endDate <= 48, "ED");
require(params._swapWhitelistingSettings.endDate <= 48, "ED");
s.antiBotSettings = params._antiBotSettings;
emit UpdatedAntiBotSettings(s.antiBotSettings);
s.maxBalanceAfterBuy = params._maxBalanceAfterBuy;
emit UpdatedMaxBalanceAfterBuy(s.maxBalanceAfterBuy);
s.swapWhitelistingSettings = params._swapWhitelistingSettings;
emit UpdatedSwapWhitelistingSettings(s.swapWhitelistingSettings);
emit TokenCreated(s._name, s._symbol, s._decimals, s._tTotal, s._rTotal);
}
function _mintInitial(address account, uint256 amount) internal virtual {
s._tTotal += amount;
s._tOwned[account] += amount;
emit Transfer(address(0), account, amount);
}
function checkMaxTax(bool isBuy) internal view returns (bool) {
uint256 totalTaxes;
if(isBuy) {
totalTaxes += s.fees.transactionTax.buy;
totalTaxes += s.fees.holderTax;
for(uint i = 0; i < s.customTaxes.length; i++) {
totalTaxes += s.customTaxes[i].fee.buy;
}
} else {
totalTaxes += s.fees.transactionTax.sell;
totalTaxes += s.fees.lpTax;
totalTaxes += s.fees.holderTax;
totalTaxes += s.fees.buyBackTax;
for(uint i = 0; i < s.customTaxes.length; i++) {
totalTaxes += s.customTaxes[i].fee.sell;
}
}
if(totalTaxes <= s.MaxTax) {
return true;
}
return false;
}
function addLPToken(address _newLPToken) internal {
s.lpTokens[_newLPToken] = true;
emit AddedLPToken(_newLPToken);
}
}
// File contracts/facets/Lossless.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract LosslessFacet is Ownable {
Storage internal s;
event AdminChanged(address indexed previousAdmin, address indexed newAdmin);
event RecoveryAdminChangeProposed(address indexed candidate);
event RecoveryAdminChanged(address indexed previousAdmin, address indexed newAdmin);
event LosslessTurnOffProposed(uint256 turnOffDate);
event LosslessTurnedOff();
event LosslessTurnedOn();
function onlyRecoveryAdminCheck() internal view {
require(_msgSender() == s.recoveryAdmin, "LRA");
}
modifier onlyRecoveryAdmin() {
onlyRecoveryAdminCheck();
_;
}
// --- LOSSLESS management ---
function getAdmin() external view returns (address) {
return s.admin;
}
function setLosslessAdmin(address newAdmin) external onlyRecoveryAdmin {
require(newAdmin != address(0), "LZ");
emit AdminChanged(s.admin, newAdmin);
s.admin = newAdmin;
}
function transferRecoveryAdminOwnership(address candidate, bytes32 keyHash) external onlyRecoveryAdmin {
require(candidate != address(0), "LZ");
s.recoveryAdminCandidate = candidate;
s.recoveryAdminKeyHash = keyHash;
emit RecoveryAdminChangeProposed(candidate);
}
function acceptRecoveryAdminOwnership(bytes memory key) external {
require(_msgSender() == s.recoveryAdminCandidate, "LC");
require(keccak256(key) == s.recoveryAdminKeyHash, "LIK");
emit RecoveryAdminChanged(s.recoveryAdmin, s.recoveryAdminCandidate);
s.recoveryAdmin = s.recoveryAdminCandidate;
}
function proposeLosslessTurnOff() external onlyRecoveryAdmin {
s.losslessTurnOffTimestamp = block.timestamp + s.timelockPeriod;
s.isLosslessTurnOffProposed = true;
emit LosslessTurnOffProposed(s.losslessTurnOffTimestamp);
}
function executeLosslessTurnOff() external onlyRecoveryAdmin {
require(s.isLosslessTurnOffProposed, "LTNP");
require(s.losslessTurnOffTimestamp <= block.timestamp, "LTL");
s.isLosslessOn = false;
s.isLosslessTurnOffProposed = false;
emit LosslessTurnedOff();
}
function executeLosslessTurnOn() external onlyRecoveryAdmin {
s.isLosslessTurnOffProposed = false;
s.isLosslessOn = true;
emit LosslessTurnedOn();
}
}
// File contracts/facets/Multicall.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract MulticallFacet is Ownable {
Storage internal s;
event UpdatedSettings(TaxSettings _updatedSettings);
event UpdatedLockedSettings(TaxSettings _updatedLocks);
event UpdatedCustomTaxes(CustomTax[] _customTaxes);
event UpdatedTaxFees(Fees _updatedFees);
event UpdatedTransactionTaxAddress(address _newAddress);
event UpdatedMaxBalanceAfterBuy(uint256 _newMaxBalance);
event UpdatedBuyBackWalletThreshold(uint256 _newThreshold);
event UpdatedLPWalletThreshold(uint256 _newThreshold);
event UpdatedAntiBotIncrement(uint256 _updatedIncrement);
event UpdatedAntiBotEndDate(uint256 _updatedEndDate);
event UpdatedAntiBotInitialMaxHold(uint256 _updatedInitialMaxHold);
event UpdatedAntiBotActiveStatus(bool _isActive);
event UpdatedSwapWhitelistingEndDate(uint256 _updatedEndDate);
event UpdatedSwapWhitelistingActiveStatus(bool _isActive);
struct MulticallAdminUpdateParams {
TaxSettings _taxSettings;
TaxSettings _lockSettings;
CustomTax[] _customTaxes;
Fees _fees;
address _transactionTaxWallet;
uint256 _maxBalanceAfterBuy;
uint256 _lpWalletThreshold;
uint256 _buyBackWalletThreshold;
}
function multicallAdminUpdate(MulticallAdminUpdateParams calldata params) public onlyOwner {
// Tax Settings
if(!s.isLocked.transactionTax && s.taxSettings.transactionTax != params._taxSettings.transactionTax) {
s.taxSettings.transactionTax = params._taxSettings.transactionTax;
}
if(!s.isLocked.holderTax && s.taxSettings.holderTax != params._taxSettings.holderTax && !params._taxSettings.canMint) {
s.taxSettings.holderTax = params._taxSettings.holderTax;
}
if(!s.isLocked.buyBackTax && s.taxSettings.buyBackTax != params._taxSettings.buyBackTax) {
s.taxSettings.buyBackTax = params._taxSettings.buyBackTax;
}
if(!s.isLocked.lpTax && s.taxSettings.lpTax != params._taxSettings.lpTax) {
s.taxSettings.lpTax = params._taxSettings.lpTax;
}
if(!s.isLocked.canMint && s.taxSettings.canMint != params._taxSettings.canMint && !s.taxSettings.holderTax) {
s.taxSettings.canMint = params._taxSettings.canMint;
}
if(!s.isLocked.canPause && s.taxSettings.canPause != params._taxSettings.canPause) {
s.taxSettings.canPause = params._taxSettings.canPause;
}
if(!s.isLocked.canBlacklist && s.taxSettings.canBlacklist != params._taxSettings.canBlacklist) {
s.taxSettings.canBlacklist = params._taxSettings.canBlacklist;
}
if(!s.isLocked.maxBalanceAfterBuy && s.taxSettings.maxBalanceAfterBuy != params._taxSettings.maxBalanceAfterBuy) {
s.taxSettings.maxBalanceAfterBuy = params._taxSettings.maxBalanceAfterBuy;
}
emit UpdatedSettings(s.taxSettings);
// Lock Settings
if(!s.isLocked.transactionTax) {
s.isLocked.transactionTax = params._lockSettings.transactionTax;
}
if(!s.isLocked.holderTax) {
s.isLocked.holderTax = params._lockSettings.holderTax;
}
if(!s.isLocked.buyBackTax) {
s.isLocked.buyBackTax = params._lockSettings.buyBackTax;
}
if(!s.isLocked.lpTax) {
s.isLocked.lpTax = params._lockSettings.lpTax;
}
if(!s.isLocked.canMint) {
s.isLocked.canMint = params._lockSettings.canMint;
}
if(!s.isLocked.canPause) {
s.isLocked.canPause = params._lockSettings.canPause;
}
if(!s.isLocked.canBlacklist) {
s.isLocked.canBlacklist = params._lockSettings.canBlacklist;
}
if(!s.isLocked.maxBalanceAfterBuy) {
s.isLocked.maxBalanceAfterBuy = params._lockSettings.maxBalanceAfterBuy;
}
emit UpdatedLockedSettings(s.isLocked);
// Custom Taxes
require(params._customTaxes.length < s.MaxCustom + 1, "MCT");
delete s.customTaxes;
for(uint i = 0; i < params._customTaxes.length; i++) {
require(params._customTaxes[i].wallet != address(0), "ZA");
s.customTaxes.push(params._customTaxes[i]);
}
s.customTaxLength = params._customTaxes.length;
emit UpdatedCustomTaxes(params._customTaxes);
// Fees
s.fees.transactionTax.buy = params._fees.transactionTax.buy;
s.fees.transactionTax.sell = params._fees.transactionTax.sell;
s.fees.buyBackTax = params._fees.buyBackTax;
s.fees.holderTax = params._fees.holderTax;
s.fees.lpTax = params._fees.lpTax;
require(checkMaxTax(true), "BF");
require(checkMaxTax(false), "SF");
emit UpdatedTaxFees(params._fees);
// transactionTax address
require(params._transactionTaxWallet != address(0), "ZA");
s.transactionTaxWallet = params._transactionTaxWallet;
emit UpdatedTransactionTaxAddress(params._transactionTaxWallet);
// maxBalanceAfterBuy
if(s.taxSettings.maxBalanceAfterBuy) {
s.maxBalanceAfterBuy = params._maxBalanceAfterBuy;
emit UpdatedMaxBalanceAfterBuy(params._maxBalanceAfterBuy);
}
// update wallet thresholds
ILPWallet(s.lpWallet).updateThreshold(params._lpWalletThreshold);
emit UpdatedLPWalletThreshold(params._lpWalletThreshold);
IBuyBackWallet(s.buyBackWallet).updateThreshold(params._buyBackWalletThreshold);
emit UpdatedBuyBackWalletThreshold(params._buyBackWalletThreshold);
}
function checkMaxTax(bool isBuy) internal view returns (bool) {
uint256 totalTaxes;
if(isBuy) {
totalTaxes += s.fees.transactionTax.buy;
totalTaxes += s.fees.holderTax;
for(uint i = 0; i < s.customTaxes.length; i++) {
totalTaxes += s.customTaxes[i].fee.buy;
}
} else {
totalTaxes += s.fees.transactionTax.sell;
totalTaxes += s.fees.lpTax;
totalTaxes += s.fees.holderTax;
totalTaxes += s.fees.buyBackTax;
for(uint i = 0; i < s.customTaxes.length; i++) {
totalTaxes += s.customTaxes[i].fee.sell;
}
}
if(totalTaxes <= s.MaxTax) {
return true;
}
return false;
}
struct AntiBotUpdateParams {
AntiBotSettings _antiBotSettings;
SwapWhitelistingSettings _swapWhitelistingSettings;
}
// Multicall AntiBot Update
function multicallAntiBotUpdate(AntiBotUpdateParams calldata params) public onlyOwner {
// AntiBot
s.antiBotSettings.increment = params._antiBotSettings.increment;
emit UpdatedAntiBotIncrement(s.antiBotSettings.increment);
require(params._antiBotSettings.endDate <= 48, "ED");
s.antiBotSettings.endDate = params._antiBotSettings.endDate;
emit UpdatedAntiBotEndDate(s.antiBotSettings.endDate);
s.antiBotSettings.initialMaxHold = params._antiBotSettings.initialMaxHold;
emit UpdatedAntiBotInitialMaxHold(s.antiBotSettings.initialMaxHold);
if(!s.marketInit) {
s.antiBotSettings.isActive = params._antiBotSettings.isActive;
emit UpdatedAntiBotActiveStatus(s.antiBotSettings.isActive);
}
// SwapWhitelisting
require(params._swapWhitelistingSettings.endDate <= 48, "ED");
s.swapWhitelistingSettings.endDate = params._swapWhitelistingSettings.endDate;
emit UpdatedSwapWhitelistingEndDate(s.antiBotSettings.endDate);
if(!s.marketInit) {
s.swapWhitelistingSettings.isActive = params._swapWhitelistingSettings.isActive;
emit UpdatedSwapWhitelistingActiveStatus(s.swapWhitelistingSettings.isActive);
}
}
}
// File contracts/interfaces/IFeeHelper.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
interface IFeeHelper {
function getFee() view external returns(uint256);
function getFeeDenominator() view external returns(uint256);
function setFee(uint _fee) external;
function getFeeAddress() view external returns(address);
function setFeeAddress(address payable _feeAddress) external;
function getGeneratorFee() view external returns(uint256);
function setGeneratorFee(uint256 _fee) external;
}
// File contracts/LPWallet.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract LPWallet is Ownable{
ITaxToken public token;
IMintFactory public factory;
uint256 private threshold;
event UpdatedThreshold(uint256 _newThreshold);
event ETHtoTaxHelper(uint256 amount);
event TransferBalancetoTaxHelper(uint256 tokenBalance);
constructor(address _factory, address _token, uint256 _newThreshold) {
token = ITaxToken(_token);
factory = IMintFactory(_factory);
threshold = _newThreshold;
emit UpdatedThreshold(_newThreshold);
transferOwnership(_token);
}
function checkLPTrigger() public view returns (bool) {
return address(this).balance > threshold;
}
function getBalance() public view returns (uint256) {
return address(this).balance;
}
function sendEthToTaxHelper() external returns (uint256) {
uint index = token.taxHelperIndex();
require(msg.sender == factory.getTaxHelperAddress(index), "RA");
uint256 amount = address(this).balance;
(bool sent,) = msg.sender.call{value: amount}("");
require(sent, "Failed to send Ether");
emit ETHtoTaxHelper(amount);
return amount;
}
function transferBalanceToTaxHelper() external {
uint index = token.taxHelperIndex();
require(msg.sender == factory.getTaxHelperAddress(index));
uint256 tokenBalance = token.balanceOf(address(this));
token.transfer(msg.sender, tokenBalance);
emit TransferBalancetoTaxHelper(tokenBalance);
}
function updateThreshold(uint256 _newThreshold) external onlyOwner {
threshold = _newThreshold;
emit UpdatedThreshold(_newThreshold);
}
function getThreshold() external view returns (uint256) {
return threshold;
}
receive() payable external {
}
}
// File contracts/facets/Settings.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract SettingsFacet is Ownable {
Storage internal s;
event AddedLPToken(address _newLPToken);
event RemovedLPToken(address _lpToken);
event AddedBlacklistAddress(address _address);
event RemovedBlacklistAddress(address _address);
event ToggledPause(bool _isPaused);
event UpdatedCustomTaxes(CustomTax[] _customTaxes);
event UpdatedTaxFees(Fees _updatedFees);
event UpdatedTransactionTaxAddress(address _newAddress);
event UpdatedLockedSettings(TaxSettings _updatedLocks);
event UpdatedSettings(TaxSettings _updatedSettings);
event UpdatedPairAddress(address _newPairAddress);
event UpdatedTaxHelperIndex(uint _newIndex);
event AddedTaxWhitelistAddress(address _address);
event RemovedTaxWhitelistAddress(address _address);
function canBlacklistRequire() internal view {
require(s.taxSettings.canBlacklist, "NB");
}
modifier canBlacklist {
canBlacklistRequire();
_;
}
function addLPToken(address _newLPToken) public onlyOwner {
s.lpTokens[_newLPToken] = true;
emit AddedLPToken(_newLPToken);
}
function removeLPToken(address _lpToken) public onlyOwner {
s.lpTokens[_lpToken] = false;
emit RemovedLPToken(_lpToken);
}
function checkMaxTax(bool isBuy) internal view returns (bool) {
uint256 totalTaxes;
if(isBuy) {
totalTaxes += s.fees.transactionTax.buy;
totalTaxes += s.fees.holderTax;
for(uint i = 0; i < s.customTaxes.length; i++) {
totalTaxes += s.customTaxes[i].fee.buy;
}
} else {
totalTaxes += s.fees.transactionTax.sell;
totalTaxes += s.fees.lpTax;
totalTaxes += s.fees.holderTax;
totalTaxes += s.fees.buyBackTax;
for(uint i = 0; i < s.customTaxes.length; i++) {
totalTaxes += s.customTaxes[i].fee.sell;
}
}
if(totalTaxes <= s.MaxTax) {
return true;
}
return false;
}
function paused() public view returns (bool) {
if(s.taxSettings.canPause == false) {
return false;
}
return s.isPaused;
}
function togglePause() public onlyOwner returns (bool) {
require(s.taxSettings.canPause, "NP");
s.isPaused = !s.isPaused;
emit ToggledPause(s.isPaused);
return s.isPaused;
}
function addBlacklistedAddress(address _address) public onlyOwner canBlacklist {
IFeeHelper feeHelper = IFeeHelper(IMintFactory(s.factory).getFeeHelper());
address feeAddress = feeHelper.getFeeAddress();
require(_address != feeAddress);
s.blacklist[_address] = true;
emit AddedBlacklistAddress(_address);
}
function removeBlacklistedAddress(address _address) public onlyOwner canBlacklist {
s.blacklist[_address] = false;
emit RemovedBlacklistAddress(_address);
}
function updateBlacklistBatch(address[] calldata _updatedAddresses, bool _isBlacklisted) public onlyOwner canBlacklist {
IFeeHelper feeHelper = IFeeHelper(IMintFactory(s.factory).getFeeHelper());
address feeAddress = feeHelper.getFeeAddress();
for(uint i = 0; i < _updatedAddresses.length; i++) {
if(_updatedAddresses[i] != feeAddress) {
s.blacklist[_updatedAddresses[i]] = _isBlacklisted;
if(_isBlacklisted) {
emit AddedBlacklistAddress(_updatedAddresses[i]);
} else {
emit RemovedBlacklistAddress(_updatedAddresses[i]);
}
}
}
}
function isBlacklisted(address _address) public view returns (bool) {
return s.blacklist[_address];
}
function updateCustomTaxes(CustomTax[] calldata _customTaxes) public onlyOwner {
require(_customTaxes.length < s.MaxCustom + 1, "MCT");
delete s.customTaxes;
for(uint i = 0; i < _customTaxes.length; i++) {
require(_customTaxes[i].wallet != address(0));
s.customTaxes.push(_customTaxes[i]);
}
s.customTaxLength = _customTaxes.length;
require(checkMaxTax(true), "BF");
require(checkMaxTax(false), "SF");
emit UpdatedCustomTaxes(_customTaxes);
}
function updateTaxFees(Fees calldata _updatedFees) public onlyOwner {
s.fees.transactionTax.buy = _updatedFees.transactionTax.buy;
s.fees.transactionTax.sell = _updatedFees.transactionTax.sell;
s.fees.buyBackTax = _updatedFees.buyBackTax;
s.fees.holderTax = _updatedFees.holderTax;
s.fees.lpTax = _updatedFees.lpTax;
require(checkMaxTax(true), "BF");
require(checkMaxTax(false), "SF");
emit UpdatedTaxFees(_updatedFees);
}
function updateTransactionTaxAddress(address _newAddress) public onlyOwner {
// confirm if this is updateable
require(_newAddress != address(0));
s.transactionTaxWallet = _newAddress;
emit UpdatedTransactionTaxAddress(_newAddress);
}
function lockSettings(TaxSettings calldata _updatedLocks) public onlyOwner {
if(!s.isLocked.transactionTax) {
s.isLocked.transactionTax = _updatedLocks.transactionTax;
}
if(!s.isLocked.holderTax) {
s.isLocked.holderTax = _updatedLocks.holderTax;
}
if(!s.isLocked.buyBackTax) {
s.isLocked.buyBackTax = _updatedLocks.buyBackTax;
}
if(!s.isLocked.lpTax) {
s.isLocked.lpTax = _updatedLocks.lpTax;
}
if(!s.isLocked.canMint) {
s.isLocked.canMint = _updatedLocks.canMint;
}
if(!s.isLocked.canPause) {
s.isLocked.canPause = _updatedLocks.canPause;
}
if(!s.isLocked.canBlacklist) {
s.isLocked.canBlacklist = _updatedLocks.canBlacklist;
}
if(!s.isLocked.maxBalanceAfterBuy) {
s.isLocked.maxBalanceAfterBuy = _updatedLocks.maxBalanceAfterBuy;
}
emit UpdatedLockedSettings(s.isLocked);
}
function updateSettings(TaxSettings calldata _updatedSettings) public onlyOwner {
if(!s.isLocked.transactionTax && s.taxSettings.transactionTax != _updatedSettings.transactionTax) {
s.taxSettings.transactionTax = _updatedSettings.transactionTax;
}
if(!s.isLocked.holderTax && s.taxSettings.holderTax != _updatedSettings.holderTax && !_updatedSettings.canMint) {
s.taxSettings.holderTax = _updatedSettings.holderTax;
}
if(!s.isLocked.buyBackTax && s.taxSettings.buyBackTax != _updatedSettings.buyBackTax) {
s.taxSettings.buyBackTax = _updatedSettings.buyBackTax;
}
if(!s.isLocked.lpTax && s.taxSettings.lpTax != _updatedSettings.lpTax) {
s.taxSettings.lpTax = _updatedSettings.lpTax;
}
if(!s.isLocked.canMint && s.taxSettings.canMint != _updatedSettings.canMint && !s.taxSettings.holderTax) {
s.taxSettings.canMint = _updatedSettings.canMint;
}
if(!s.isLocked.canPause && s.taxSettings.canPause != _updatedSettings.canPause) {
s.taxSettings.canPause = _updatedSettings.canPause;
}
if(!s.isLocked.canBlacklist && s.taxSettings.canBlacklist != _updatedSettings.canBlacklist) {
s.taxSettings.canBlacklist = _updatedSettings.canBlacklist;
}
if(!s.isLocked.maxBalanceAfterBuy && s.taxSettings.maxBalanceAfterBuy != _updatedSettings.maxBalanceAfterBuy) {
s.taxSettings.maxBalanceAfterBuy = _updatedSettings.maxBalanceAfterBuy;
}
emit UpdatedSettings(s.taxSettings);
}
function updatePairAddress(address _newPairAddress) public onlyOwner {
s.pairAddress = _newPairAddress;
s.lpTokens[_newPairAddress] = true;
emit AddedLPToken(_newPairAddress);
emit UpdatedPairAddress(_newPairAddress);
}
function updateTaxHelperIndex(uint8 _newIndex) public onlyOwner {
s.taxHelperIndex = _newIndex;
emit UpdatedTaxHelperIndex(_newIndex);
}
function addTaxWhitelistedAddress(address _address) public onlyOwner {
s.taxWhitelist[_address] = true;
emit AddedTaxWhitelistAddress(_address);
}
function removeTaxWhitelistedAddress(address _address) public onlyOwner {
s.taxWhitelist[_address] = false;
emit RemovedTaxWhitelistAddress(_address);
}
function updateTaxWhitelistBatch(address[] calldata _updatedAddresses, bool _isTaxWhitelisted) public onlyOwner {
for(uint i = 0; i < _updatedAddresses.length; i++) {
s.taxWhitelist[_updatedAddresses[i]] = _isTaxWhitelisted;
if(_isTaxWhitelisted) {
emit AddedTaxWhitelistAddress(_updatedAddresses[i]);
} else {
emit RemovedTaxWhitelistAddress(_updatedAddresses[i]);
}
}
}
}
// File contracts/libraries/FullMath.sol
//
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then use the Chinese Remainder Theorem to reconstruct
// the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2**256 + prod0
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
unchecked {
uint256 twos = (type(uint256).max - denominator + 1) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
// Invert denominator mod 2**256
// Now that denominator is an odd number, it has an inverse
// modulo 2**256 such that denominator * inv = 1 mod 2**256.
// Compute the inverse by starting with a seed that is correct
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use Newton-Raphson iteration to improve the precision.
// Thanks to Hensel's lifting lemma, this also works in modular
// arithmetic, doubling the correct bits in each step.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
// Because the division is now exact we can divide by multiplying
// with the modular inverse of denominator. This will give us the
// correct result modulo 2**256. Since the precoditions guarantee
// that the outcome is less than 2**256, this is the final result.
// We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inv;
return result;
}
}
/// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
function mulDivRoundingUp(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
result = mulDiv(a, b, denominator);
if (mulmod(a, b, denominator) > 0) {
require(result < type(uint256).max);
result++;
}
}
}
// File contracts/facets/Tax.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
// This contract logs all tokens on the platform
contract TaxFacet is Ownable {
Storage internal s;
event MarketInit(uint256 timestamp, uint256 blockNumber);
event BuyBackTaxInitiated(address _sender, uint256 _fee, address _wallet, bool _isBuy);
event TransactionTaxInitiated(address _sender, uint256 _fee, address _wallet, bool _isBuy);
event LPTaxInitiated(address _sender, uint256 _fee, address _wallet, bool _isBuy);
event CustomTaxInitiated(address _sender, uint256 _fee, address _wallet, bool _isBuy);
event Transfer(address indexed from, address indexed to, uint256 value);
event Reflect(uint256 tAmount, uint256 rAmount, uint256 rTotal_, uint256 teeTotal_);
event ExcludedAccount(address account);
event IncludedAccount(address account);
function paused() internal view returns (bool) {
return s.isPaused;
}
function isBlacklisted(address _address) internal view returns (bool) {
return s.blacklist[_address];
}
/// @notice Handles the taxes for the token.
/// Calls the appropriate tax helper contract to handle
/// LP and BuyBack tax logic
/// @dev handles every tax within the tax facet.
/// @param sender the one sending the transaction
/// @param recipient the one receiving the transaction
/// @param amount the amount of tokens being sent
/// @return totalTaxAmount the total amount of the token taxed
function handleTaxes(address sender, address recipient, uint256 amount) public virtual returns (uint256 totalTaxAmount) {
// restrict it to being only called by registered tokens
require(IMintFactory(s.factory).tokenIsRegistered(address(this)));
bool isBuy = false;
if(s.lpTokens[sender]) {
isBuy = true;
if(!s.marketInit) {
s.marketInit = true;
s.antiBotSettings.startBlock = block.number;
s.marketInitBlockTime = block.timestamp;
emit MarketInit(block.timestamp, block.number);
}
}
if(!s.lpTokens[sender] && !s.lpTokens[recipient]) {
return 0;
}
if(isBuy && s.taxWhitelist[recipient]) {
return 0;
}
if(!isBuy && s.taxWhitelist[sender]) {
return 0;
}
ITaxHelper TaxHelper = ITaxHelper(IMintFactory(s.factory).getTaxHelperAddress(s.taxHelperIndex));
if(sender == address(TaxHelper) || recipient == address(TaxHelper)) {
return 0;
}
totalTaxAmount;
uint256 fee;
if(s.taxSettings.buyBackTax && !isBuy) {
if(TaxHelper.lpTokenHasReserves(s.pairAddress)) {
fee = amount * s.fees.buyBackTax / s.DENOMINATOR;
}
if(fee != 0) {
_transfer(sender, address(TaxHelper), fee);
TaxHelper.initiateBuyBackTax(address(this), address(s.buyBackWallet));
emit BuyBackTaxInitiated(sender, fee, address(s.buyBackWallet), isBuy);
totalTaxAmount += fee;
}
fee = 0;
}
if(s.taxSettings.transactionTax) {
if(isBuy) {
fee = amount * s.fees.transactionTax.buy / s.DENOMINATOR;
} else {
fee = amount * s.fees.transactionTax.sell / s.DENOMINATOR;
}
if(fee != 0) {
_transfer(sender, s.transactionTaxWallet, fee);
emit TransactionTaxInitiated(sender, fee, s.transactionTaxWallet, isBuy);
totalTaxAmount += fee;
}
fee = 0;
}
if(s.taxSettings.lpTax && !isBuy) {
if(TaxHelper.lpTokenHasReserves(s.pairAddress)) {
fee = amount * s.fees.lpTax / s.DENOMINATOR;
}
if(fee != 0) {
_transfer(sender, address(TaxHelper), fee);
TaxHelper.initiateLPTokenTax(address(this), address(s.lpWallet));
emit LPTaxInitiated(sender, fee, address(s.lpWallet), isBuy);
totalTaxAmount += fee;
}
fee = 0;
}
if(s.customTaxes.length > 0) {
for(uint8 i = 0; i < s.customTaxes.length; i++) {
uint256 customFee;
if(isBuy) {
customFee = amount * s.customTaxes[i].fee.buy / s.DENOMINATOR;
} else {
customFee = amount * s.customTaxes[i].fee.sell / s.DENOMINATOR;
}
fee += customFee;
if(fee != 0) {
totalTaxAmount += fee;
_transfer(sender, s.customTaxes[i].wallet, fee);
emit CustomTaxInitiated(sender, fee, s.customTaxes[i].wallet, isBuy);
fee = 0;
}
}
}
}
/// @notice internal transfer method
/// @dev includes checks for all features not handled by handleTaxes()
/// @param sender the one sending the transaction
/// @param recipient the one receiving the transaction
/// @param amount the amount of tokens being sent
function _transfer(address sender, address recipient, uint256 amount) public {
// restrict it to being only called by registered tokens
if(!IMintFactory(s.factory).tokenGeneratorIsAllowed(msg.sender)) {
require(IMintFactory(s.factory).tokenIsRegistered(address(this)));
}
require(sender != address(0), "ETFZ");
require(recipient != address(0), "ETTZ");
require(amount > 0, "TGZ");
require(!paused(), "TP");
require(!isBlacklisted(sender), "SB");
require(!isBlacklisted(recipient), "RB");
require(!isBlacklisted(tx.origin), "SB");
// Reflection Transfers
if(s.taxSettings.holderTax) {
if (s._isExcluded[sender] && !s._isExcluded[recipient]) {
_transferFromExcluded(sender, recipient, amount);
} else if (!s._isExcluded[sender] && s._isExcluded[recipient]) {
_transferToExcluded(sender, recipient, amount);
} else if (!s._isExcluded[sender] && !s._isExcluded[recipient]) {
_transferStandard(sender, recipient, amount);
} else if (s._isExcluded[sender] && s._isExcluded[recipient]) {
_transferBothExcluded(sender, recipient, amount);
} else {
_transferStandard(sender, recipient, amount);
}
} else {
// Non Reflection Transfer
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = s._tOwned[sender];
require(senderBalance >= amount, "ETA");
s._tOwned[sender] = senderBalance - amount;
s._tOwned[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
// Reflection Functions
function reflect(uint256 tAmount) public {
address sender = _msgSender();
require(!s._isExcluded[sender], "EA");
(uint256 rAmount,,,,) = _getValues(tAmount);
s._rOwned[sender] = s._rOwned[sender] - rAmount;
s._rTotal = s._rTotal - rAmount;
s._tFeeTotal = s._tFeeTotal + tAmount;
emit Reflect(tAmount, rAmount, s._rTotal, s._tFeeTotal);
ITaxHelper TaxHelper = ITaxHelper(IMintFactory(s.factory).getTaxHelperAddress(s.taxHelperIndex));
TaxHelper.sync(s.pairAddress);
}
function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
require(tAmount <= s._tTotal, "ALS");
if (!deductTransferFee) {
(uint256 rAmount,,,,) = _getValues(tAmount);
return rAmount;
} else {
(,uint256 rTransferAmount,,,) = _getValues(tAmount);
return rTransferAmount;
}
}
function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
require(rAmount <= s._rTotal, "ALR");
uint256 currentRate = _getRate();
return rAmount / currentRate;
}
function excludeAccount(address account) external onlyOwner {
require(!s._isExcluded[account], "AE");
if(s._rOwned[account] > 0) {
s._tOwned[account] = tokenFromReflection(s._rOwned[account]);
}
s._isExcluded[account] = true;
s._excluded.push(account);
emit ExcludedAccount(account);
}
function includeAccount(address account) external onlyOwner {
require(s._isExcluded[account], "AI");
for (uint256 i = 0; i < s._excluded.length; i++) {
if (s._excluded[i] == account) {
s._excluded[i] = s._excluded[s._excluded.length - 1];
s._tOwned[account] = 0;
s._isExcluded[account] = false;
s._excluded.pop();
break;
}
}
emit IncludedAccount(account);
}
function isExcluded(address account) external view returns(bool) {
return s._isExcluded[account];
}
function _transferStandard(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
s._rOwned[sender] = s._rOwned[sender] - rAmount;
s._rOwned[recipient] = s._rOwned[recipient] + rTransferAmount;
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
s._rOwned[sender] = s._rOwned[sender] - rAmount;
s._tOwned[recipient] = s._tOwned[recipient] + tTransferAmount;
s._rOwned[recipient] = s._rOwned[recipient] + rTransferAmount;
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
s._tOwned[sender] = s._tOwned[sender] - tAmount;
s._rOwned[sender] = s._rOwned[sender] - rAmount;
s._rOwned[recipient] = s._rOwned[recipient] + rTransferAmount;
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
s._tOwned[sender] = s._tOwned[sender] - tAmount;
s._rOwned[sender] = s._rOwned[sender] - rAmount;
s._tOwned[recipient] = s._tOwned[recipient] + tTransferAmount;
s._rOwned[recipient] = s._rOwned[recipient] + rTransferAmount;
_reflectFee(rFee, tFee);
emit Transfer(sender, recipient, tTransferAmount);
}
function _reflectFee(uint256 rFee, uint256 tFee) private {
s._rTotal = s._rTotal - rFee;
s._tFeeTotal = s._tFeeTotal + tFee;
}
function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
(uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
uint256 currentRate = _getRate();
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
}
function _getTValues(uint256 tAmount) private view returns (uint256, uint256) {
uint256 tFee = tAmount / s.fees.holderTax;
uint256 tTransferAmount = tAmount - tFee;
return (tTransferAmount, tFee);
}
function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
uint256 rAmount = tAmount * currentRate;
uint256 rFee = tFee * currentRate;
uint256 rTransferAmount = rAmount - rFee;
return (rAmount, rTransferAmount, rFee);
}
function _getRate() private view returns(uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply / tSupply;
}
function _getCurrentSupply() private view returns(uint256, uint256) {
uint256 rSupply = s._rTotal;
uint256 tSupply = s._tTotal;
for (uint256 i = 0; i < s._excluded.length; i++) {
if (s._rOwned[s._excluded[i]] > rSupply || s._tOwned[s._excluded[i]] > tSupply) return (s._rTotal, s._tTotal);
rSupply = rSupply - s._rOwned[s._excluded[i]];
tSupply = tSupply - s._tOwned[s._excluded[i]];
}
if (rSupply < s._rTotal / s._tTotal) return (s._rTotal, s._tTotal);
return (rSupply, tSupply);
}
function burn(uint256 amount) public {
address taxHelper = IMintFactory(s.factory).getTaxHelperAddress(s.taxHelperIndex);
require(msg.sender == taxHelper || msg.sender == owner(), "RA");
_burn(owner(), amount);
}
/// @notice custom burn to handle reflection
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "EBZ");
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeBurn(account, amount);
}
_beforeTokenTransfer(account, address(0), amount);
if(s.taxSettings.holderTax && !s._isExcluded[account]) {
(uint256 rAmount,,,,) = _getValues(amount);
s._rOwned[account] = s._rOwned[account] - rAmount;
s._rTotal = s._rTotal - rAmount;
s._tFeeTotal = s._tFeeTotal + amount;
}
uint256 accountBalance = s._tOwned[account];
require(accountBalance >= amount, "EBB");
s._tOwned[account] = accountBalance - amount;
s._tTotal -= amount;
emit Transfer(account, address(0), amount);
}
}
// File contracts/facets/Wallets.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract WalletsFacet is Ownable {
Storage internal s;
event CreatedBuyBackWallet(address _wallet);
event CreatedLPWallet(address _wallet);
event UpdatedBuyBackWalletThreshold(uint256 _newThreshold);
event UpdatedLPWalletThreshold(uint256 _newThreshold);
function createBuyBackWallet(address _factory, address _token, uint256 _newThreshold) external returns (address) {
BuyBackWallet newBuyBackWallet = new BuyBackWallet(_factory, _token,_newThreshold);
emit CreatedBuyBackWallet(address(newBuyBackWallet));
return address(newBuyBackWallet);
}
function createLPWallet(address _factory, address _token, uint256 _newThreshold) external returns (address) {
LPWallet newLPWallet = new LPWallet(_factory, _token, _newThreshold);
emit CreatedLPWallet(address(newLPWallet));
return address(newLPWallet);
}
function updateBuyBackWalletThreshold(uint256 _newThreshold) public onlyOwner {
IBuyBackWallet(s.buyBackWallet).updateThreshold(_newThreshold);
emit UpdatedBuyBackWalletThreshold(_newThreshold);
}
function updateLPWalletThreshold(uint256 _newThreshold) public onlyOwner {
ILPWallet(s.lpWallet).updateThreshold(_newThreshold);
emit UpdatedLPWalletThreshold(_newThreshold);
}
}
// File contracts/FeeHelper.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract FeeHelper is Ownable{
struct Settings {
uint256 GENERATOR_FEE;
uint256 FEE;
uint256 DENOMINATOR;
address payable FEE_ADDRESS;
}
Settings public SETTINGS;
constructor() {
SETTINGS.GENERATOR_FEE = 0;
SETTINGS.FEE = 100;
SETTINGS.DENOMINATOR = 10000;
SETTINGS.FEE_ADDRESS = payable(msg.sender);
}
function getGeneratorFee() external view returns(uint256) {
return SETTINGS.GENERATOR_FEE;
}
function getFee() external view returns(uint256) {
return SETTINGS.FEE;
}
function getFeeDenominator() external view returns(uint256) {
return SETTINGS.DENOMINATOR;
}
function setGeneratorFee(uint256 _fee) external onlyOwner {
SETTINGS.GENERATOR_FEE = _fee;
}
function setFee(uint _fee) external onlyOwner {
SETTINGS.FEE = _fee;
}
function getFeeAddress() external view returns(address) {
return SETTINGS.FEE_ADDRESS;
}
function setFeeAddress(address payable _feeAddress) external onlyOwner {
SETTINGS.FEE_ADDRESS = _feeAddress;
}
}
// File contracts/interfaces/IUniswapV2Router01.sol
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File contracts/interfaces/ICamelotV2Router.sol
interface ICamelotRouter is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
address referrer,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
address referrer,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
address referrer,
uint deadline
) external;
}
// File contracts/interfaces/IUniswapV2Router02.sol
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File contracts/libraries/ERC20.sol
//
// File @openzeppelin/contracts/token/ERC20/ERC20.sol@v4.0.0
/**
* @dev Implementation of the {IERC20} 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 {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-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 ERC20 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 {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The defaut value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overloaded;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-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 virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* 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 virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
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 {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + 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 {IERC20-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 virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
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), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += 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 virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += 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 virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This 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 virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File contracts/libraries/Pausable.sol
//
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File contracts/libraries/EnumerableSet.sol
//
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}
// File contracts/MintFactory.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
// This contract logs all tokens on the platform
contract MintFactory is Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet private tokens;
EnumerableSet.AddressSet private tokenGenerators;
struct TaxHelper {
string Name;
address Address;
uint256 Index;
}
mapping(uint => TaxHelper) private taxHelpersData;
address[] private taxHelpers;
mapping(address => address[]) private tokenOwners;
address private FacetHelper;
address private FeeHelper;
address private LosslessController;
event TokenRegistered(address tokenOwner, address tokenContract);
event AllowTokenGenerator(address _address, bool _allow);
event AddedTaxHelper(string _name, address _address, uint256 _index);
event UpdatedTaxHelper(address _newAddress, uint256 _index);
event UpdatedFacetHelper(address _newAddress);
event UpdatedFeeHelper(address _newAddress);
event UpdatedLosslessController(address _newAddress);
function adminAllowTokenGenerator (address _address, bool _allow) public onlyOwner {
if (_allow) {
tokenGenerators.add(_address);
} else {
tokenGenerators.remove(_address);
}
emit AllowTokenGenerator(_address, _allow);
}
function addTaxHelper(string calldata _name, address _address) public onlyOwner {
uint256 index = taxHelpers.length;
TaxHelper memory newTaxHelper;
newTaxHelper.Name = _name;
newTaxHelper.Address = _address;
newTaxHelper.Index = index;
taxHelpersData[index] = newTaxHelper;
taxHelpers.push(_address);
emit AddedTaxHelper(_name, _address, index);
}
function updateTaxHelper(uint256 _index, address _address) public onlyOwner {
taxHelpersData[_index].Address = _address;
taxHelpers[_index] = _address;
emit UpdatedTaxHelper(_address, _index);
}
function getTaxHelperAddress(uint256 _index) public view returns(address){
return taxHelpers[_index];
}
function getTaxHelpersDataByIndex(uint256 _index) public view returns(TaxHelper memory) {
return taxHelpersData[_index];
}
/**
* @notice called by a registered tokenGenerator upon token creation
*/
function registerToken (address _tokenOwner, address _tokenAddress) public {
require(tokenGenerators.contains(msg.sender), 'FORBIDDEN');
tokens.add(_tokenAddress);
tokenOwners[_tokenOwner].push(_tokenAddress);
emit TokenRegistered(_tokenOwner, _tokenAddress);
}
/**
* @notice gets a token at index registered under a user address
* @return token addresses registered to the user address
*/
function getTokenByOwnerAtIndex(address _tokenOwner, uint256 _index) external view returns(address) {
return tokenOwners[_tokenOwner][_index];
}
/**
* @notice gets the total of tokens registered under a user address
* @return uint total of token addresses registered to the user address
*/
function getTokensLengthByOwner(address _tokenOwner) external view returns(uint256) {
return tokenOwners[_tokenOwner].length;
}
/**
* @notice Number of allowed tokenGenerators
*/
function tokenGeneratorsLength() external view returns (uint256) {
return tokenGenerators.length();
}
/**
* @notice Gets the address of a registered tokenGenerator at specified index
*/
function tokenGeneratorAtIndex(uint256 _index) external view returns (address) {
return tokenGenerators.at(_index);
}
/**
* @notice returns true if user is allowed to generate tokens
*/
function tokenGeneratorIsAllowed(address _tokenGenerator) external view returns (bool) {
return tokenGenerators.contains(_tokenGenerator);
}
/**
* @notice returns true if the token address was generated by the Unicrypt token platform
*/
function tokenIsRegistered(address _tokenAddress) external view returns (bool) {
return tokens.contains(_tokenAddress);
}
/**
* @notice The length of all tokens on the platform
*/
function tokensLength() external view returns (uint256) {
return tokens.length();
}
/**
* @notice gets a token at a specific index. Although using Enumerable Set, since tokens are only added and not removed, indexes will never change
* @return the address of the token contract at index
*/
function tokenAtIndex(uint256 _index) external view returns (address) {
return tokens.at(_index);
}
// Helpers and Controllers
function getFacetHelper() public view returns (address) {
return FacetHelper;
}
function updateFacetHelper(address _newFacetHelperAddress) public onlyOwner {
require(_newFacetHelperAddress != address(0));
FacetHelper = _newFacetHelperAddress;
emit UpdatedFacetHelper(_newFacetHelperAddress);
}
function getFeeHelper() public view returns (address) {
return FeeHelper;
}
function updateFeeHelper(address _newFeeHelperAddress) public onlyOwner {
require(_newFeeHelperAddress != address(0));
FeeHelper = _newFeeHelperAddress;
emit UpdatedFeeHelper(_newFeeHelperAddress);
}
function getLosslessController() public view returns (address) {
return LosslessController;
}
function updateLosslessController(address _newLosslessControllerAddress) public onlyOwner {
require(_newLosslessControllerAddress != address(0));
LosslessController = _newLosslessControllerAddress;
emit UpdatedLosslessController(_newLosslessControllerAddress);
}
}
// File contracts/TaxToken.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
contract TaxToken is Ownable{
Storage internal s;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
struct ConstructorParams {
string name_;
string symbol_;
uint8 decimals_;
address creator_;
uint256 tTotal_;
uint256 _maxTax;
TaxSettings _settings;
TaxSettings _lockedSettings;
Fees _fees;
address _transactionTaxWallet;
CustomTax[] _customTaxes;
uint256 lpWalletThreshold;
uint256 buyBackWalletThreshold;
uint256 _taxHelperIndex;
address admin_;
address recoveryAdmin_;
bool isLossless_;
AntiBotSettings _antiBotSettings;
uint256 _maxBalanceAfterBuy;
SwapWhitelistingSettings _swapWhitelistingSettings;
}
constructor(
ConstructorParams memory params,
address _factory
) {
address constructorFacetAddress = IFacetHelper(IMintFactory(_factory).getFacetHelper()).getConstructorFacet();
(bool success, bytes memory result) = constructorFacetAddress.delegatecall(abi.encodeWithSignature("constructorHandler((string,string,uint8,address,uint256,uint256,(bool,bool,bool,bool,bool,bool,bool,bool),(bool,bool,bool,bool,bool,bool,bool,bool),((uint256,uint256),uint256,uint256,uint256),address,(string,(uint256,uint256),address,bool)[],uint256,uint256,uint256,address,address,bool,(uint256,uint256,uint256,uint256,bool),uint256,(uint256,bool)),address)", params, _factory));
if (!success) {
if (result.length < 68) revert();
revert(abi.decode(result, (string)));
}
IFeeHelper feeHelper = IFeeHelper(IMintFactory(s.factory).getFeeHelper());
uint256 fee = FullMath.mulDiv(params.tTotal_, feeHelper.getFee(), feeHelper.getFeeDenominator());
address feeAddress = feeHelper.getFeeAddress();
_approve(params.creator_, msg.sender, fee);
s.isTaxed = true;
transferFrom(params.creator_, feeAddress, fee);
}
/// @notice this is the power behind Lossless
function transferOutBlacklistedFunds(address[] calldata from) external {
require(s.isLosslessOn); // added by us for extra protection
require(_msgSender() == address(IMintFactory(s.factory).getLosslessController()), "LOL");
for (uint i = 0; i < from.length; i++) {
_transfer(from[i], address(IMintFactory(s.factory).getLosslessController()), balanceOf(from[i]));
}
}
/// @notice Checks whether an address is blacklisted
/// @param _address the address to check
/// @return bool is blacklisted or not
function isBlacklisted(address _address) public view returns (bool) {
return s.blacklist[_address];
}
/// @notice Checks whether the contract has paused transactions
/// @return bool is paused or not
function paused() public view returns (bool) {
if(s.taxSettings.canPause == false) {
return false;
}
return s.isPaused;
}
/// @notice Handles the burning of token during the buyback tax process
/// @dev must first receive the amount to be burned from the taxHelper contract (see initial transfer in function)
/// @param _amount the amount to burn
function buyBackBurn(uint256 _amount) external {
address taxHelper = IMintFactory(s.factory).getTaxHelperAddress(s.taxHelperIndex);
require(msg.sender == taxHelper, "RA");
_transfer(taxHelper, owner(), _amount);
address taxFacetAddress = IFacetHelper(IMintFactory(s.factory).getFacetHelper()).getTaxFacet();
(bool success, bytes memory result) = taxFacetAddress.delegatecall(abi.encodeWithSignature("burn(uint256)", _amount));
if (!success) {
if (result.length < 68) revert();
revert(abi.decode(result, (string)));
}
}
/// @notice Handles the taxes for the token.
/// @dev handles every tax within the tax facet.
/// @param sender the one sending the transaction
/// @param recipient the one receiving the transaction
/// @param amount the amount of tokens being sent
/// @return totalTaxAmount the total amount of the token taxed
function handleTaxes(address sender, address recipient, uint256 amount) internal virtual returns (uint256 totalTaxAmount) {
address taxFacetAddress = IFacetHelper(IMintFactory(s.factory).getFacetHelper()).getTaxFacet();
(bool success, bytes memory result) = taxFacetAddress.delegatecall(abi.encodeWithSignature("handleTaxes(address,address,uint256)", sender, recipient, amount));
if (!success) {
if (result.length < 68) revert();
revert(abi.decode(result, (string)));
}
return abi.decode(result, (uint256));
}
// Getters
function name() public view returns (string memory) {
return s._name;
}
function symbol() public view returns (string memory) {
return s._symbol;
}
function decimals() public view returns (uint8) {
return s._decimals;
}
function totalSupply() public view returns (uint256) {
return s._tTotal;
}
function CONTRACT_VERSION() public view returns (uint256) {
return s.CONTRACT_VERSION;
}
function taxSettings() public view returns (TaxSettings memory) {
return s.taxSettings;
}
function isLocked() public view returns (TaxSettings memory) {
return s.isLocked;
}
function fees() public view returns (Fees memory) {
return s.fees;
}
function customTaxes(uint _index) public view returns (CustomTax memory) {
return s.customTaxes[_index];
}
function transactionTaxWallet() public view returns (address) {
return s.transactionTaxWallet;
}
function customTaxLength() public view returns (uint256) {
return s.customTaxLength;
}
function MaxTax() public view returns (uint256) {
return s.MaxTax;
}
function MaxCustom() public view returns (uint8) {
return s.MaxCustom;
}
function _allowances(address _address1, address _address2) public view returns (uint256) {
return s._allowances[_address1][_address2];
}
function _isExcluded(address _address) public view returns (bool) {
return s._isExcluded[_address];
}
function _tFeeTotal() public view returns (uint256) {
return s._tFeeTotal;
}
function lpTokens(address _address) public view returns (bool) {
return s.lpTokens[_address];
}
function factory() public view returns (address) {
return s.factory;
}
function buyBackWallet() public view returns (address) {
return s.buyBackWallet;
}
function lpWallet() public view returns (address) {
return s.lpWallet;
}
function pairAddress() public view returns (address) {
return s.pairAddress;
}
function taxHelperIndex() public view returns (uint256) {
return s.taxHelperIndex;
}
function marketInit() public view returns (bool) {
return s.marketInit;
}
function marketInitBlockTime() public view returns (uint256) {
return s.marketInitBlockTime;
}
function antiBotSettings() public view returns (AntiBotSettings memory) {
return s.antiBotSettings;
}
function maxBalanceAfterBuy() public view returns (uint256) {
return s.maxBalanceAfterBuy;
}
function swapWhitelistingSettings() public view returns (SwapWhitelistingSettings memory) {
return s.swapWhitelistingSettings;
}
function recoveryAdmin() public view returns (address) {
return s.recoveryAdmin;
}
function admin() public view returns (address) {
return s.admin;
}
function timelockPeriod() public view returns (uint256) {
return s.timelockPeriod;
}
function losslessTurnOffTimestamp() public view returns (uint256) {
return s.losslessTurnOffTimestamp;
}
function isLosslessTurnOffProposed() public view returns (bool) {
return s.isLosslessTurnOffProposed;
}
function isLosslessOn() public view returns (bool) {
return s.isLosslessOn;
}
function lossless() public view returns (ILosslessController) {
return ILosslessController(IMintFactory(s.factory).getLosslessController());
}
// ERC20 Functions
/// @dev modified to handle if the token has reflection active in it settings
function balanceOf(address account) public view returns (uint256) {
if(s.taxSettings.holderTax) {
if (s._isExcluded[account]) return s._tOwned[account];
return tokenFromReflection(s._rOwned[account]);
}
return s._tOwned[account];
}
// Reflection Functions
// necessary to get reflection balance
function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
require(rAmount <= s._rTotal, "ALR");
uint256 currentRate = _getRate();
return rAmount / currentRate;
}
function _getRate() public view returns(uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply / tSupply;
}
function _getCurrentSupply() public view returns(uint256, uint256) {
uint256 rSupply = s._rTotal;
uint256 tSupply = s._tTotal;
for (uint256 i = 0; i < s._excluded.length; i++) {
if (s._rOwned[s._excluded[i]] > rSupply || s._tOwned[s._excluded[i]] > tSupply) return (s._rTotal, s._tTotal);
rSupply = rSupply - s._rOwned[s._excluded[i]];
tSupply = tSupply - s._tOwned[s._excluded[i]];
}
if (rSupply < s._rTotal / s._tTotal) return (s._rTotal, s._tTotal);
return (rSupply, tSupply);
}
// ERC20 Functions continued
/// @dev modified slightly to add taxes
function transfer(address recipient, uint256 amount) public returns (bool) {
if(!s.isTaxed) {
s.isTaxed = true;
uint256 totalTaxAmount = handleTaxes(_msgSender(), recipient, amount);
amount -= totalTaxAmount;
}
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeTransfer(_msgSender(), recipient, amount);
}
_transfer(_msgSender(), recipient, amount);
s.isTaxed = false;
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).afterTransfer(_msgSender(), recipient, amount);
}
return true;
}
function allowance(address _owner, address spender) public view returns (uint256) {
return s._allowances[_owner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
if(!s.isTaxed) {
s.isTaxed = true;
uint256 totalTaxAmount = handleTaxes(sender, recipient, amount);
amount -= totalTaxAmount;
}
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeTransferFrom(_msgSender(), sender, recipient, amount);
}
_transfer(sender, recipient, amount);
uint256 currentAllowance = s._allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ETA");
_approve(sender, _msgSender(), s._allowances[sender][_msgSender()] - amount);
s.isTaxed = false;
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).afterTransfer(_msgSender(), recipient, amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeIncreaseAllowance(_msgSender(), spender, addedValue);
}
_approve(_msgSender(), spender, s._allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeDecreaseAllowance(_msgSender(), spender, subtractedValue);
}
uint256 currentAllowance = s._allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "EABZ");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
function _approve(address _owner, address spender, uint256 amount) private {
require(_owner != address(0), "EAFZ");
require(spender != address(0), "EATZ");
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeApprove(_owner, spender, amount);
}
s._allowances[_owner][spender] = amount;
emit Approval(_owner, spender, amount);
}
function _transfer(address sender, address recipient, uint256 amount) private {
// AntiBot Checks
address antiBotFacetAddress = IFacetHelper(IMintFactory(s.factory).getFacetHelper()).getAntiBotFacet();
if(s.marketInit && s.antiBotSettings.isActive && s.lpTokens[sender]) {
(bool success, bytes memory result) = antiBotFacetAddress.delegatecall(abi.encodeWithSignature("antiBotCheck(uint256,address)", amount, recipient));
if (!success) {
if (result.length < 68) revert();
revert(abi.decode(result, (string)));
}
}
if(s.taxSettings.maxBalanceAfterBuy && s.lpTokens[sender]) {
(bool success2, bytes memory result2) = antiBotFacetAddress.delegatecall(abi.encodeWithSignature("maxBalanceAfterBuyCheck(uint256,address)", amount, recipient));
if (!success2) {
if (result2.length < 68) revert();
revert(abi.decode(result2, (string)));
}
}
if(s.marketInit && s.swapWhitelistingSettings.isActive && s.lpTokens[sender]) {
(bool success3, bytes memory result3) = antiBotFacetAddress.delegatecall(abi.encodeWithSignature("swapWhitelistingCheck(address)", recipient));
if (!success3) {
if (result3.length < 68) revert();
revert(abi.decode(result3, (string)));
}
}
address taxFacetAddress = IFacetHelper(IMintFactory(s.factory).getFacetHelper()).getTaxFacet();
(bool success4, bytes memory result4) = taxFacetAddress.delegatecall(abi.encodeWithSignature("_transfer(address,address,uint256)", sender, recipient, amount));
if (!success4) {
if (result4.length < 68) revert();
revert(abi.decode(result4, (string)));
}
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
function mint(uint256 amount) public onlyOwner {
_mint(msg.sender, amount);
}
/// @notice custom mint to handle fees
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "EMZ");
require(s.taxSettings.canMint, "NM");
require(!s.taxSettings.holderTax, "NM");
if (s.isLosslessOn) {
ILosslessController(IMintFactory(s.factory).getLosslessController()).beforeMint(account, amount);
}
IFeeHelper feeHelper = IFeeHelper(IMintFactory(s.factory).getFeeHelper());
uint256 fee = FullMath.mulDiv(amount, feeHelper.getFee(), feeHelper.getFeeDenominator());
address feeAddress = feeHelper.getFeeAddress();
_beforeTokenTransfer(address(0), account, amount);
s._tTotal += amount;
s._tOwned[feeAddress] += fee;
s._tOwned[account] += amount - fee;
emit Transfer(address(0), feeAddress, fee);
emit Transfer(address(0), account, amount - fee);
}
function burn(uint256 amount) public {
address taxFacetAddress = IFacetHelper(IMintFactory(s.factory).getFacetHelper()).getTaxFacet();
(bool success, bytes memory result) = taxFacetAddress.delegatecall(abi.encodeWithSignature("burn(uint256)", amount));
if (!success) {
if (result.length < 68) revert();
revert(abi.decode(result, (string)));
}
}
/// @notice Handles all facet logic
/// @dev Implements a customized version of the EIP-2535 Diamond Standard to add extra functionality to the contract
/// https://github.com/mudgen/diamond-3
fallback() external {
address facetHelper = IMintFactory(s.factory).getFacetHelper();
address facet = IFacetHelper(facetHelper).facetAddress(msg.sig);
require(facet != address(0), "Function does not exist");
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let result := delegatecall(
gas(),
facet,
ptr,
calldatasize(),
0,
0
)
let size := returndatasize()
returndatacopy(ptr, 0, size)
switch result
case 0 {
revert(ptr, size)
}
default {
return(ptr, size)
}
}
}
}
// File contracts/MintGenerator.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
// This contract generates Token01 contracts and registers them in the TokenFactory.
// Ideally you should not interact with this contract directly, and use the Unicrypt token app instead so warnings can be shown where necessary.
contract MintGenerator is Ownable {
uint256 public CONTRACT_VERSION = 1;
IMintFactory public MINT_FACTORY;
IFeeHelper public FEE_HELPER;
constructor(address _mintFactory, address _feeHelper) {
MINT_FACTORY = IMintFactory(_mintFactory);
FEE_HELPER = IFeeHelper(_feeHelper);
}
/**
* @notice Creates a new Token contract and registers it in the TokenFactory.sol.
*/
function createToken (
TaxToken.ConstructorParams calldata params
) public payable returns (address){
require(msg.value == FEE_HELPER.getGeneratorFee(), 'FEE NOT MET');
payable(FEE_HELPER.getFeeAddress()).transfer(FEE_HELPER.getGeneratorFee());
TaxToken newToken = new TaxToken(params, address(MINT_FACTORY));
MINT_FACTORY.registerToken(msg.sender, address(newToken));
return address(newToken);
}
}
// File contracts/interfaces/IUniswapV2Factory.sol
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
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(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
// File contracts/interfaces/IUniswapV2Pair.sol
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint 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 (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint 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 (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
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 (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File contracts/TaxHelperCamelotV2.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
// add events
contract TaxHelperCamelotV2 is Ownable{
ICamelotRouter router;
IUniswapV2Factory factory;
IMintFactory mintFactory;
// event Buy
event CreatedLPToken(address token0, address token1, address LPToken);
constructor(address swapV2Router, address swapV2Factory, address _mintFactory) {
router = ICamelotRouter(swapV2Router);
factory = IUniswapV2Factory(swapV2Factory);
mintFactory = IMintFactory(_mintFactory);
}
modifier isToken() {
require(mintFactory.tokenIsRegistered(msg.sender), "RA");
_;
}
function initiateBuyBackTax(address _token, address _wallet) payable external isToken returns(bool) {
ITaxToken token = ITaxToken(_token);
uint256 _amount = token.balanceOf(address(this));
address[] memory addressPaths = new address[](2);
addressPaths[0] = _token;
addressPaths[1] = router.WETH();
token.approve(address(router), _amount);
if(_amount > 0) {
router.swapExactTokensForETHSupportingFeeOnTransferTokens(_amount, 0, addressPaths, _wallet, address(0), block.timestamp);
}
IBuyBackWallet buyBackWallet = IBuyBackWallet(_wallet);
bool res = buyBackWallet.checkBuyBackTrigger();
if(res) {
addressPaths[0] = router.WETH();
addressPaths[1] = _token;
uint256 amountEth = buyBackWallet.sendEthToTaxHelper();
uint256 balanceBefore = token.balanceOf(address(this));
router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountEth}(0, addressPaths, address(this), address(0), block.timestamp);
// burn baby burn!
uint256 balanceAfter = token.balanceOf(address(this));
uint256 amountToBurn = balanceAfter - balanceBefore;
token.approve(token.owner(), amountToBurn);
token.buyBackBurn(amountToBurn);
}
return true;
}
function initiateLPTokenTax(address _token, address _wallet) external isToken returns (bool) {
ITaxToken token = ITaxToken(_token);
uint256 _amount = token.balanceOf(address(this));
address[] memory addressPaths = new address[](2);
addressPaths[0] = _token;
addressPaths[1] = router.WETH();
uint256 halfAmount = _amount / 2;
uint256 otherHalf = _amount - halfAmount;
token.transfer(_wallet, otherHalf);
token.approve(address(router), halfAmount);
if(halfAmount > 0) {
router.swapExactTokensForETHSupportingFeeOnTransferTokens(halfAmount, 0, addressPaths, _wallet, address(0), block.timestamp);
}
ILPWallet lpWallet = ILPWallet(_wallet);
bool res = lpWallet.checkLPTrigger();
if(res) {
lpWallet.transferBalanceToTaxHelper();
uint256 amountEth = lpWallet.sendEthToTaxHelper();
uint256 tokenBalance = token.balanceOf(address(this));
token.approve(address(router), tokenBalance);
router.addLiquidityETH{value: amountEth}(_token, tokenBalance, 0, 0, token.owner(), block.timestamp + 20 minutes);
uint256 ethDust = address(this).balance;
if(ethDust > 0) {
(bool sent,) = _wallet.call{value: ethDust}("");
require(sent, "Failed to send Ether");
}
uint256 tokenDust = token.balanceOf(address(this));
if(tokenDust > 0) {
token.transfer(_wallet, tokenDust);
}
}
return true;
}
function createLPToken() external returns(address lpToken) {
// lpToken = factory.createPair(msg.sender, router.WETH());
// emit CreatedLPToken(msg.sender, router.WETH(), lpToken);
// Camelot V2 fails upon LP creation during the constructor
// return zaero address to be updated after creation.
return address(0);
}
function lpTokenHasReserves(address _lpToken) public view returns (bool) {
(uint112 reserve0, uint112 reserve1,) = IUniswapV2Pair(_lpToken).getReserves();
return reserve0 > 0 && reserve1 > 0;
}
function sync(address _lpToken) public {
IUniswapV2Pair(_lpToken).sync();
}
receive() payable external {
}
}
// File contracts/TaxHelperUniswapV2.sol
//
// ALL RIGHTS RESERVED
// Unicrypt by SDDTech reserves all rights on this code. You may NOT copy these contracts.
// add events
contract TaxHelperUniswapV2 is Ownable{
IUniswapV2Router02 router;
IUniswapV2Factory factory;
IMintFactory mintFactory;
// event Buy
event CreatedLPToken(address token0, address token1, address LPToken);
constructor(address swapV2Router, address swapV2Factory, address _mintFactory) {
router = IUniswapV2Router02(swapV2Router);
factory = IUniswapV2Factory(swapV2Factory);
mintFactory = IMintFactory(_mintFactory);
}
modifier isToken() {
require(mintFactory.tokenIsRegistered(msg.sender), "RA");
_;
}
function initiateBuyBackTax(address _token, address _wallet) payable external isToken returns(bool) {
ITaxToken token = ITaxToken(_token);
uint256 _amount = token.balanceOf(address(this));
address[] memory addressPaths = new address[](2);
addressPaths[0] = _token;
addressPaths[1] = router.WETH();
token.approve(address(router), _amount);
if(_amount > 0) {
router.swapExactTokensForETHSupportingFeeOnTransferTokens(_amount, 0, addressPaths, _wallet, block.timestamp);
}
IBuyBackWallet buyBackWallet = IBuyBackWallet(_wallet);
bool res = buyBackWallet.checkBuyBackTrigger();
if(res) {
addressPaths[0] = router.WETH();
addressPaths[1] = _token;
uint256 amountEth = buyBackWallet.sendEthToTaxHelper();
uint256 balanceBefore = token.balanceOf(address(this));
router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountEth}(0, addressPaths, address(this), block.timestamp);
// burn baby burn!
uint256 balanceAfter = token.balanceOf(address(this));
uint256 amountToBurn = balanceAfter - balanceBefore;
token.approve(token.owner(), amountToBurn);
token.buyBackBurn(amountToBurn);
}
return true;
}
function initiateLPTokenTax(address _token, address _wallet) external isToken returns (bool) {
ITaxToken token = ITaxToken(_token);
uint256 _amount = token.balanceOf(address(this));
address[] memory addressPaths = new address[](2);
addressPaths[0] = _token;
addressPaths[1] = router.WETH();
uint256 halfAmount = _amount / 2;
uint256 otherHalf = _amount - halfAmount;
token.transfer(_wallet, otherHalf);
token.approve(address(router), halfAmount);
if(halfAmount > 0) {
router.swapExactTokensForETHSupportingFeeOnTransferTokens(halfAmount, 0, addressPaths, _wallet, block.timestamp);
}
ILPWallet lpWallet = ILPWallet(_wallet);
bool res = lpWallet.checkLPTrigger();
if(res) {
lpWallet.transferBalanceToTaxHelper();
uint256 amountEth = lpWallet.sendEthToTaxHelper();
uint256 tokenBalance = token.balanceOf(address(this));
token.approve(address(router), tokenBalance);
router.addLiquidityETH{value: amountEth}(_token, tokenBalance, 0, 0, token.owner(), block.timestamp + 20 minutes);
uint256 ethDust = address(this).balance;
if(ethDust > 0) {
(bool sent,) = _wallet.call{value: ethDust}("");
require(sent, "Failed to send Ether");
}
uint256 tokenDust = token.balanceOf(address(this));
if(tokenDust > 0) {
token.transfer(_wallet, tokenDust);
}
}
return true;
}
function createLPToken() external returns(address lpToken) {
lpToken = factory.createPair(msg.sender, router.WETH());
emit CreatedLPToken(msg.sender, router.WETH(), lpToken);
}
function lpTokenHasReserves(address _lpToken) public view returns (bool) {
(uint112 reserve0, uint112 reserve1,) = IUniswapV2Pair(_lpToken).getReserves();
return reserve0 > 0 && reserve1 > 0;
}
function sync(address _lpToken) public {
IUniswapV2Pair(_lpToken).sync();
}
receive() payable external {
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_mintFactory","type":"address"},{"internalType":"address","name":"_feeHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_HELPER","outputs":[{"internalType":"contract IFeeHelper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_FACTORY","outputs":[{"internalType":"contract IMintFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"creator_","type":"address"},{"internalType":"uint256","name":"tTotal_","type":"uint256"},{"internalType":"uint256","name":"_maxTax","type":"uint256"},{"components":[{"internalType":"bool","name":"transactionTax","type":"bool"},{"internalType":"bool","name":"buyBackTax","type":"bool"},{"internalType":"bool","name":"holderTax","type":"bool"},{"internalType":"bool","name":"lpTax","type":"bool"},{"internalType":"bool","name":"canBlacklist","type":"bool"},{"internalType":"bool","name":"canMint","type":"bool"},{"internalType":"bool","name":"canPause","type":"bool"},{"internalType":"bool","name":"maxBalanceAfterBuy","type":"bool"}],"internalType":"struct TaxSettings","name":"_settings","type":"tuple"},{"components":[{"internalType":"bool","name":"transactionTax","type":"bool"},{"internalType":"bool","name":"buyBackTax","type":"bool"},{"internalType":"bool","name":"holderTax","type":"bool"},{"internalType":"bool","name":"lpTax","type":"bool"},{"internalType":"bool","name":"canBlacklist","type":"bool"},{"internalType":"bool","name":"canMint","type":"bool"},{"internalType":"bool","name":"canPause","type":"bool"},{"internalType":"bool","name":"maxBalanceAfterBuy","type":"bool"}],"internalType":"struct TaxSettings","name":"_lockedSettings","type":"tuple"},{"components":[{"components":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"internalType":"struct Fee","name":"transactionTax","type":"tuple"},{"internalType":"uint256","name":"buyBackTax","type":"uint256"},{"internalType":"uint256","name":"holderTax","type":"uint256"},{"internalType":"uint256","name":"lpTax","type":"uint256"}],"internalType":"struct Fees","name":"_fees","type":"tuple"},{"internalType":"address","name":"_transactionTaxWallet","type":"address"},{"components":[{"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"uint256","name":"buy","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"internalType":"struct Fee","name":"fee","type":"tuple"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"withdrawAsGas","type":"bool"}],"internalType":"struct CustomTax[]","name":"_customTaxes","type":"tuple[]"},{"internalType":"uint256","name":"lpWalletThreshold","type":"uint256"},{"internalType":"uint256","name":"buyBackWalletThreshold","type":"uint256"},{"internalType":"uint256","name":"_taxHelperIndex","type":"uint256"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"recoveryAdmin_","type":"address"},{"internalType":"bool","name":"isLossless_","type":"bool"},{"components":[{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"increment","type":"uint256"},{"internalType":"uint256","name":"initialMaxHold","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct AntiBotSettings","name":"_antiBotSettings","type":"tuple"},{"internalType":"uint256","name":"_maxBalanceAfterBuy","type":"uint256"},{"components":[{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct SwapWhitelistingSettings","name":"_swapWhitelistingSettings","type":"tuple"}],"internalType":"struct TaxToken.ConstructorParams","name":"params","type":"tuple"}],"name":"createToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526001805534801561001457600080fd5b50604051615a2d380380615a2d833981016040819052610033916100c1565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b039384166001600160a01b031991821617909155600380549290931691161790556100f4565b80516001600160a01b03811681146100bc57600080fd5b919050565b600080604083850312156100d457600080fd5b6100dd836100a5565b91506100eb602084016100a5565b90509250929050565b61592a806101036000396000f3fe608060405260043610620000685760003560e01c806323581413146200006d57806338b9033314620000ac578063715018a614620000d35780638da5cb5b14620000ed578063a4f1c9461462000105578063c07d1129146200011c578063f2fde38b146200013e575b600080fd5b3480156200007a57600080fd5b506002546200008f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620000b957600080fd5b50620000c460015481565b604051908152602001620000a3565b348015620000e057600080fd5b50620000eb62000163565b005b348015620000fa57600080fd5b506200008f620001d9565b6200008f620001163660046200057e565b620001e8565b3480156200012957600080fd5b506003546200008f906001600160a01b031681565b3480156200014b57600080fd5b50620000eb6200015d366004620005ee565b6200047e565b336200016e620001d9565b6001600160a01b031614620001a05760405162461bcd60e51b815260040162000197906200060e565b60405180910390fd5b600080546040516001600160a01b0390911690600080516020620058d5833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b60035460408051636dbe684f60e11b815290516000926001600160a01b03169163db7cd09e9160048083019260209291908290030181865afa15801562000233573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000259919062000643565b3414620002975760405162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b604482015260640162000197565b600360009054906101000a90046001600160a01b03166001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002eb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031191906200065d565b6001600160a01b03166108fc600360009054906101000a90046001600160a01b03166001600160a01b031663db7cd09e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000371573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000397919062000643565b6040518115909202916000818181858888f19350505050158015620003c0573d6000803e3d6000fd5b5060025460405160009184916001600160a01b0390911690620003e39062000563565b620003f092919062000934565b604051809103906000f0801580156200040d573d6000803e3d6000fd5b50600254604051634739f7e560e01b81523360048201526001600160a01b038084166024830152929350911690634739f7e590604401600060405180830381600087803b1580156200045e57600080fd5b505af115801562000473573d6000803e3d6000fd5b509295945050505050565b3362000489620001d9565b6001600160a01b031614620004b25760405162461bcd60e51b815260040162000197906200060e565b6001600160a01b038116620005195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000197565b600080546040516001600160a01b0380851693921691600080516020620058d583398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b614d798062000b5c83390190565b6001600160a01b03169052565b6000602082840312156200059157600080fd5b81356001600160401b03811115620005a857600080fd5b82016105608185031215620005bc57600080fd5b9392505050565b6001600160a01b0381168114620005d957600080fd5b50565b8035620005e981620005c3565b919050565b6000602082840312156200060157600080fd5b8135620005bc81620005c3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156200065657600080fd5b5051919050565b6000602082840312156200067057600080fd5b8151620005bc81620005c3565b6000808335601e198436030181126200069557600080fd5b83016020810192503590506001600160401b03811115620006b557600080fd5b803603821315620006c557600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b803560ff81168114620005e957600080fd5b80358015158114620005e957600080fd5b620007238162000707565b15158252620007356020820162000707565b151560208301526200074a6040820162000707565b151560408301526200075f6060820162000707565b15156060830152620007746080820162000707565b151560808301526200078960a0820162000707565b151560a08301526200079e60c0820162000707565b151560c0830152620007b360e0820162000707565b80151560e0840152505050565b6000808335601e19843603018112620007d857600080fd5b83016020810192503590506001600160401b03811115620007f857600080fd5b8060051b3603821315620006c557600080fd5b81835260006020808501808196508560051b81019150846000805b88811015620008ce578385038a528235609e1989360301811262000848578283fd5b880160a06200085882806200067d565b8289526200086a838a018284620006cc565b925050506200088788880189840180358252602090810135910152565b6060808301356200089881620005c3565b6001600160a01b0316908801526080620008b483820162000707565b151597019690965250988501989185019160010162000826565b509298975050505050505050565b803582526020810135602083015260408101356040830152606081013560608301526200090c6080820162000707565b151560808301525050565b80358252620009296020820162000707565b151560208301525050565b6040815260006200094684856200067d565b610560806040860152620009606105a086018385620006cc565b92506200097160208801886200067d565b9250603f19808786030160608801526200098d858584620006cc565b94506200099d60408a01620006f5565b60ff811660808901529350620009b660608a01620005dc565b9350620009c760a088018562000571565b608089013560c088015260a089013560e0880152620009ee610100880160c08b0162000718565b62000a0261020088016101c08b0162000718565b62000a4061030088016102c08b0180358252602080820135908301526040810135604083015260608101356060830152608081013560808301525050565b62000a4f6103608a01620005dc565b93506103a0915062000a648288018562000571565b62000a746103808a018a620007c0565b94506103c08289880301818a015262000a8f8787846200080b565b96506103e09550838b0135868a01526104009350808b0135848a0152505050610420838901358188015262000ac6828a01620005dc565b9350610440915062000adb8288018562000571565b62000ae8818a01620005dc565b93505061046062000afc8188018562000571565b62000b09828a0162000707565b801515610480890152935062000b266104a08801828b01620008dc565b505061050087013561054086015262000b46818601610520890162000917565b505080915050620005bc60208301846200057156fe60806040523480156200001157600080fd5b5060405162004d7938038062004d79833981016040819052620000349162001597565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000816001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000dc919062001798565b6001600160a01b0316630ef73d2c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000140919062001798565b9050600080826001600160a01b031685856040516024016200016492919062001948565b60408051601f198184030181529181526020820180516001600160e01b0316633c74db8560e11b179052516200019b919062001b34565b600060405180830381855af49150503d8060008114620001d8576040519150601f19603f3d011682016040523d82523d6000602084013e620001dd565b606091505b5091509150816200023257604481511015620001f857600080fd5b808060200190518101906200020e919062001b52565b60405162461bcd60e51b815260040162000229919062001b8a565b60405180910390fd5b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156200027d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a3919062001798565b905060006200038b8760800151836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000315919062001b9f565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037a919062001b9f565b6200044160201b62001dbe1760201c565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f4919062001798565b90506200040d88606001513384620004f960201b60201c565b601e805460ff60a81b1916600160a81b179055606088015162000432908284620006c4565b50505050505050505062001c1c565b60008080600019858709858702925082811083820303915050806000036200047d57600084116200047157600080fd5b508290049050620004f2565b8084116200048a57600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6001600160a01b0383166200053a5760405162461bcd60e51b8152600401620002299060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b0382166200057b5760405162461bcd60e51b8152600401620002299060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff16156200066357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015620005d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005fd919062001798565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b81526004016200062e9392919062001bb9565b600060405180830381600087803b1580156200064957600080fd5b505af11580156200065e573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601e54600090600160a81b900460ff166200070d57601e805460ff60a81b1916600160a81b1790556000620006fb858585620009b9565b905062000709818462001bdd565b9250505b603654610100900460ff16156200081157601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801562000769573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200078f919062001798565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b158015620007f757600080fd5b505af11580156200080c573d6000803e3d6000fd5b505050505b6200081e84848462000b78565b6001600160a01b0384166000908152601160209081526040808320338452909152902054828110156200087a5760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640162000229565b6001600160a01b038516600090815260116020908152604080832033808552925290912054620008b9918791620008b390879062001bdd565b620004f9565b601e805460ff60a81b19169055603654610100900460ff1615620009ae57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801562000922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000948919062001798565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401620009799392919062001bb9565b600060405180830381600087803b1580156200099457600080fd5b505af1158015620009a9573d6000803e3d6000fd5b505050505b506001949350505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a13573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a39919062001798565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a9d919062001798565b9050600080826001600160a01b031687878760405160240162000ac39392919062001bb9565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b1790525162000afa919062001b34565b600060405180830381855af49150503d806000811462000b37576040519150601f19603f3d011682016040523d82523d6000602084013e62000b3c565b606091505b50915091508162000b5757604481511015620001f857600080fd5b8080602001905181019062000b6d919062001b9f565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa15801562000bc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000be9919062001798565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c27573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c4d919062001798565b60255490915060ff16801562000c655750602b5460ff165b801562000c8a57506001600160a01b03841660009081526018602052604090205460ff165b1562000d4957600080826001600160a01b0316848660405160240162000cb292919062001c05565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525162000ce9919062001b34565b600060405180830381855af49150503d806000811462000d26576040519150601f19603f3d011682016040523d82523d6000602084013e62000d2b565b606091505b50915091508162000d4657604481511015620001f857600080fd5b50505b600254670100000000000000900460ff16801562000d7f57506001600160a01b03841660009081526018602052604090205460ff165b1562000e3e57600080826001600160a01b0316848660405160240162000da792919062001c05565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b1790525162000dde919062001b34565b600060405180830381855af49150503d806000811462000e1b576040519150601f19603f3d011682016040523d82523d6000602084013e62000e20565b606091505b50915091508162000e3b57604481511015620001f857600080fd5b50505b60255460ff16801562000e535750602f5460ff165b801562000e7857506001600160a01b03841660009081526018602052604090205460ff165b1562000f33576040516001600160a01b038481166024830152600091829184169060440160408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b1790525162000ed3919062001b34565b600060405180830381855af49150503d806000811462000f10576040519150601f19603f3d011682016040523d82523d6000602084013e62000f15565b606091505b50915091508162000f3057604481511015620001f857600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa15801562000f7e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fa4919062001798565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001008919062001798565b9050600080826001600160a01b03168787876040516024016200102e9392919062001bb9565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b1790525162001065919062001b34565b600060405180830381855af49150503d8060008114620010a2576040519150601f19603f3d011682016040523d82523d6000602084013e620010a7565b606091505b509150915081620010c257604481511015620001f857600080fd5b50505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620011065762001106620010cb565b60405290565b604051608081016001600160401b0381118282101715620011065762001106620010cb565b60405161028081016001600160401b0381118282101715620011065762001106620010cb565b604051601f8201601f191681016001600160401b0381118282101715620011825762001182620010cb565b604052919050565b60005b83811015620011a75781810151838201526020016200118d565b50506000910152565b600082601f830112620011c257600080fd5b81516001600160401b03811115620011de57620011de620010cb565b620011f3601f8201601f191660200162001157565b8181528460208386010111156200120957600080fd5b6200121c8260208301602087016200118a565b949350505050565b805160ff811681146200123657600080fd5b919050565b80516001600160a01b03811681146200123657600080fd5b805180151581146200123657600080fd5b60006101008083850312156200127957600080fd5b604051908101906001600160401b03821181831017156200129e576200129e620010cb565b81604052809250620012b08462001253565b8152620012c06020850162001253565b6020820152620012d36040850162001253565b6040820152620012e66060850162001253565b6060820152620012f96080850162001253565b60808201526200130c60a0850162001253565b60a08201526200131f60c0850162001253565b60c08201526200133260e0850162001253565b60e0820152505092915050565b6000604082840312156200135257600080fd5b6200135c620010e1565b9050815181526020820151602082015292915050565b600060a082840312156200138557600080fd5b6200138f6200110c565b90506200139d83836200133f565b815260408201516020820152606082015160408201526080820151606082015292915050565b600082601f830112620013d557600080fd5b815160206001600160401b0380831115620013f457620013f4620010cb565b8260051b6200140583820162001157565b93845285810183019383810190888611156200142057600080fd5b84880192505b85831015620014d357825184811115620014405760008081fd5b880160a0818b03601f1901811315620014595760008081fd5b620014636200110c565b8783015187811115620014765760008081fd5b620014868d8a83870101620011b0565b8252506040620014998d8286016200133f565b89830152620014ab608085016200123b565b90820152620014bc83830162001253565b606082015284525050918401919084019062001426565b98975050505050505050565b600060a08284031215620014f257600080fd5b60405160a081016001600160401b0381118282101715620015175762001517620010cb565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526200154f6080840162001253565b60808201525092915050565b6000604082840312156200156e57600080fd5b62001578620010e1565b9050815181526200158c6020830162001253565b602082015292915050565b60008060408385031215620015ab57600080fd5b82516001600160401b0380821115620015c357600080fd5b908401906105608287031215620015d957600080fd5b620015e362001131565b825182811115620015f357600080fd5b6200160188828601620011b0565b8252506020830151828111156200161757600080fd5b6200162588828601620011b0565b602083015250620016396040840162001224565b60408201526200164c606084016200123b565b60608201526080830151608082015260a083015160a0820152620016748760c0850162001264565b60c08201526101c06200168a8882860162001264565b60e08301526200169f886102c0860162001372565b610100830152620016b461036085016200123b565b61012083015261038084015183811115620016ce57600080fd5b620016dc89828701620013c3565b610140840152506103a08401516101608301526103c08401516101808301526103e08401516101a08301526200171661040085016200123b565b908201526200172961042084016200123b565b6101e08201526200173e610440840162001253565b61020082015262001754876104608501620014df565b610220820152610500830151610240820152620017768761052085016200155b565b61026082015293506200178f915050602084016200123b565b90509250929050565b600060208284031215620017ab57600080fd5b620004f2826200123b565b60008151808452620017d08160208601602086016200118a565b601f01601f19169290920160200192915050565b6001600160a01b03169052565b80511515825260208101511515602083015260408101511515604083015260608101511515606083015260808101511515608083015260a08101516200183b60a084018215159052565b5060c08101516200185060c084018215159052565b5060e08101516200186560e084018215159052565b505050565b6200188082825180518252602090810151910152565b6020810151604083015260408101516060830152606081015160808301525050565b600081518084526020808501808196508360051b8101915082860160005b858110156200193b578284038952815160a08151818752620018e582880182620017b6565b91505086820151620019038888018280518252602090810151910152565b5060408201516001600160a01b03166060878101919091529091015115156080909501949094529784019790840190600101620018c0565b5091979650505050505050565b6040815260008351610560806040850152620019696105a0850183620017b6565b91506020860151603f1980868503016060870152620019898483620017b6565b935060408801519150620019a2608087018360ff169052565b60608801519150620019b860a0870183620017e4565b608088015160c087015260a088015160e087015260c08801519150610100620019e481880184620017f1565b60e08901519250610200620019fc81890185620017f1565b818a0151935062001a126103008901856200186a565b6101208a0151935062001a2a6103a0890185620017e4565b6101408a0151935082888703016103c089015262001a498685620018a2565b95506101608a01516103e08901526101808a01516104008901526101a08a01516104208901526101c08a0151935062001a87610440890185620017e4565b6101e08a0151935062001a9f610460890185620017e4565b890151801515610480890152925062001ab6915050565b5061022086015180516104a086015260208101516104c086015260408101516104e08601526060810151610500860152608081015115156105208601525061024086015161054085015261026086015162001b1f82860182805182526020908101511515910152565b505080915050620004f26020830184620017e4565b6000825162001b488184602087016200118a565b9190910192915050565b60006020828403121562001b6557600080fd5b81516001600160401b0381111562001b7c57600080fd5b6200121c84828501620011b0565b602081526000620004f26020830184620017b6565b60006020828403121562001bb257600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8181038181111562001bff57634e487b7160e01b600052601160045260246000fd5b92915050565b9182526001600160a01b0316602082015260400190565b61314d8062001c2c6000396000f3fe608060405234801561001057600080fd5b50600436106102675760003560e01c8063024c2ddd146103cb57806306fdde03146103f1578063095ea7b3146104065780630b285b1f1461042957806318160ddd146104555780631cd348c01461045d5780631ec9801d146104775780632150ec291461048257806323b872dd146104935780632a4a09dd146104a65780632d838119146104ae5780632ecaf675146104c157806330d08211146104c957806331392fcb146104d1578063313ce567146104e657806334f6ebf5146104ff57806338b9033314610507578063395093511461050f57806342966c68146105225780634fea2c7a146105355780635c975abb146105485780635f6529a31461055057806361086b00146105615780636303516c1461056957806370a082311461057a578063715018a61461058d5780637ebae80e146105955780638da5cb5b146105da578063936af911146105e257806394e10784146105f557806395d89b41146105fd57806397a9d560146106055780639af1d35a14610622578063a0712d6814610663578063a457c2d714610676578063a4e2d63414610689578063a8b0898214610691578063a9059cbb146106a2578063b17b658d146106b5578063b22941dd146106e1578063c45a015514610701578063ccfa214f14610712578063dd62ed3e146103cb578063eb8e886314610722578063efab831c1461072a578063f10437fc14610735578063f238cc6f14610740578063f2fde38b14610748578063f851a4401461075b578063fa86f8ce1461076c578063fb1eb14b14610774578063fd8191631461077c578063fe575a87146107c8575b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156102b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d59190612bc8565b6040516366ffd66360e11b8152600080356001600160e01b03191660048301529192506001600160a01b0383169063cdffacc690602401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190612bc8565b90506001600160a01b0381166103a45760405162461bcd60e51b8152602060048201526017602482015276119d5b98dd1a5bdb88191bd95cc81b9bdd08195e1a5cdd604a1b60448201526064015b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156103c5578184f35b8184fd5b005b6103de6103d9366004612be5565b6107f4565b6040519081526020015b60405180910390f35b6103f9610821565b6040516103e89190612c6e565b610419610414366004612c81565b6108b6565b60405190151581526020016103e8565b610419610437366004612cad565b6001600160a01b031660009081526012602052604090205460ff1690565b6015546103de565b601d546001600160a01b03165b6040516103e89190612cca565b60255460ff16610419565b600a546001600160a01b031661046a565b6104196104a1366004612cde565b6108cc565b600b546103de565b6103de6104bc366004612d1f565b610ba8565b6034546103de565b6026546103de565b6104d9610bf9565b6040516103e89190612d38565b601b5460ff165b60405160ff90911681526020016103e8565b61046a610c8c565b6001546103de565b61041961051d366004612c81565b610cff565b6103c9610530366004612d1f565b610e18565b6103c9610543366004612d1f565b610fca565b610419611212565b6030546001600160a01b031661046a565b6035546103de565b601e546001600160a01b031661046a565b6103de610588366004612cad565b611241565b6103c96112d0565b604080518082018252600080825260209182015281518083018352602e54808252602f5460ff16151591830191825283519081529051151591810191909152016103e8565b61046a611337565b6103c96105f0366004612dc1565b611346565b6103de6114f7565b6103f961151a565b61060d61152c565b604080519283526020830191909152016103e8565b61062a6116c6565b6040805182518051825260209081015181830152830151818301529082015160608083019190915290910151608082015260a0016103e8565b6103c9610671366004612d1f565b61170a565b610419610684366004612c81565b611746565b6104d961189f565b6023546001600160a01b031661046a565b6104196106b0366004612c81565b611932565b6104196106c3366004612cad565b6001600160a01b031660009081526018602052604090205460ff1690565b6106f46106ef366004612d1f565b611b5c565b6040516103e89190612e35565b601c546001600160a01b031661046a565b603654610100900460ff16610419565b600c546103de565b60365460ff16610419565b600d5460ff166104ed565b602d546103de565b6103c9610756366004612cad565b611c73565b6033546001600160a01b031661046a565b6024546103de565b6017546103de565b610784611d50565b6040516103e89190600060a0820190508251825260208301516020830152604083015160408301526060830151606083015260808301511515608083015292915050565b6104196107d6366004612cad565b6001600160a01b03166000908152601f602052604090205460ff1690565b6001600160a01b038083166000908152601160209081526040808320938516835292905220545b92915050565b60606001601801805461083390612e98565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90612e98565b80156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b60006108c3338484611e6c565b50600192915050565b601e54600090600160a81b900460ff1661091057601e805460ff60a81b1916600160a81b179055600061090085858561202b565b905061090c8184612ee8565b9250505b603654610100900460ff1615610a0e57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561096a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e9190612bc8565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b1580156109f557600080fd5b505af1158015610a09573d6000803e3d6000fd5b505050505b610a198484846121da565b6001600160a01b038416600090815260116020908152604080832033845290915290205482811015610a735760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640161039b565b6001600160a01b038516600090815260116020908152604080832033808552925290912054610aae918791610aa9908790612ee8565b611e6c565b601e805460ff60a81b19169055603654610100900460ff1615610b9b57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190612bc8565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401610b6893929190612efb565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050505b60019150505b9392505050565b601654600090821115610be35760405162461bcd60e51b815260206004820152600360248201526220a62960e91b604482015260640161039b565b6000610bed6114f7565b9050610ba18184612f1f565b610c01612af9565b5060408051610100808201835260025460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601c54604080516322d608f360e21b815290516000926001600160a01b031691638b5823cc9160048083019260209291908290030181865afa158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190612bc8565b905090565b603654600090610100900460ff1615610de257601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d809190612bc8565b6001600160a01b031663cf5961bb3385856040518463ffffffff1660e01b8152600401610daf93929190612efb565b600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b3360008181526011602090815260408083206001600160a01b03881684529091529020546108c391908590610aa9908690612f41565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee79190612bc8565b9050600080826001600160a01b031684604051602401610f0991815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b17905251610f3e9190612f54565b600060405180830381855af49150503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b509150915081610fc457604481511015610f9757600080fd5b80806020019051810190610fab9190612f86565b60405162461bcd60e51b815260040161039b9190612c6e565b50505050565b601c54602480546040516301e2e22f60e51b815260048101919091526000926001600160a01b031691633c5c45e09101602060405180830381865afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b9190612bc8565b9050336001600160a01b0382161461107a5760405162461bcd60e51b8152602060048201526002602482015261524160f01b604482015260640161039b565b61108c81611086611337565b846121da565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156110d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fa9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190612bc8565b9050600080826001600160a01b03168560405160240161117d91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b179052516111b29190612f54565b600060405180830381855af49150503d80600081146111ed576040519150601f19603f3d011682016040523d82523d6000602084013e6111f2565b606091505b50915091508161120b57604481511015610f9757600080fd5b5050505050565b600254600090600160301b900460ff16151581036112305750600090565b50601e54600160a01b900460ff1690565b60025460009062010000900460ff16156112b4576001600160a01b03821660009081526012602052604090205460ff161561129257506001600160a01b031660009081526010602052604090205490565b6001600160a01b0382166000908152600f602052604090205461081b90610ba8565b506001600160a01b031660009081526010602052604090205490565b336112d9611337565b6001600160a01b0316146112ff5760405162461bcd60e51b815260040161039b90613027565b600080546040516001600160a01b03909116906000805160206130d8833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b603654610100900460ff1661135a57600080fd5b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156113a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c89190612bc8565b6001600160a01b0316336001600160a01b03161461140e5760405162461bcd60e51b81526020600482015260036024820152621313d360ea1b604482015260640161039b565b60005b818110156114f2576114e083838381811061142e5761142e61305c565b90506020020160208101906114439190612cad565b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b19190612bc8565b6114db8686868181106114c6576114c661305c565b90506020020160208101906105889190612cad565b6121da565b806114ea81613072565b915050611411565b505050565b600080600061150461152c565b90925090506115138183612f1f565b9250505090565b60606001601901805461083390612e98565b6016546015546000918291825b60135481101561169457826001600e016000600160120184815481106115615761156161305c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806115d25750816001600f016000600160120184815481106115ab576115ab61305c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156115e95750506016546015549094909350915050565b60138054600f91600091849081106116035761160361305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116329084612ee8565b92506001600f016000600160120183815481106116515761165161305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116809083612ee8565b91508061168c81613072565b915050611539565b506015546016546116a59190612f1f565b8210156116bd57505060165460155490939092509050565b90939092509050565b6116ce612b3d565b506040805160c0810182526004546080820190815260055460a08301528152600654602082015260075491810191909152600854606082015290565b33611713611337565b6001600160a01b0316146117395760405162461bcd60e51b815260040161039b90613027565b61174333826126f7565b50565b603654600090610100900460ff161561182957601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190612bc8565b6001600160a01b031663568c75a93385856040518463ffffffff1660e01b81526004016117f693929190612efb565b600060405180830381600087803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b505050505b3360009081526011602090815260408083206001600160a01b0387168452909152902054828110156118865760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a12d60e11b604082015260600190565b6118953385610aa98685612ee8565b5060019392505050565b6118a7612af9565b5060408051610100808201835260035460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601e54600090600160a81b900460ff1661197c57601e805460ff60a81b1916600160a81b179055600061196c6119653390565b858561202b565b90506119788184612ee8565b9250505b603654610100900460ff1615611a5c57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156119d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612bc8565b6001600160a01b0316631ffb811f3385856040518463ffffffff1660e01b8152600401611a2993929190612efb565b600060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b505050505b611a673384846121da565b601e805460ff60a81b19169055603654610100900460ff16156108c357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af29190612bc8565b6001600160a01b031663f49062ca3385856040518463ffffffff1660e01b8152600401611b2193929190612efb565b600060405180830381600087803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b5050505050600192915050565b611b64612b6b565b6009805483908110611b7857611b7861305c565b9060005260206000209060040201604051806080016040529081600082018054611ba190612e98565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcd90612e98565b8015611c1a5780601f10611bef57610100808354040283529160200191611c1a565b820191906000526020600020905b815481529060010190602001808311611bfd57829003601f168201915b50505091835250506040805180820182526001840154815260028401546020808301919091528301526003909201546001600160a01b03811692820192909252600160a01b90910460ff16151560609091015292915050565b33611c7c611337565b6001600160a01b031614611ca25760405162461bcd60e51b815260040161039b90613027565b6001600160a01b038116611d075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161039b565b600080546040516001600160a01b03808516939216916000805160206130d883398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611d846040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b506040805160a0810182526027548152602854602082015260295491810191909152602a546060820152602b5460ff161515608082015290565b6000808060001985870985870292508281108382030391505080600003611df75760008411611dec57600080fd5b508290049050610ba1565b808411611e0357600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b038316611eab5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b038216611eea5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff1615611fca57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f689190612bc8565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b8152600401611f9793929190612efb565b600060405180830381600087803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121099190612bc8565b9050600080826001600160a01b031687878760405160240161212d93929190612efb565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b179052516121629190612f54565b600060405180830381855af49150503d806000811461219d576040519150601f19603f3d011682016040523d82523d6000602084013e6121a2565b606091505b5091509150816121bb57604481511015610f9757600080fd5b808060200190518101906121cf919061308b565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122489190612bc8565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a99190612bc8565b60255490915060ff1680156122c05750602b5460ff165b80156122e457506001600160a01b03841660009081526018602052604090205460ff165b1561239a57600080826001600160a01b031684866040516024016123099291906130a4565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525161233e9190612f54565b600060405180830381855af49150503d8060008114612379576040519150601f19603f3d011682016040523d82523d6000602084013e61237e565b606091505b50915091508161239757604481511015610f9757600080fd5b50505b600254600160381b900460ff1680156123cb57506001600160a01b03841660009081526018602052604090205460ff165b1561248157600080826001600160a01b031684866040516024016123f09291906130a4565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b179052516124259190612f54565b600060405180830381855af49150503d8060008114612460576040519150601f19603f3d011682016040523d82523d6000602084013e612465565b606091505b50915091508161247e57604481511015610f9757600080fd5b50505b60255460ff1680156124955750602f5460ff165b80156124b957506001600160a01b03841660009081526018602052604090205460ff165b1561256d57600080826001600160a01b0316856040516024016124dc9190612cca565b60408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b179052516125119190612f54565b600060405180830381855af49150503d806000811461254c576040519150601f19603f3d011682016040523d82523d6000602084013e612551565b606091505b50915091508161256a57604481511015610f9757600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156125b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125db9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612bc8565b9050600080826001600160a01b031687878760405160240161266093929190612efb565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b179052516126959190612f54565b600060405180830381855af49150503d80600081146126d0576040519150601f19603f3d011682016040523d82523d6000602084013e6126d5565b606091505b5091509150816126ee57604481511015610f9757600080fd5b50505050505050565b6001600160a01b0382166127335760405162461bcd60e51b815260206004820152600360248201526222a6ad60e91b604482015260640161039b565b600254600160281b900460ff1661275c5760405162461bcd60e51b815260040161039b906130bb565b60025462010000900460ff16156127855760405162461bcd60e51b815260040161039b906130bb565b603654610100900460ff161561286757601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156127df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128039190612bc8565b6040516218a28b60e61b81526001600160a01b038481166004830152602482018490529190911690630628a2c090604401600060405180830381600087803b15801561284e57600080fd5b505af1158015612862573d6000803e3d6000fd5b505050505b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156128b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d59190612bc8565b905060006129a683836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561291b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293f919061308b565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a1919061308b565b611dbe565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0c9190612bc8565b90508360016014016000828254612a239190612f41565b90915550506001600160a01b03811660009081526010602052604081208054849290612a50908490612f41565b90915550612a6090508285612ee8565b6001600160a01b03861660009081526010602052604081208054909190612a88908490612f41565b90915550506040518281526001600160a01b038216906000906000805160206130f88339815191529060200160405180910390a36001600160a01b03851660006000805160206130f8833981519152612ae18588612ee8565b60405190815260200160405180910390a35050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040518060800160405280612b50612b99565b81526020016000815260200160008152602001600081525090565b604051806080016040528060608152602001612b85612b99565b815260006020820181905260409091015290565b604051806040016040528060008152602001600081525090565b6001600160a01b038116811461174357600080fd5b600060208284031215612bda57600080fd5b8151610ba181612bb3565b60008060408385031215612bf857600080fd5b8235612c0381612bb3565b91506020830135612c1381612bb3565b809150509250929050565b60005b83811015612c39578181015183820152602001612c21565b50506000910152565b60008151808452612c5a816020860160208601612c1e565b601f01601f19169290920160200192915050565b602081526000610ba16020830184612c42565b60008060408385031215612c9457600080fd5b8235612c9f81612bb3565b946020939093013593505050565b600060208284031215612cbf57600080fd5b8135610ba181612bb3565b6001600160a01b0391909116815260200190565b600080600060608486031215612cf357600080fd5b8335612cfe81612bb3565b92506020840135612d0e81612bb3565b929592945050506040919091013590565b600060208284031215612d3157600080fd5b5035919050565b6000610100820190508251151582526020830151151560208301526040830151151560408301526060830151151560608301526080830151612d7e608084018215159052565b5060a0830151612d9260a084018215159052565b5060c0830151612da660c084018215159052565b5060e0830151612dba60e084018215159052565b5092915050565b60008060208385031215612dd457600080fd5b82356001600160401b0380821115612deb57600080fd5b818501915085601f830112612dff57600080fd5b813581811115612e0e57600080fd5b8660208260051b8501011115612e2357600080fd5b60209290920196919550909350505050565b602081526000825160a06020840152612e5160c0840182612c42565b90506020840151612e6f604085018280518252602090810151910152565b5060408401516001600160a01b03166080840152606090930151151560a0909201919091525090565b600181811c90821680612eac57607f821691505b602082108103612ecc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081b5761081b612ed2565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600082612f3c57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561081b5761081b612ed2565b60008251612f66818460208701612c1e565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612f9857600080fd5b81516001600160401b0380821115612faf57600080fd5b818401915084601f830112612fc357600080fd5b815181811115612fd557612fd5612f70565b604051601f8201601f19908116603f01168101908382118183101715612ffd57612ffd612f70565b8160405282815287602084870101111561301657600080fd5b6121cf836020830160208801612c1e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161308457613084612ed2565b5060010190565b60006020828403121561309d57600080fd5b5051919050565b9182526001600160a01b0316602082015260400190565b6020808252600290820152614e4d60f01b60408201526060019056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a4e40b9641135954640ca80aed2c263d55c040dd710d9766ebe710002ab0c21364736f6c634300081100338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212207356fbbf9d0950768419c65b7aff4c4808182f84ec021795fb44e654719eca6d64736f6c63430008110033000000000000000000000000b7084866b70adad518b8fcf5aa6ada89e46e75c4000000000000000000000000c9488826316d27dd9ee16ee8141124871f2bda56
Deployed Bytecode
0x608060405260043610620000685760003560e01c806323581413146200006d57806338b9033314620000ac578063715018a614620000d35780638da5cb5b14620000ed578063a4f1c9461462000105578063c07d1129146200011c578063f2fde38b146200013e575b600080fd5b3480156200007a57600080fd5b506002546200008f906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620000b957600080fd5b50620000c460015481565b604051908152602001620000a3565b348015620000e057600080fd5b50620000eb62000163565b005b348015620000fa57600080fd5b506200008f620001d9565b6200008f620001163660046200057e565b620001e8565b3480156200012957600080fd5b506003546200008f906001600160a01b031681565b3480156200014b57600080fd5b50620000eb6200015d366004620005ee565b6200047e565b336200016e620001d9565b6001600160a01b031614620001a05760405162461bcd60e51b815260040162000197906200060e565b60405180910390fd5b600080546040516001600160a01b0390911690600080516020620058d5833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b60035460408051636dbe684f60e11b815290516000926001600160a01b03169163db7cd09e9160048083019260209291908290030181865afa15801562000233573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000259919062000643565b3414620002975760405162461bcd60e51b815260206004820152600b60248201526a119151481393d50813515560aa1b604482015260640162000197565b600360009054906101000a90046001600160a01b03166001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002eb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031191906200065d565b6001600160a01b03166108fc600360009054906101000a90046001600160a01b03166001600160a01b031663db7cd09e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000371573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000397919062000643565b6040518115909202916000818181858888f19350505050158015620003c0573d6000803e3d6000fd5b5060025460405160009184916001600160a01b0390911690620003e39062000563565b620003f092919062000934565b604051809103906000f0801580156200040d573d6000803e3d6000fd5b50600254604051634739f7e560e01b81523360048201526001600160a01b038084166024830152929350911690634739f7e590604401600060405180830381600087803b1580156200045e57600080fd5b505af115801562000473573d6000803e3d6000fd5b509295945050505050565b3362000489620001d9565b6001600160a01b031614620004b25760405162461bcd60e51b815260040162000197906200060e565b6001600160a01b038116620005195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000197565b600080546040516001600160a01b0380851693921691600080516020620058d583398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b614d798062000b5c83390190565b6001600160a01b03169052565b6000602082840312156200059157600080fd5b81356001600160401b03811115620005a857600080fd5b82016105608185031215620005bc57600080fd5b9392505050565b6001600160a01b0381168114620005d957600080fd5b50565b8035620005e981620005c3565b919050565b6000602082840312156200060157600080fd5b8135620005bc81620005c3565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156200065657600080fd5b5051919050565b6000602082840312156200067057600080fd5b8151620005bc81620005c3565b6000808335601e198436030181126200069557600080fd5b83016020810192503590506001600160401b03811115620006b557600080fd5b803603821315620006c557600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b803560ff81168114620005e957600080fd5b80358015158114620005e957600080fd5b620007238162000707565b15158252620007356020820162000707565b151560208301526200074a6040820162000707565b151560408301526200075f6060820162000707565b15156060830152620007746080820162000707565b151560808301526200078960a0820162000707565b151560a08301526200079e60c0820162000707565b151560c0830152620007b360e0820162000707565b80151560e0840152505050565b6000808335601e19843603018112620007d857600080fd5b83016020810192503590506001600160401b03811115620007f857600080fd5b8060051b3603821315620006c557600080fd5b81835260006020808501808196508560051b81019150846000805b88811015620008ce578385038a528235609e1989360301811262000848578283fd5b880160a06200085882806200067d565b8289526200086a838a018284620006cc565b925050506200088788880189840180358252602090810135910152565b6060808301356200089881620005c3565b6001600160a01b0316908801526080620008b483820162000707565b151597019690965250988501989185019160010162000826565b509298975050505050505050565b803582526020810135602083015260408101356040830152606081013560608301526200090c6080820162000707565b151560808301525050565b80358252620009296020820162000707565b151560208301525050565b6040815260006200094684856200067d565b610560806040860152620009606105a086018385620006cc565b92506200097160208801886200067d565b9250603f19808786030160608801526200098d858584620006cc565b94506200099d60408a01620006f5565b60ff811660808901529350620009b660608a01620005dc565b9350620009c760a088018562000571565b608089013560c088015260a089013560e0880152620009ee610100880160c08b0162000718565b62000a0261020088016101c08b0162000718565b62000a4061030088016102c08b0180358252602080820135908301526040810135604083015260608101356060830152608081013560808301525050565b62000a4f6103608a01620005dc565b93506103a0915062000a648288018562000571565b62000a746103808a018a620007c0565b94506103c08289880301818a015262000a8f8787846200080b565b96506103e09550838b0135868a01526104009350808b0135848a0152505050610420838901358188015262000ac6828a01620005dc565b9350610440915062000adb8288018562000571565b62000ae8818a01620005dc565b93505061046062000afc8188018562000571565b62000b09828a0162000707565b801515610480890152935062000b266104a08801828b01620008dc565b505061050087013561054086015262000b46818601610520890162000917565b505080915050620005bc60208301846200057156fe60806040523480156200001157600080fd5b5060405162004d7938038062004d79833981016040819052620000349162001597565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000816001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000dc919062001798565b6001600160a01b0316630ef73d2c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000140919062001798565b9050600080826001600160a01b031685856040516024016200016492919062001948565b60408051601f198184030181529181526020820180516001600160e01b0316633c74db8560e11b179052516200019b919062001b34565b600060405180830381855af49150503d8060008114620001d8576040519150601f19603f3d011682016040523d82523d6000602084013e620001dd565b606091505b5091509150816200023257604481511015620001f857600080fd5b808060200190518101906200020e919062001b52565b60405162461bcd60e51b815260040162000229919062001b8a565b60405180910390fd5b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156200027d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a3919062001798565b905060006200038b8760800151836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000315919062001b9f565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037a919062001b9f565b6200044160201b62001dbe1760201c565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f4919062001798565b90506200040d88606001513384620004f960201b60201c565b601e805460ff60a81b1916600160a81b179055606088015162000432908284620006c4565b50505050505050505062001c1c565b60008080600019858709858702925082811083820303915050806000036200047d57600084116200047157600080fd5b508290049050620004f2565b8084116200048a57600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6001600160a01b0383166200053a5760405162461bcd60e51b8152600401620002299060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b0382166200057b5760405162461bcd60e51b8152600401620002299060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff16156200066357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015620005d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005fd919062001798565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b81526004016200062e9392919062001bb9565b600060405180830381600087803b1580156200064957600080fd5b505af11580156200065e573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601e54600090600160a81b900460ff166200070d57601e805460ff60a81b1916600160a81b1790556000620006fb858585620009b9565b905062000709818462001bdd565b9250505b603654610100900460ff16156200081157601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801562000769573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200078f919062001798565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b158015620007f757600080fd5b505af11580156200080c573d6000803e3d6000fd5b505050505b6200081e84848462000b78565b6001600160a01b0384166000908152601160209081526040808320338452909152902054828110156200087a5760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640162000229565b6001600160a01b038516600090815260116020908152604080832033808552925290912054620008b9918791620008b390879062001bdd565b620004f9565b601e805460ff60a81b19169055603654610100900460ff1615620009ae57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801562000922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000948919062001798565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401620009799392919062001bb9565b600060405180830381600087803b1580156200099457600080fd5b505af1158015620009a9573d6000803e3d6000fd5b505050505b506001949350505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a13573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a39919062001798565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a9d919062001798565b9050600080826001600160a01b031687878760405160240162000ac39392919062001bb9565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b1790525162000afa919062001b34565b600060405180830381855af49150503d806000811462000b37576040519150601f19603f3d011682016040523d82523d6000602084013e62000b3c565b606091505b50915091508162000b5757604481511015620001f857600080fd5b8080602001905181019062000b6d919062001b9f565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa15801562000bc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000be9919062001798565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c27573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c4d919062001798565b60255490915060ff16801562000c655750602b5460ff165b801562000c8a57506001600160a01b03841660009081526018602052604090205460ff165b1562000d4957600080826001600160a01b0316848660405160240162000cb292919062001c05565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525162000ce9919062001b34565b600060405180830381855af49150503d806000811462000d26576040519150601f19603f3d011682016040523d82523d6000602084013e62000d2b565b606091505b50915091508162000d4657604481511015620001f857600080fd5b50505b600254670100000000000000900460ff16801562000d7f57506001600160a01b03841660009081526018602052604090205460ff165b1562000e3e57600080826001600160a01b0316848660405160240162000da792919062001c05565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b1790525162000dde919062001b34565b600060405180830381855af49150503d806000811462000e1b576040519150601f19603f3d011682016040523d82523d6000602084013e62000e20565b606091505b50915091508162000e3b57604481511015620001f857600080fd5b50505b60255460ff16801562000e535750602f5460ff165b801562000e7857506001600160a01b03841660009081526018602052604090205460ff165b1562000f33576040516001600160a01b038481166024830152600091829184169060440160408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b1790525162000ed3919062001b34565b600060405180830381855af49150503d806000811462000f10576040519150601f19603f3d011682016040523d82523d6000602084013e62000f15565b606091505b50915091508162000f3057604481511015620001f857600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa15801562000f7e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fa4919062001798565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001008919062001798565b9050600080826001600160a01b03168787876040516024016200102e9392919062001bb9565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b1790525162001065919062001b34565b600060405180830381855af49150503d8060008114620010a2576040519150601f19603f3d011682016040523d82523d6000602084013e620010a7565b606091505b509150915081620010c257604481511015620001f857600080fd5b50505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620011065762001106620010cb565b60405290565b604051608081016001600160401b0381118282101715620011065762001106620010cb565b60405161028081016001600160401b0381118282101715620011065762001106620010cb565b604051601f8201601f191681016001600160401b0381118282101715620011825762001182620010cb565b604052919050565b60005b83811015620011a75781810151838201526020016200118d565b50506000910152565b600082601f830112620011c257600080fd5b81516001600160401b03811115620011de57620011de620010cb565b620011f3601f8201601f191660200162001157565b8181528460208386010111156200120957600080fd5b6200121c8260208301602087016200118a565b949350505050565b805160ff811681146200123657600080fd5b919050565b80516001600160a01b03811681146200123657600080fd5b805180151581146200123657600080fd5b60006101008083850312156200127957600080fd5b604051908101906001600160401b03821181831017156200129e576200129e620010cb565b81604052809250620012b08462001253565b8152620012c06020850162001253565b6020820152620012d36040850162001253565b6040820152620012e66060850162001253565b6060820152620012f96080850162001253565b60808201526200130c60a0850162001253565b60a08201526200131f60c0850162001253565b60c08201526200133260e0850162001253565b60e0820152505092915050565b6000604082840312156200135257600080fd5b6200135c620010e1565b9050815181526020820151602082015292915050565b600060a082840312156200138557600080fd5b6200138f6200110c565b90506200139d83836200133f565b815260408201516020820152606082015160408201526080820151606082015292915050565b600082601f830112620013d557600080fd5b815160206001600160401b0380831115620013f457620013f4620010cb565b8260051b6200140583820162001157565b93845285810183019383810190888611156200142057600080fd5b84880192505b85831015620014d357825184811115620014405760008081fd5b880160a0818b03601f1901811315620014595760008081fd5b620014636200110c565b8783015187811115620014765760008081fd5b620014868d8a83870101620011b0565b8252506040620014998d8286016200133f565b89830152620014ab608085016200123b565b90820152620014bc83830162001253565b606082015284525050918401919084019062001426565b98975050505050505050565b600060a08284031215620014f257600080fd5b60405160a081016001600160401b0381118282101715620015175762001517620010cb565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526200154f6080840162001253565b60808201525092915050565b6000604082840312156200156e57600080fd5b62001578620010e1565b9050815181526200158c6020830162001253565b602082015292915050565b60008060408385031215620015ab57600080fd5b82516001600160401b0380821115620015c357600080fd5b908401906105608287031215620015d957600080fd5b620015e362001131565b825182811115620015f357600080fd5b6200160188828601620011b0565b8252506020830151828111156200161757600080fd5b6200162588828601620011b0565b602083015250620016396040840162001224565b60408201526200164c606084016200123b565b60608201526080830151608082015260a083015160a0820152620016748760c0850162001264565b60c08201526101c06200168a8882860162001264565b60e08301526200169f886102c0860162001372565b610100830152620016b461036085016200123b565b61012083015261038084015183811115620016ce57600080fd5b620016dc89828701620013c3565b610140840152506103a08401516101608301526103c08401516101808301526103e08401516101a08301526200171661040085016200123b565b908201526200172961042084016200123b565b6101e08201526200173e610440840162001253565b61020082015262001754876104608501620014df565b610220820152610500830151610240820152620017768761052085016200155b565b61026082015293506200178f915050602084016200123b565b90509250929050565b600060208284031215620017ab57600080fd5b620004f2826200123b565b60008151808452620017d08160208601602086016200118a565b601f01601f19169290920160200192915050565b6001600160a01b03169052565b80511515825260208101511515602083015260408101511515604083015260608101511515606083015260808101511515608083015260a08101516200183b60a084018215159052565b5060c08101516200185060c084018215159052565b5060e08101516200186560e084018215159052565b505050565b6200188082825180518252602090810151910152565b6020810151604083015260408101516060830152606081015160808301525050565b600081518084526020808501808196508360051b8101915082860160005b858110156200193b578284038952815160a08151818752620018e582880182620017b6565b91505086820151620019038888018280518252602090810151910152565b5060408201516001600160a01b03166060878101919091529091015115156080909501949094529784019790840190600101620018c0565b5091979650505050505050565b6040815260008351610560806040850152620019696105a0850183620017b6565b91506020860151603f1980868503016060870152620019898483620017b6565b935060408801519150620019a2608087018360ff169052565b60608801519150620019b860a0870183620017e4565b608088015160c087015260a088015160e087015260c08801519150610100620019e481880184620017f1565b60e08901519250610200620019fc81890185620017f1565b818a0151935062001a126103008901856200186a565b6101208a0151935062001a2a6103a0890185620017e4565b6101408a0151935082888703016103c089015262001a498685620018a2565b95506101608a01516103e08901526101808a01516104008901526101a08a01516104208901526101c08a0151935062001a87610440890185620017e4565b6101e08a0151935062001a9f610460890185620017e4565b890151801515610480890152925062001ab6915050565b5061022086015180516104a086015260208101516104c086015260408101516104e08601526060810151610500860152608081015115156105208601525061024086015161054085015261026086015162001b1f82860182805182526020908101511515910152565b505080915050620004f26020830184620017e4565b6000825162001b488184602087016200118a565b9190910192915050565b60006020828403121562001b6557600080fd5b81516001600160401b0381111562001b7c57600080fd5b6200121c84828501620011b0565b602081526000620004f26020830184620017b6565b60006020828403121562001bb257600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8181038181111562001bff57634e487b7160e01b600052601160045260246000fd5b92915050565b9182526001600160a01b0316602082015260400190565b61314d8062001c2c6000396000f3fe608060405234801561001057600080fd5b50600436106102675760003560e01c8063024c2ddd146103cb57806306fdde03146103f1578063095ea7b3146104065780630b285b1f1461042957806318160ddd146104555780631cd348c01461045d5780631ec9801d146104775780632150ec291461048257806323b872dd146104935780632a4a09dd146104a65780632d838119146104ae5780632ecaf675146104c157806330d08211146104c957806331392fcb146104d1578063313ce567146104e657806334f6ebf5146104ff57806338b9033314610507578063395093511461050f57806342966c68146105225780634fea2c7a146105355780635c975abb146105485780635f6529a31461055057806361086b00146105615780636303516c1461056957806370a082311461057a578063715018a61461058d5780637ebae80e146105955780638da5cb5b146105da578063936af911146105e257806394e10784146105f557806395d89b41146105fd57806397a9d560146106055780639af1d35a14610622578063a0712d6814610663578063a457c2d714610676578063a4e2d63414610689578063a8b0898214610691578063a9059cbb146106a2578063b17b658d146106b5578063b22941dd146106e1578063c45a015514610701578063ccfa214f14610712578063dd62ed3e146103cb578063eb8e886314610722578063efab831c1461072a578063f10437fc14610735578063f238cc6f14610740578063f2fde38b14610748578063f851a4401461075b578063fa86f8ce1461076c578063fb1eb14b14610774578063fd8191631461077c578063fe575a87146107c8575b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156102b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d59190612bc8565b6040516366ffd66360e11b8152600080356001600160e01b03191660048301529192506001600160a01b0383169063cdffacc690602401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190612bc8565b90506001600160a01b0381166103a45760405162461bcd60e51b8152602060048201526017602482015276119d5b98dd1a5bdb88191bd95cc81b9bdd08195e1a5cdd604a1b60448201526064015b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156103c5578184f35b8184fd5b005b6103de6103d9366004612be5565b6107f4565b6040519081526020015b60405180910390f35b6103f9610821565b6040516103e89190612c6e565b610419610414366004612c81565b6108b6565b60405190151581526020016103e8565b610419610437366004612cad565b6001600160a01b031660009081526012602052604090205460ff1690565b6015546103de565b601d546001600160a01b03165b6040516103e89190612cca565b60255460ff16610419565b600a546001600160a01b031661046a565b6104196104a1366004612cde565b6108cc565b600b546103de565b6103de6104bc366004612d1f565b610ba8565b6034546103de565b6026546103de565b6104d9610bf9565b6040516103e89190612d38565b601b5460ff165b60405160ff90911681526020016103e8565b61046a610c8c565b6001546103de565b61041961051d366004612c81565b610cff565b6103c9610530366004612d1f565b610e18565b6103c9610543366004612d1f565b610fca565b610419611212565b6030546001600160a01b031661046a565b6035546103de565b601e546001600160a01b031661046a565b6103de610588366004612cad565b611241565b6103c96112d0565b604080518082018252600080825260209182015281518083018352602e54808252602f5460ff16151591830191825283519081529051151591810191909152016103e8565b61046a611337565b6103c96105f0366004612dc1565b611346565b6103de6114f7565b6103f961151a565b61060d61152c565b604080519283526020830191909152016103e8565b61062a6116c6565b6040805182518051825260209081015181830152830151818301529082015160608083019190915290910151608082015260a0016103e8565b6103c9610671366004612d1f565b61170a565b610419610684366004612c81565b611746565b6104d961189f565b6023546001600160a01b031661046a565b6104196106b0366004612c81565b611932565b6104196106c3366004612cad565b6001600160a01b031660009081526018602052604090205460ff1690565b6106f46106ef366004612d1f565b611b5c565b6040516103e89190612e35565b601c546001600160a01b031661046a565b603654610100900460ff16610419565b600c546103de565b60365460ff16610419565b600d5460ff166104ed565b602d546103de565b6103c9610756366004612cad565b611c73565b6033546001600160a01b031661046a565b6024546103de565b6017546103de565b610784611d50565b6040516103e89190600060a0820190508251825260208301516020830152604083015160408301526060830151606083015260808301511515608083015292915050565b6104196107d6366004612cad565b6001600160a01b03166000908152601f602052604090205460ff1690565b6001600160a01b038083166000908152601160209081526040808320938516835292905220545b92915050565b60606001601801805461083390612e98565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90612e98565b80156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b60006108c3338484611e6c565b50600192915050565b601e54600090600160a81b900460ff1661091057601e805460ff60a81b1916600160a81b179055600061090085858561202b565b905061090c8184612ee8565b9250505b603654610100900460ff1615610a0e57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561096a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e9190612bc8565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b1580156109f557600080fd5b505af1158015610a09573d6000803e3d6000fd5b505050505b610a198484846121da565b6001600160a01b038416600090815260116020908152604080832033845290915290205482811015610a735760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640161039b565b6001600160a01b038516600090815260116020908152604080832033808552925290912054610aae918791610aa9908790612ee8565b611e6c565b601e805460ff60a81b19169055603654610100900460ff1615610b9b57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190612bc8565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401610b6893929190612efb565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050505b60019150505b9392505050565b601654600090821115610be35760405162461bcd60e51b815260206004820152600360248201526220a62960e91b604482015260640161039b565b6000610bed6114f7565b9050610ba18184612f1f565b610c01612af9565b5060408051610100808201835260025460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601c54604080516322d608f360e21b815290516000926001600160a01b031691638b5823cc9160048083019260209291908290030181865afa158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190612bc8565b905090565b603654600090610100900460ff1615610de257601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d809190612bc8565b6001600160a01b031663cf5961bb3385856040518463ffffffff1660e01b8152600401610daf93929190612efb565b600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b3360008181526011602090815260408083206001600160a01b03881684529091529020546108c391908590610aa9908690612f41565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee79190612bc8565b9050600080826001600160a01b031684604051602401610f0991815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b17905251610f3e9190612f54565b600060405180830381855af49150503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b509150915081610fc457604481511015610f9757600080fd5b80806020019051810190610fab9190612f86565b60405162461bcd60e51b815260040161039b9190612c6e565b50505050565b601c54602480546040516301e2e22f60e51b815260048101919091526000926001600160a01b031691633c5c45e09101602060405180830381865afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b9190612bc8565b9050336001600160a01b0382161461107a5760405162461bcd60e51b8152602060048201526002602482015261524160f01b604482015260640161039b565b61108c81611086611337565b846121da565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156110d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fa9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190612bc8565b9050600080826001600160a01b03168560405160240161117d91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b179052516111b29190612f54565b600060405180830381855af49150503d80600081146111ed576040519150601f19603f3d011682016040523d82523d6000602084013e6111f2565b606091505b50915091508161120b57604481511015610f9757600080fd5b5050505050565b600254600090600160301b900460ff16151581036112305750600090565b50601e54600160a01b900460ff1690565b60025460009062010000900460ff16156112b4576001600160a01b03821660009081526012602052604090205460ff161561129257506001600160a01b031660009081526010602052604090205490565b6001600160a01b0382166000908152600f602052604090205461081b90610ba8565b506001600160a01b031660009081526010602052604090205490565b336112d9611337565b6001600160a01b0316146112ff5760405162461bcd60e51b815260040161039b90613027565b600080546040516001600160a01b03909116906000805160206130d8833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b603654610100900460ff1661135a57600080fd5b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156113a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c89190612bc8565b6001600160a01b0316336001600160a01b03161461140e5760405162461bcd60e51b81526020600482015260036024820152621313d360ea1b604482015260640161039b565b60005b818110156114f2576114e083838381811061142e5761142e61305c565b90506020020160208101906114439190612cad565b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b19190612bc8565b6114db8686868181106114c6576114c661305c565b90506020020160208101906105889190612cad565b6121da565b806114ea81613072565b915050611411565b505050565b600080600061150461152c565b90925090506115138183612f1f565b9250505090565b60606001601901805461083390612e98565b6016546015546000918291825b60135481101561169457826001600e016000600160120184815481106115615761156161305c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806115d25750816001600f016000600160120184815481106115ab576115ab61305c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156115e95750506016546015549094909350915050565b60138054600f91600091849081106116035761160361305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116329084612ee8565b92506001600f016000600160120183815481106116515761165161305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116809083612ee8565b91508061168c81613072565b915050611539565b506015546016546116a59190612f1f565b8210156116bd57505060165460155490939092509050565b90939092509050565b6116ce612b3d565b506040805160c0810182526004546080820190815260055460a08301528152600654602082015260075491810191909152600854606082015290565b33611713611337565b6001600160a01b0316146117395760405162461bcd60e51b815260040161039b90613027565b61174333826126f7565b50565b603654600090610100900460ff161561182957601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190612bc8565b6001600160a01b031663568c75a93385856040518463ffffffff1660e01b81526004016117f693929190612efb565b600060405180830381600087803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b505050505b3360009081526011602090815260408083206001600160a01b0387168452909152902054828110156118865760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a12d60e11b604082015260600190565b6118953385610aa98685612ee8565b5060019392505050565b6118a7612af9565b5060408051610100808201835260035460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601e54600090600160a81b900460ff1661197c57601e805460ff60a81b1916600160a81b179055600061196c6119653390565b858561202b565b90506119788184612ee8565b9250505b603654610100900460ff1615611a5c57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156119d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612bc8565b6001600160a01b0316631ffb811f3385856040518463ffffffff1660e01b8152600401611a2993929190612efb565b600060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b505050505b611a673384846121da565b601e805460ff60a81b19169055603654610100900460ff16156108c357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af29190612bc8565b6001600160a01b031663f49062ca3385856040518463ffffffff1660e01b8152600401611b2193929190612efb565b600060405180830381600087803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b5050505050600192915050565b611b64612b6b565b6009805483908110611b7857611b7861305c565b9060005260206000209060040201604051806080016040529081600082018054611ba190612e98565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcd90612e98565b8015611c1a5780601f10611bef57610100808354040283529160200191611c1a565b820191906000526020600020905b815481529060010190602001808311611bfd57829003601f168201915b50505091835250506040805180820182526001840154815260028401546020808301919091528301526003909201546001600160a01b03811692820192909252600160a01b90910460ff16151560609091015292915050565b33611c7c611337565b6001600160a01b031614611ca25760405162461bcd60e51b815260040161039b90613027565b6001600160a01b038116611d075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161039b565b600080546040516001600160a01b03808516939216916000805160206130d883398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611d846040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b506040805160a0810182526027548152602854602082015260295491810191909152602a546060820152602b5460ff161515608082015290565b6000808060001985870985870292508281108382030391505080600003611df75760008411611dec57600080fd5b508290049050610ba1565b808411611e0357600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b038316611eab5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b038216611eea5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff1615611fca57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f689190612bc8565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b8152600401611f9793929190612efb565b600060405180830381600087803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121099190612bc8565b9050600080826001600160a01b031687878760405160240161212d93929190612efb565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b179052516121629190612f54565b600060405180830381855af49150503d806000811461219d576040519150601f19603f3d011682016040523d82523d6000602084013e6121a2565b606091505b5091509150816121bb57604481511015610f9757600080fd5b808060200190518101906121cf919061308b565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122489190612bc8565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a99190612bc8565b60255490915060ff1680156122c05750602b5460ff165b80156122e457506001600160a01b03841660009081526018602052604090205460ff165b1561239a57600080826001600160a01b031684866040516024016123099291906130a4565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525161233e9190612f54565b600060405180830381855af49150503d8060008114612379576040519150601f19603f3d011682016040523d82523d6000602084013e61237e565b606091505b50915091508161239757604481511015610f9757600080fd5b50505b600254600160381b900460ff1680156123cb57506001600160a01b03841660009081526018602052604090205460ff165b1561248157600080826001600160a01b031684866040516024016123f09291906130a4565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b179052516124259190612f54565b600060405180830381855af49150503d8060008114612460576040519150601f19603f3d011682016040523d82523d6000602084013e612465565b606091505b50915091508161247e57604481511015610f9757600080fd5b50505b60255460ff1680156124955750602f5460ff165b80156124b957506001600160a01b03841660009081526018602052604090205460ff165b1561256d57600080826001600160a01b0316856040516024016124dc9190612cca565b60408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b179052516125119190612f54565b600060405180830381855af49150503d806000811461254c576040519150601f19603f3d011682016040523d82523d6000602084013e612551565b606091505b50915091508161256a57604481511015610f9757600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156125b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125db9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612bc8565b9050600080826001600160a01b031687878760405160240161266093929190612efb565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b179052516126959190612f54565b600060405180830381855af49150503d80600081146126d0576040519150601f19603f3d011682016040523d82523d6000602084013e6126d5565b606091505b5091509150816126ee57604481511015610f9757600080fd5b50505050505050565b6001600160a01b0382166127335760405162461bcd60e51b815260206004820152600360248201526222a6ad60e91b604482015260640161039b565b600254600160281b900460ff1661275c5760405162461bcd60e51b815260040161039b906130bb565b60025462010000900460ff16156127855760405162461bcd60e51b815260040161039b906130bb565b603654610100900460ff161561286757601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156127df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128039190612bc8565b6040516218a28b60e61b81526001600160a01b038481166004830152602482018490529190911690630628a2c090604401600060405180830381600087803b15801561284e57600080fd5b505af1158015612862573d6000803e3d6000fd5b505050505b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156128b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d59190612bc8565b905060006129a683836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561291b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293f919061308b565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a1919061308b565b611dbe565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0c9190612bc8565b90508360016014016000828254612a239190612f41565b90915550506001600160a01b03811660009081526010602052604081208054849290612a50908490612f41565b90915550612a6090508285612ee8565b6001600160a01b03861660009081526010602052604081208054909190612a88908490612f41565b90915550506040518281526001600160a01b038216906000906000805160206130f88339815191529060200160405180910390a36001600160a01b03851660006000805160206130f8833981519152612ae18588612ee8565b60405190815260200160405180910390a35050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040518060800160405280612b50612b99565b81526020016000815260200160008152602001600081525090565b604051806080016040528060608152602001612b85612b99565b815260006020820181905260409091015290565b604051806040016040528060008152602001600081525090565b6001600160a01b038116811461174357600080fd5b600060208284031215612bda57600080fd5b8151610ba181612bb3565b60008060408385031215612bf857600080fd5b8235612c0381612bb3565b91506020830135612c1381612bb3565b809150509250929050565b60005b83811015612c39578181015183820152602001612c21565b50506000910152565b60008151808452612c5a816020860160208601612c1e565b601f01601f19169290920160200192915050565b602081526000610ba16020830184612c42565b60008060408385031215612c9457600080fd5b8235612c9f81612bb3565b946020939093013593505050565b600060208284031215612cbf57600080fd5b8135610ba181612bb3565b6001600160a01b0391909116815260200190565b600080600060608486031215612cf357600080fd5b8335612cfe81612bb3565b92506020840135612d0e81612bb3565b929592945050506040919091013590565b600060208284031215612d3157600080fd5b5035919050565b6000610100820190508251151582526020830151151560208301526040830151151560408301526060830151151560608301526080830151612d7e608084018215159052565b5060a0830151612d9260a084018215159052565b5060c0830151612da660c084018215159052565b5060e0830151612dba60e084018215159052565b5092915050565b60008060208385031215612dd457600080fd5b82356001600160401b0380821115612deb57600080fd5b818501915085601f830112612dff57600080fd5b813581811115612e0e57600080fd5b8660208260051b8501011115612e2357600080fd5b60209290920196919550909350505050565b602081526000825160a06020840152612e5160c0840182612c42565b90506020840151612e6f604085018280518252602090810151910152565b5060408401516001600160a01b03166080840152606090930151151560a0909201919091525090565b600181811c90821680612eac57607f821691505b602082108103612ecc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081b5761081b612ed2565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600082612f3c57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561081b5761081b612ed2565b60008251612f66818460208701612c1e565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612f9857600080fd5b81516001600160401b0380821115612faf57600080fd5b818401915084601f830112612fc357600080fd5b815181811115612fd557612fd5612f70565b604051601f8201601f19908116603f01168101908382118183101715612ffd57612ffd612f70565b8160405282815287602084870101111561301657600080fd5b6121cf836020830160208801612c1e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161308457613084612ed2565b5060010190565b60006020828403121561309d57600080fd5b5051919050565b9182526001600160a01b0316602082015260400190565b6020808252600290820152614e4d60f01b60408201526060019056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a4e40b9641135954640ca80aed2c263d55c040dd710d9766ebe710002ab0c21364736f6c634300081100338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a26469706673582212207356fbbf9d0950768419c65b7aff4c4808182f84ec021795fb44e654719eca6d64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b7084866b70adad518b8fcf5aa6ada89e46e75c4000000000000000000000000c9488826316d27dd9ee16ee8141124871f2bda56
-----Decoded View---------------
Arg [0] : _mintFactory (address): 0xB7084866b70AdAD518B8FCf5AA6adA89e46E75c4
Arg [1] : _feeHelper (address): 0xc9488826316d27DD9Ee16Ee8141124871F2Bda56
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b7084866b70adad518b8fcf5aa6ada89e46e75c4
Arg [1] : 000000000000000000000000c9488826316d27dd9ee16ee8141124871f2bda56
Deployed Bytecode Sourcemap
151653:919:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;151746:32;;;;;;;;;;-1:-1:-1;151746:32:0;;;;-1:-1:-1;;;;;151746:32:0;;;;;;-1:-1:-1;;;;;197:32:1;;;179:51;;167:2;152:18;151746:32:0;;;;;;;;151700:35;;;;;;;;;;;;;;;;;;;387:25:1;;;375:2;360:18;151700:35:0;241:177:1;8314:148:0;;;;;;;;;;;;;:::i;:::-;;7663:87;;;;;;;;;;;;;:::i;152109:460::-;;;;;;:::i;:::-;;:::i;151785:28::-;;;;;;;;;;-1:-1:-1;151785:28:0;;;;-1:-1:-1;;;;;151785:28:0;;;8617:244;;;;;;;;;;-1:-1:-1;8617:244:0;;;;;:::i;:::-;;:::i;8314:148::-;6272:10;7883:7;:5;:7::i;:::-;-1:-1:-1;;;;;7883:23:0;;7875:68;;;;-1:-1:-1;;;7875:68:0;;;;;;;:::i;:::-;;;;;;;;;8421:1:::1;8405:6:::0;;8384:40:::1;::::0;-1:-1:-1;;;;;8405:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;8384:40:0;8421:1;;8384:40:::1;8452:1;8435:19:::0;;-1:-1:-1;;;;;;8435:19:0::1;::::0;;8314:148::o;7663:87::-;7709:7;7736:6;-1:-1:-1;;;;;7736:6:0;;7663:87::o;152109:460::-;152255:10;;:28;;;-1:-1:-1;;;152255:28:0;;;;152215:7;;-1:-1:-1;;;;;152255:10:0;;:26;;:28;;;;;;;;;;;;;;:10;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;152242:9;:41;152234:65;;;;-1:-1:-1;;;152234:65:0;;2650:2:1;152234:65:0;;;2632:21:1;2689:2;2669:18;;;2662:30;-1:-1:-1;;;2708:18:1;;;2701:41;2759:18;;152234:65:0;2448:335:1;152234:65:0;152318:10;;;;;;;;;-1:-1:-1;;;;;152318:10:0;-1:-1:-1;;;;;152318:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;152310:44:0;:74;152355:10;;;;;;;;;-1:-1:-1;;;;;152355:10:0;-1:-1:-1;;;;;152355:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;152310:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;152444:12:0;;152415:43;;152395:17;;152428:6;;-1:-1:-1;;;;;152444:12:0;;;;152415:43;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;152469:12:0;;:57;;-1:-1:-1;;;152469:57:0;;152496:10;152469:57;;;11424:34:1;-1:-1:-1;;;;;11494:15:1;;;11474:18;;;11467:43;152395:63:0;;-1:-1:-1;152469:12:0;;;:26;;11359:18:1;;152469:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;152552:8:0;;152109:460;-1:-1:-1;;;;;152109:460:0:o;8617:244::-;6272:10;7883:7;:5;:7::i;:::-;-1:-1:-1;;;;;7883:23:0;;7875:68;;;;-1:-1:-1;;;7875:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8706:22:0;::::1;8698:73;;;::::0;-1:-1:-1;;;8698:73:0;;11723:2:1;8698:73:0::1;::::0;::::1;11705:21:1::0;11762:2;11742:18;;;11735:30;11801:34;11781:18;;;11774:62;-1:-1:-1;;;11852:18:1;;;11845:36;11898:19;;8698:73:0::1;11521:402:1::0;8698:73:0::1;8808:6;::::0;;8787:38:::1;::::0;-1:-1:-1;;;;;8787:38:0;;::::1;::::0;8808:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;8787:38:0;::::1;8836:6;:17:::0;;-1:-1:-1;;;;;;8836:17:0::1;-1:-1:-1::0;;;;;8836:17:0;;;::::1;::::0;;;::::1;::::0;;8617:244::o;-1:-1:-1:-;;;;;;;;:::o;423:104:1:-;-1:-1:-1;;;;;489:31:1;477:44;;423:104::o;740:399::-;837:6;890:2;878:9;869:7;865:23;861:32;858:52;;;906:1;903;896:12;858:52;933:23;;-1:-1:-1;;;;;968:30:1;;965:50;;;1011:1;1008;1001:12;965:50;1034:22;;1090:4;1072:16;;;1068:27;1065:47;;;1108:1;1105;1098:12;1065:47;1131:2;740:399;-1:-1:-1;;;740:399:1:o;1371:131::-;-1:-1:-1;;;;;1446:31:1;;1436:42;;1426:70;;1492:1;1489;1482:12;1426:70;1371:131;:::o;1507:134::-;1575:20;;1604:31;1575:20;1604:31;:::i;:::-;1507:134;;;:::o;1646:247::-;1705:6;1758:2;1746:9;1737:7;1733:23;1729:32;1726:52;;;1774:1;1771;1764:12;1726:52;1813:9;1800:23;1832:31;1857:5;1832:31;:::i;1898:356::-;2100:2;2082:21;;;2119:18;;;2112:30;2178:34;2173:2;2158:18;;2151:62;2245:2;2230:18;;1898:356::o;2259:184::-;2329:6;2382:2;2370:9;2361:7;2357:23;2353:32;2350:52;;;2398:1;2395;2388:12;2350:52;-1:-1:-1;2421:16:1;;2259:184;-1:-1:-1;2259:184:1:o;2788:251::-;2858:6;2911:2;2899:9;2890:7;2886:23;2882:32;2879:52;;;2927:1;2924;2917:12;2879:52;2959:9;2953:16;2978:31;3003:5;2978:31;:::i;3044:501::-;3103:5;3110:6;3170:3;3157:17;3256:2;3252:7;3241:8;3225:14;3221:29;3217:43;3197:18;3193:68;3183:96;;3275:1;3272;3265:12;3183:96;3303:33;;3407:4;3394:18;;;-1:-1:-1;3355:21:1;;-1:-1:-1;;;;;;3424:30:1;;3421:50;;;3467:1;3464;3457:12;3421:50;3514:6;3498:14;3494:27;3487:5;3483:39;3480:59;;;3535:1;3532;3525:12;3480:59;3044:501;;;;;:::o;3550:267::-;3639:6;3634:3;3627:19;3691:6;3684:5;3677:4;3672:3;3668:14;3655:43;-1:-1:-1;3743:1:1;3718:16;;;3736:4;3714:27;;;3707:38;;;;3799:2;3778:15;;;-1:-1:-1;;3774:29:1;3765:39;;;3761:50;;3550:267::o;3822:156::-;3888:20;;3948:4;3937:16;;3927:27;;3917:55;;3968:1;3965;3958:12;4063:160;4128:20;;4184:13;;4177:21;4167:32;;4157:60;;4213:1;4210;4203:12;4324:815;4424:22;4440:5;4424:22;:::i;:::-;4417:30;4410:38;4405:3;4398:51;4495:33;4522:4;4515:5;4511:16;4495:33;:::i;:::-;4488:41;4481:49;4474:4;4469:3;4465:14;4458:73;4577:33;4604:4;4597:5;4593:16;4577:33;:::i;:::-;4570:41;4563:49;4556:4;4551:3;4547:14;4540:73;4659:33;4686:4;4679:5;4675:16;4659:33;:::i;:::-;4652:41;4645:49;4638:4;4633:3;4629:14;4622:73;4741:33;4768:4;4761:5;4757:16;4741:33;:::i;:::-;4734:41;4727:49;4720:4;4715:3;4711:14;4704:73;4806:33;4833:4;4826:5;4822:16;4806:33;:::i;:::-;4298:13;4291:21;4887:4;4878:14;;4279:34;4924:33;4951:4;4940:16;;4924:33;:::i;:::-;4298:13;4291:21;5007:4;4998:14;;4279:34;5044:33;5071:4;5060:16;;5044:33;:::i;:::-;4298:13;;4291:21;5127:4;5118:14;;4279:34;5086:47;4324:815;;:::o;5625:538::-;5713:5;5720:6;5780:3;5767:17;5866:2;5862:7;5851:8;5835:14;5831:29;5827:43;5807:18;5803:68;5793:96;;5885:1;5882;5875:12;5793:96;5913:33;;6017:4;6004:18;;;-1:-1:-1;5965:21:1;;-1:-1:-1;;;;;;6034:30:1;;6031:50;;;6077:1;6074;6067:12;6031:50;6131:6;6128:1;6124:14;6108;6104:35;6097:5;6093:47;6090:67;;;6153:1;6150;6143:12;6168:1463;6286:6;6281:3;6274:19;6256:3;6312:4;6353:2;6348:3;6344:12;6378:11;6405;6398:18;;6455:6;6452:1;6448:14;6441:5;6437:26;6425:38;;6486:5;6509:1;6530;6540:1065;6556:6;6551:3;6548:15;6540:1065;;;6631:5;6625:4;6621:16;6616:3;6609:29;6690:6;6677:20;6780:3;6776:8;6768:5;6752:14;6748:26;6744:41;6724:18;6720:66;6710:94;;6800:1;6797;6790:12;6710:94;6832:30;;6885:4;6936:49;6832:30;;6936:49;:::i;:::-;7011:2;7005:4;6998:16;7041:69;7106:2;7100:4;7096:13;7082:12;7068;7041:69;:::i;:::-;7027:83;;;;7123:63;7182:2;7176:4;7172:13;7167:2;7158:7;7154:16;5222:19;;5210:32;;5298:4;5287:16;;;5274:30;5258:14;;5251:54;5144:167;7123:63;7209:4;7267:2;7258:7;7254:16;7241:30;7284:33;7309:7;7284:33;:::i;:::-;-1:-1:-1;;;;;7352:33:1;7337:13;;;7330:56;7409:4;7462:33;7478:16;;;7462:33;:::i;:::-;7455:41;7448:49;7433:13;;7426:72;;;;-1:-1:-1;7583:12:1;;;;7548:15;;;;6582:1;6573:11;6540:1065;;;-1:-1:-1;7621:4:1;;6168:1463;-1:-1:-1;;;;;;;;6168:1463:1:o;7636:387::-;7739:5;7726:19;7721:3;7714:32;7802:4;7795:5;7791:16;7778:30;7771:4;7766:3;7762:14;7755:54;7865:4;7858:5;7854:16;7841:30;7834:4;7829:3;7825:14;7818:54;7928:4;7921:5;7917:16;7904:30;7897:4;7892:3;7888:14;7881:54;7981:33;8008:4;8001:5;7997:16;7981:33;:::i;:::-;7974:41;7967:49;7960:4;7955:3;7951:14;7944:73;;;7636:387::o;8028:207::-;8140:5;8127:19;8122:3;8115:32;8193:33;8220:4;8213:5;8209:16;8193:33;:::i;:::-;8186:41;8179:49;8172:4;8167:3;8163:14;8156:73;;;8028:207::o;8240:2967::-;8471:2;8460:9;8453:21;8434:4;8517:47;8557:6;8549;8517:47;:::i;:::-;8583:6;8625:2;8620;8609:9;8605:18;8598:30;8651:76;8721:4;8710:9;8706:20;8692:12;8678;8651:76;:::i;:::-;8637:90;;8774:58;8826:4;8818:6;8814:17;8806:6;8774:58;:::i;:::-;8736:96;;8855:2;8851:7;8922:2;8910:9;8902:6;8898:22;8894:31;8889:2;8878:9;8874:18;8867:59;8949:66;9008:6;8992:14;8976;8949:66;:::i;:::-;8935:80;;9046:33;9075:2;9067:6;9063:15;9046:33;:::i;:::-;4050:4;4039:16;;9136:3;9121:19;;4027:29;9024:55;-1:-1:-1;9172:35:1;9203:2;9195:6;9191:15;9172:35;:::i;:::-;9150:57;;9216:55;9266:3;9255:9;9251:19;9235:14;9216:55;:::i;:::-;9333:3;9325:6;9321:16;9308:30;9302:3;9291:9;9287:19;9280:59;9401:3;9393:6;9389:16;9376:30;9370:3;9359:9;9355:19;9348:59;9416:77;9488:3;9477:9;9473:19;9467:3;9459:6;9455:16;9416:77;:::i;:::-;9502:80;9577:3;9566:9;9562:19;9553:6;9545;9541:19;9502:80;:::i;:::-;9591:73;9659:3;9648:9;9644:19;9635:6;9627;9623:19;5222;;5210:32;;5298:4;5287:16;;;5274:30;5258:14;;;5251:54;5481:4;5474:5;5470:16;5457:30;5450:4;5445:3;5441:14;5434:54;5544:4;5537:5;5533:16;5520:30;5513:4;5508:3;5504:14;5497:54;5607:4;5600:5;5596:16;5583:30;5576:4;5571:3;5567:14;5560:54;;;5316:304;9591:73;9695:39;9726:6;9718;9714:19;9695:39;:::i;:::-;9673:61;;9753:3;9743:13;;9765:54;9815:2;9804:9;9800:18;9784:14;9765:54;:::i;:::-;9866:89;9947:6;9939;9935:19;9927:6;9866:89;:::i;:::-;9828:127;;9974:3;10041:2;10029:9;10021:6;10017:22;10013:31;10008:2;9997:9;9993:18;9986:59;10068:95;10156:6;10140:14;10124;10068:95;:::i;:::-;10054:109;;10182:3;10172:13;;10246:2;10238:6;10234:15;10221:29;10216:2;10205:9;10201:18;10194:57;10270:4;10260:14;;10335:2;10327:6;10323:15;10310:29;10305:2;10294:9;10290:18;10283:57;;;;10359:4;10424:2;10416:6;10412:15;10399:29;10394:2;10383:9;10379:18;10372:57;10460:35;10491:2;10483:6;10479:15;10460:35;:::i;:::-;10438:57;;10514:4;10504:14;;10527:54;10577:2;10566:9;10562:18;10546:14;10527:54;:::i;:::-;10612:35;10643:2;10635:6;10631:15;10612:35;:::i;:::-;10590:57;;;10666:4;10679:54;10729:2;10718:9;10714:18;10698:14;10679:54;:::i;:::-;10764:32;10792:2;10784:6;10780:15;10764:32;:::i;:::-;4298:13;;4291:21;10852:4;10837:20;;4279:34;10742:54;-1:-1:-1;10867:81:1;10942:4;10931:9;10927:20;10922:2;10914:6;10910:15;10867:81;:::i;:::-;;;11011:6;11003;10999:19;10986:33;10979:4;10968:9;10964:20;10957:63;11029:92;11117:2;11106:9;11102:18;11093:6;11085;11081:19;11029:92;:::i;:::-;;;11138:6;11130:14;;;11153:48;11195:4;11184:9;11180:20;11172:6;11153:48;:::i
Swarm Source
ipfs://7356fbbf9d0950768419c65b7aff4c4808182f84ec021795fb44e654719eca6d
Loading...
Loading
Loading...
Loading
OVERVIEW
This contract allows users to deploy a token smart contract from the UNCX Network user interface. It includes a plethora of options available (taxes, custom settings, LossLess integration, and protection from sniping among others). More information is available on our chats & documentationNet Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.