ERC-20
Overview
Max Total Supply
0.000000000018 TEST
Holders
2
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.00000000001782 TESTValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
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 Source Code Verified (Exact Match)
Contract Name:
TaxToken
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-15 */ // 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/[email protected] /** * @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/[email protected] /* * @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/[email protected] /** * @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/[email protected] /** * @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
[{"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"},{"internalType":"address","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"CONTRACT_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxCustom","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address1","type":"address"},{"internalType":"address","name":"_address2","type":"address"}],"name":"_allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getCurrentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"_isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBotSettings","outputs":[{"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":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"buyBackBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"customTaxLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"customTaxes","outputs":[{"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":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"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":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"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":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLosslessOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLosslessTurnOffProposed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lossless","outputs":[{"internalType":"contract ILosslessController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"losslessTurnOffTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"lpTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketInit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketInitBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBalanceAfterBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoveryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapWhitelistingSettings","outputs":[{"components":[{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct SwapWhitelistingSettings","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxHelperIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxSettings","outputs":[{"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":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionTaxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from","type":"address[]"}],"name":"transferOutBlacklistedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004d7938038062004d79833981016040819052620000349162001597565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000816001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000dc919062001798565b6001600160a01b0316630ef73d2c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200011a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000140919062001798565b9050600080826001600160a01b031685856040516024016200016492919062001948565b60408051601f198184030181529181526020820180516001600160e01b0316633c74db8560e11b179052516200019b919062001b34565b600060405180830381855af49150503d8060008114620001d8576040519150601f19603f3d011682016040523d82523d6000602084013e620001dd565b606091505b5091509150816200023257604481511015620001f857600080fd5b808060200190518101906200020e919062001b52565b60405162461bcd60e51b815260040162000229919062001b8a565b60405180910390fd5b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156200027d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a3919062001798565b905060006200038b8760800151836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000315919062001b9f565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037a919062001b9f565b6200044160201b62001dbe1760201c565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f4919062001798565b90506200040d88606001513384620004f960201b60201c565b601e805460ff60a81b1916600160a81b179055606088015162000432908284620006c4565b50505050505050505062001c1c565b60008080600019858709858702925082811083820303915050806000036200047d57600084116200047157600080fd5b508290049050620004f2565b8084116200048a57600080fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6001600160a01b0383166200053a5760405162461bcd60e51b8152600401620002299060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b0382166200057b5760405162461bcd60e51b8152600401620002299060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff16156200066357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015620005d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005fd919062001798565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b81526004016200062e9392919062001bb9565b600060405180830381600087803b1580156200064957600080fd5b505af11580156200065e573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b601e54600090600160a81b900460ff166200070d57601e805460ff60a81b1916600160a81b1790556000620006fb858585620009b9565b905062000709818462001bdd565b9250505b603654610100900460ff16156200081157601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801562000769573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200078f919062001798565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b158015620007f757600080fd5b505af11580156200080c573d6000803e3d6000fd5b505050505b6200081e84848462000b78565b6001600160a01b0384166000908152601160209081526040808320338452909152902054828110156200087a5760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640162000229565b6001600160a01b038516600090815260116020908152604080832033808552925290912054620008b9918791620008b390879062001bdd565b620004f9565b601e805460ff60a81b19169055603654610100900460ff1615620009ae57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801562000922573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000948919062001798565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401620009799392919062001bb9565b600060405180830381600087803b1580156200099457600080fd5b505af1158015620009a9573d6000803e3d6000fd5b505050505b506001949350505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a13573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a39919062001798565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a77573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a9d919062001798565b9050600080826001600160a01b031687878760405160240162000ac39392919062001bb9565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b1790525162000afa919062001b34565b600060405180830381855af49150503d806000811462000b37576040519150601f19603f3d011682016040523d82523d6000602084013e62000b3c565b606091505b50915091508162000b5757604481511015620001f857600080fd5b8080602001905181019062000b6d919062001b9f565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa15801562000bc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000be9919062001798565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c27573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c4d919062001798565b60255490915060ff16801562000c655750602b5460ff165b801562000c8a57506001600160a01b03841660009081526018602052604090205460ff165b1562000d4957600080826001600160a01b0316848660405160240162000cb292919062001c05565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525162000ce9919062001b34565b600060405180830381855af49150503d806000811462000d26576040519150601f19603f3d011682016040523d82523d6000602084013e62000d2b565b606091505b50915091508162000d4657604481511015620001f857600080fd5b50505b600254670100000000000000900460ff16801562000d7f57506001600160a01b03841660009081526018602052604090205460ff165b1562000e3e57600080826001600160a01b0316848660405160240162000da792919062001c05565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b1790525162000dde919062001b34565b600060405180830381855af49150503d806000811462000e1b576040519150601f19603f3d011682016040523d82523d6000602084013e62000e20565b606091505b50915091508162000e3b57604481511015620001f857600080fd5b50505b60255460ff16801562000e535750602f5460ff165b801562000e7857506001600160a01b03841660009081526018602052604090205460ff165b1562000f33576040516001600160a01b038481166024830152600091829184169060440160408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b1790525162000ed3919062001b34565b600060405180830381855af49150503d806000811462000f10576040519150601f19603f3d011682016040523d82523d6000602084013e62000f15565b606091505b50915091508162000f3057604481511015620001f857600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa15801562000f7e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fa4919062001798565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001008919062001798565b9050600080826001600160a01b03168787876040516024016200102e9392919062001bb9565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b1790525162001065919062001b34565b600060405180830381855af49150503d8060008114620010a2576040519150601f19603f3d011682016040523d82523d6000602084013e620010a7565b606091505b509150915081620010c257604481511015620001f857600080fd5b50505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715620011065762001106620010cb565b60405290565b604051608081016001600160401b0381118282101715620011065762001106620010cb565b60405161028081016001600160401b0381118282101715620011065762001106620010cb565b604051601f8201601f191681016001600160401b0381118282101715620011825762001182620010cb565b604052919050565b60005b83811015620011a75781810151838201526020016200118d565b50506000910152565b600082601f830112620011c257600080fd5b81516001600160401b03811115620011de57620011de620010cb565b620011f3601f8201601f191660200162001157565b8181528460208386010111156200120957600080fd5b6200121c8260208301602087016200118a565b949350505050565b805160ff811681146200123657600080fd5b919050565b80516001600160a01b03811681146200123657600080fd5b805180151581146200123657600080fd5b60006101008083850312156200127957600080fd5b604051908101906001600160401b03821181831017156200129e576200129e620010cb565b81604052809250620012b08462001253565b8152620012c06020850162001253565b6020820152620012d36040850162001253565b6040820152620012e66060850162001253565b6060820152620012f96080850162001253565b60808201526200130c60a0850162001253565b60a08201526200131f60c0850162001253565b60c08201526200133260e0850162001253565b60e0820152505092915050565b6000604082840312156200135257600080fd5b6200135c620010e1565b9050815181526020820151602082015292915050565b600060a082840312156200138557600080fd5b6200138f6200110c565b90506200139d83836200133f565b815260408201516020820152606082015160408201526080820151606082015292915050565b600082601f830112620013d557600080fd5b815160206001600160401b0380831115620013f457620013f4620010cb565b8260051b6200140583820162001157565b93845285810183019383810190888611156200142057600080fd5b84880192505b85831015620014d357825184811115620014405760008081fd5b880160a0818b03601f1901811315620014595760008081fd5b620014636200110c565b8783015187811115620014765760008081fd5b620014868d8a83870101620011b0565b8252506040620014998d8286016200133f565b89830152620014ab608085016200123b565b90820152620014bc83830162001253565b606082015284525050918401919084019062001426565b98975050505050505050565b600060a08284031215620014f257600080fd5b60405160a081016001600160401b0381118282101715620015175762001517620010cb565b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526200154f6080840162001253565b60808201525092915050565b6000604082840312156200156e57600080fd5b62001578620010e1565b9050815181526200158c6020830162001253565b602082015292915050565b60008060408385031215620015ab57600080fd5b82516001600160401b0380821115620015c357600080fd5b908401906105608287031215620015d957600080fd5b620015e362001131565b825182811115620015f357600080fd5b6200160188828601620011b0565b8252506020830151828111156200161757600080fd5b6200162588828601620011b0565b602083015250620016396040840162001224565b60408201526200164c606084016200123b565b60608201526080830151608082015260a083015160a0820152620016748760c0850162001264565b60c08201526101c06200168a8882860162001264565b60e08301526200169f886102c0860162001372565b610100830152620016b461036085016200123b565b61012083015261038084015183811115620016ce57600080fd5b620016dc89828701620013c3565b610140840152506103a08401516101608301526103c08401516101808301526103e08401516101a08301526200171661040085016200123b565b908201526200172961042084016200123b565b6101e08201526200173e610440840162001253565b61020082015262001754876104608501620014df565b610220820152610500830151610240820152620017768761052085016200155b565b61026082015293506200178f915050602084016200123b565b90509250929050565b600060208284031215620017ab57600080fd5b620004f2826200123b565b60008151808452620017d08160208601602086016200118a565b601f01601f19169290920160200192915050565b6001600160a01b03169052565b80511515825260208101511515602083015260408101511515604083015260608101511515606083015260808101511515608083015260a08101516200183b60a084018215159052565b5060c08101516200185060c084018215159052565b5060e08101516200186560e084018215159052565b505050565b6200188082825180518252602090810151910152565b6020810151604083015260408101516060830152606081015160808301525050565b600081518084526020808501808196508360051b8101915082860160005b858110156200193b578284038952815160a08151818752620018e582880182620017b6565b91505086820151620019038888018280518252602090810151910152565b5060408201516001600160a01b03166060878101919091529091015115156080909501949094529784019790840190600101620018c0565b5091979650505050505050565b6040815260008351610560806040850152620019696105a0850183620017b6565b91506020860151603f1980868503016060870152620019898483620017b6565b935060408801519150620019a2608087018360ff169052565b60608801519150620019b860a0870183620017e4565b608088015160c087015260a088015160e087015260c08801519150610100620019e481880184620017f1565b60e08901519250610200620019fc81890185620017f1565b818a0151935062001a126103008901856200186a565b6101208a0151935062001a2a6103a0890185620017e4565b6101408a0151935082888703016103c089015262001a498685620018a2565b95506101608a01516103e08901526101808a01516104008901526101a08a01516104208901526101c08a0151935062001a87610440890185620017e4565b6101e08a0151935062001a9f610460890185620017e4565b890151801515610480890152925062001ab6915050565b5061022086015180516104a086015260208101516104c086015260408101516104e08601526060810151610500860152608081015115156105208601525061024086015161054085015261026086015162001b1f82860182805182526020908101511515910152565b505080915050620004f26020830184620017e4565b6000825162001b488184602087016200118a565b9190910192915050565b60006020828403121562001b6557600080fd5b81516001600160401b0381111562001b7c57600080fd5b6200121c84828501620011b0565b602081526000620004f26020830184620017b6565b60006020828403121562001bb257600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8181038181111562001bff57634e487b7160e01b600052601160045260246000fd5b92915050565b9182526001600160a01b0316602082015260400190565b61314d8062001c2c6000396000f3fe608060405234801561001057600080fd5b50600436106102675760003560e01c8063024c2ddd146103cb57806306fdde03146103f1578063095ea7b3146104065780630b285b1f1461042957806318160ddd146104555780631cd348c01461045d5780631ec9801d146104775780632150ec291461048257806323b872dd146104935780632a4a09dd146104a65780632d838119146104ae5780632ecaf675146104c157806330d08211146104c957806331392fcb146104d1578063313ce567146104e657806334f6ebf5146104ff57806338b9033314610507578063395093511461050f57806342966c68146105225780634fea2c7a146105355780635c975abb146105485780635f6529a31461055057806361086b00146105615780636303516c1461056957806370a082311461057a578063715018a61461058d5780637ebae80e146105955780638da5cb5b146105da578063936af911146105e257806394e10784146105f557806395d89b41146105fd57806397a9d560146106055780639af1d35a14610622578063a0712d6814610663578063a457c2d714610676578063a4e2d63414610689578063a8b0898214610691578063a9059cbb146106a2578063b17b658d146106b5578063b22941dd146106e1578063c45a015514610701578063ccfa214f14610712578063dd62ed3e146103cb578063eb8e886314610722578063efab831c1461072a578063f10437fc14610735578063f238cc6f14610740578063f2fde38b14610748578063f851a4401461075b578063fa86f8ce1461076c578063fb1eb14b14610774578063fd8191631461077c578063fe575a87146107c8575b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156102b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d59190612bc8565b6040516366ffd66360e11b8152600080356001600160e01b03191660048301529192506001600160a01b0383169063cdffacc690602401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190612bc8565b90506001600160a01b0381166103a45760405162461bcd60e51b8152602060048201526017602482015276119d5b98dd1a5bdb88191bd95cc81b9bdd08195e1a5cdd604a1b60448201526064015b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156103c5578184f35b8184fd5b005b6103de6103d9366004612be5565b6107f4565b6040519081526020015b60405180910390f35b6103f9610821565b6040516103e89190612c6e565b610419610414366004612c81565b6108b6565b60405190151581526020016103e8565b610419610437366004612cad565b6001600160a01b031660009081526012602052604090205460ff1690565b6015546103de565b601d546001600160a01b03165b6040516103e89190612cca565b60255460ff16610419565b600a546001600160a01b031661046a565b6104196104a1366004612cde565b6108cc565b600b546103de565b6103de6104bc366004612d1f565b610ba8565b6034546103de565b6026546103de565b6104d9610bf9565b6040516103e89190612d38565b601b5460ff165b60405160ff90911681526020016103e8565b61046a610c8c565b6001546103de565b61041961051d366004612c81565b610cff565b6103c9610530366004612d1f565b610e18565b6103c9610543366004612d1f565b610fca565b610419611212565b6030546001600160a01b031661046a565b6035546103de565b601e546001600160a01b031661046a565b6103de610588366004612cad565b611241565b6103c96112d0565b604080518082018252600080825260209182015281518083018352602e54808252602f5460ff16151591830191825283519081529051151591810191909152016103e8565b61046a611337565b6103c96105f0366004612dc1565b611346565b6103de6114f7565b6103f961151a565b61060d61152c565b604080519283526020830191909152016103e8565b61062a6116c6565b6040805182518051825260209081015181830152830151818301529082015160608083019190915290910151608082015260a0016103e8565b6103c9610671366004612d1f565b61170a565b610419610684366004612c81565b611746565b6104d961189f565b6023546001600160a01b031661046a565b6104196106b0366004612c81565b611932565b6104196106c3366004612cad565b6001600160a01b031660009081526018602052604090205460ff1690565b6106f46106ef366004612d1f565b611b5c565b6040516103e89190612e35565b601c546001600160a01b031661046a565b603654610100900460ff16610419565b600c546103de565b60365460ff16610419565b600d5460ff166104ed565b602d546103de565b6103c9610756366004612cad565b611c73565b6033546001600160a01b031661046a565b6024546103de565b6017546103de565b610784611d50565b6040516103e89190600060a0820190508251825260208301516020830152604083015160408301526060830151606083015260808301511515608083015292915050565b6104196107d6366004612cad565b6001600160a01b03166000908152601f602052604090205460ff1690565b6001600160a01b038083166000908152601160209081526040808320938516835292905220545b92915050565b60606001601801805461083390612e98565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90612e98565b80156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b60006108c3338484611e6c565b50600192915050565b601e54600090600160a81b900460ff1661091057601e805460ff60a81b1916600160a81b179055600061090085858561202b565b905061090c8184612ee8565b9250505b603654610100900460ff1615610a0e57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561096a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e9190612bc8565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b1580156109f557600080fd5b505af1158015610a09573d6000803e3d6000fd5b505050505b610a198484846121da565b6001600160a01b038416600090815260116020908152604080832033845290915290205482811015610a735760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640161039b565b6001600160a01b038516600090815260116020908152604080832033808552925290912054610aae918791610aa9908790612ee8565b611e6c565b601e805460ff60a81b19169055603654610100900460ff1615610b9b57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190612bc8565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401610b6893929190612efb565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050505b60019150505b9392505050565b601654600090821115610be35760405162461bcd60e51b815260206004820152600360248201526220a62960e91b604482015260640161039b565b6000610bed6114f7565b9050610ba18184612f1f565b610c01612af9565b5060408051610100808201835260025460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601c54604080516322d608f360e21b815290516000926001600160a01b031691638b5823cc9160048083019260209291908290030181865afa158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190612bc8565b905090565b603654600090610100900460ff1615610de257601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d809190612bc8565b6001600160a01b031663cf5961bb3385856040518463ffffffff1660e01b8152600401610daf93929190612efb565b600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b3360008181526011602090815260408083206001600160a01b03881684529091529020546108c391908590610aa9908690612f41565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee79190612bc8565b9050600080826001600160a01b031684604051602401610f0991815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b17905251610f3e9190612f54565b600060405180830381855af49150503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b509150915081610fc457604481511015610f9757600080fd5b80806020019051810190610fab9190612f86565b60405162461bcd60e51b815260040161039b9190612c6e565b50505050565b601c54602480546040516301e2e22f60e51b815260048101919091526000926001600160a01b031691633c5c45e09101602060405180830381865afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b9190612bc8565b9050336001600160a01b0382161461107a5760405162461bcd60e51b8152602060048201526002602482015261524160f01b604482015260640161039b565b61108c81611086611337565b846121da565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156110d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fa9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190612bc8565b9050600080826001600160a01b03168560405160240161117d91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b179052516111b29190612f54565b600060405180830381855af49150503d80600081146111ed576040519150601f19603f3d011682016040523d82523d6000602084013e6111f2565b606091505b50915091508161120b57604481511015610f9757600080fd5b5050505050565b600254600090600160301b900460ff16151581036112305750600090565b50601e54600160a01b900460ff1690565b60025460009062010000900460ff16156112b4576001600160a01b03821660009081526012602052604090205460ff161561129257506001600160a01b031660009081526010602052604090205490565b6001600160a01b0382166000908152600f602052604090205461081b90610ba8565b506001600160a01b031660009081526010602052604090205490565b336112d9611337565b6001600160a01b0316146112ff5760405162461bcd60e51b815260040161039b90613027565b600080546040516001600160a01b03909116906000805160206130d8833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b603654610100900460ff1661135a57600080fd5b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156113a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c89190612bc8565b6001600160a01b0316336001600160a01b03161461140e5760405162461bcd60e51b81526020600482015260036024820152621313d360ea1b604482015260640161039b565b60005b818110156114f2576114e083838381811061142e5761142e61305c565b90506020020160208101906114439190612cad565b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b19190612bc8565b6114db8686868181106114c6576114c661305c565b90506020020160208101906105889190612cad565b6121da565b806114ea81613072565b915050611411565b505050565b600080600061150461152c565b90925090506115138183612f1f565b9250505090565b60606001601901805461083390612e98565b6016546015546000918291825b60135481101561169457826001600e016000600160120184815481106115615761156161305c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806115d25750816001600f016000600160120184815481106115ab576115ab61305c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156115e95750506016546015549094909350915050565b60138054600f91600091849081106116035761160361305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116329084612ee8565b92506001600f016000600160120183815481106116515761165161305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116809083612ee8565b91508061168c81613072565b915050611539565b506015546016546116a59190612f1f565b8210156116bd57505060165460155490939092509050565b90939092509050565b6116ce612b3d565b506040805160c0810182526004546080820190815260055460a08301528152600654602082015260075491810191909152600854606082015290565b33611713611337565b6001600160a01b0316146117395760405162461bcd60e51b815260040161039b90613027565b61174333826126f7565b50565b603654600090610100900460ff161561182957601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190612bc8565b6001600160a01b031663568c75a93385856040518463ffffffff1660e01b81526004016117f693929190612efb565b600060405180830381600087803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b505050505b3360009081526011602090815260408083206001600160a01b0387168452909152902054828110156118865760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a12d60e11b604082015260600190565b6118953385610aa98685612ee8565b5060019392505050565b6118a7612af9565b5060408051610100808201835260035460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601e54600090600160a81b900460ff1661197c57601e805460ff60a81b1916600160a81b179055600061196c6119653390565b858561202b565b90506119788184612ee8565b9250505b603654610100900460ff1615611a5c57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156119d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612bc8565b6001600160a01b0316631ffb811f3385856040518463ffffffff1660e01b8152600401611a2993929190612efb565b600060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b505050505b611a673384846121da565b601e805460ff60a81b19169055603654610100900460ff16156108c357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af29190612bc8565b6001600160a01b031663f49062ca3385856040518463ffffffff1660e01b8152600401611b2193929190612efb565b600060405180830381600087803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b5050505050600192915050565b611b64612b6b565b6009805483908110611b7857611b7861305c565b9060005260206000209060040201604051806080016040529081600082018054611ba190612e98565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcd90612e98565b8015611c1a5780601f10611bef57610100808354040283529160200191611c1a565b820191906000526020600020905b815481529060010190602001808311611bfd57829003601f168201915b50505091835250506040805180820182526001840154815260028401546020808301919091528301526003909201546001600160a01b03811692820192909252600160a01b90910460ff16151560609091015292915050565b33611c7c611337565b6001600160a01b031614611ca25760405162461bcd60e51b815260040161039b90613027565b6001600160a01b038116611d075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161039b565b600080546040516001600160a01b03808516939216916000805160206130d883398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611d846040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b506040805160a0810182526027548152602854602082015260295491810191909152602a546060820152602b5460ff161515608082015290565b6000808060001985870985870292508281108382030391505080600003611df75760008411611dec57600080fd5b508290049050610ba1565b808411611e0357600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b038316611eab5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b038216611eea5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff1615611fca57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f689190612bc8565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b8152600401611f9793929190612efb565b600060405180830381600087803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121099190612bc8565b9050600080826001600160a01b031687878760405160240161212d93929190612efb565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b179052516121629190612f54565b600060405180830381855af49150503d806000811461219d576040519150601f19603f3d011682016040523d82523d6000602084013e6121a2565b606091505b5091509150816121bb57604481511015610f9757600080fd5b808060200190518101906121cf919061308b565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122489190612bc8565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a99190612bc8565b60255490915060ff1680156122c05750602b5460ff165b80156122e457506001600160a01b03841660009081526018602052604090205460ff165b1561239a57600080826001600160a01b031684866040516024016123099291906130a4565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525161233e9190612f54565b600060405180830381855af49150503d8060008114612379576040519150601f19603f3d011682016040523d82523d6000602084013e61237e565b606091505b50915091508161239757604481511015610f9757600080fd5b50505b600254600160381b900460ff1680156123cb57506001600160a01b03841660009081526018602052604090205460ff165b1561248157600080826001600160a01b031684866040516024016123f09291906130a4565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b179052516124259190612f54565b600060405180830381855af49150503d8060008114612460576040519150601f19603f3d011682016040523d82523d6000602084013e612465565b606091505b50915091508161247e57604481511015610f9757600080fd5b50505b60255460ff1680156124955750602f5460ff165b80156124b957506001600160a01b03841660009081526018602052604090205460ff165b1561256d57600080826001600160a01b0316856040516024016124dc9190612cca565b60408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b179052516125119190612f54565b600060405180830381855af49150503d806000811461254c576040519150601f19603f3d011682016040523d82523d6000602084013e612551565b606091505b50915091508161256a57604481511015610f9757600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156125b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125db9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612bc8565b9050600080826001600160a01b031687878760405160240161266093929190612efb565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b179052516126959190612f54565b600060405180830381855af49150503d80600081146126d0576040519150601f19603f3d011682016040523d82523d6000602084013e6126d5565b606091505b5091509150816126ee57604481511015610f9757600080fd5b50505050505050565b6001600160a01b0382166127335760405162461bcd60e51b815260206004820152600360248201526222a6ad60e91b604482015260640161039b565b600254600160281b900460ff1661275c5760405162461bcd60e51b815260040161039b906130bb565b60025462010000900460ff16156127855760405162461bcd60e51b815260040161039b906130bb565b603654610100900460ff161561286757601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156127df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128039190612bc8565b6040516218a28b60e61b81526001600160a01b038481166004830152602482018490529190911690630628a2c090604401600060405180830381600087803b15801561284e57600080fd5b505af1158015612862573d6000803e3d6000fd5b505050505b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156128b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d59190612bc8565b905060006129a683836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561291b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293f919061308b565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a1919061308b565b611dbe565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0c9190612bc8565b90508360016014016000828254612a239190612f41565b90915550506001600160a01b03811660009081526010602052604081208054849290612a50908490612f41565b90915550612a6090508285612ee8565b6001600160a01b03861660009081526010602052604081208054909190612a88908490612f41565b90915550506040518281526001600160a01b038216906000906000805160206130f88339815191529060200160405180910390a36001600160a01b03851660006000805160206130f8833981519152612ae18588612ee8565b60405190815260200160405180910390a35050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040518060800160405280612b50612b99565b81526020016000815260200160008152602001600081525090565b604051806080016040528060608152602001612b85612b99565b815260006020820181905260409091015290565b604051806040016040528060008152602001600081525090565b6001600160a01b038116811461174357600080fd5b600060208284031215612bda57600080fd5b8151610ba181612bb3565b60008060408385031215612bf857600080fd5b8235612c0381612bb3565b91506020830135612c1381612bb3565b809150509250929050565b60005b83811015612c39578181015183820152602001612c21565b50506000910152565b60008151808452612c5a816020860160208601612c1e565b601f01601f19169290920160200192915050565b602081526000610ba16020830184612c42565b60008060408385031215612c9457600080fd5b8235612c9f81612bb3565b946020939093013593505050565b600060208284031215612cbf57600080fd5b8135610ba181612bb3565b6001600160a01b0391909116815260200190565b600080600060608486031215612cf357600080fd5b8335612cfe81612bb3565b92506020840135612d0e81612bb3565b929592945050506040919091013590565b600060208284031215612d3157600080fd5b5035919050565b6000610100820190508251151582526020830151151560208301526040830151151560408301526060830151151560608301526080830151612d7e608084018215159052565b5060a0830151612d9260a084018215159052565b5060c0830151612da660c084018215159052565b5060e0830151612dba60e084018215159052565b5092915050565b60008060208385031215612dd457600080fd5b82356001600160401b0380821115612deb57600080fd5b818501915085601f830112612dff57600080fd5b813581811115612e0e57600080fd5b8660208260051b8501011115612e2357600080fd5b60209290920196919550909350505050565b602081526000825160a06020840152612e5160c0840182612c42565b90506020840151612e6f604085018280518252602090810151910152565b5060408401516001600160a01b03166080840152606090930151151560a0909201919091525090565b600181811c90821680612eac57607f821691505b602082108103612ecc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081b5761081b612ed2565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600082612f3c57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561081b5761081b612ed2565b60008251612f66818460208701612c1e565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612f9857600080fd5b81516001600160401b0380821115612faf57600080fd5b818401915084601f830112612fc357600080fd5b815181811115612fd557612fd5612f70565b604051601f8201601f19908116603f01168101908382118183101715612ffd57612ffd612f70565b8160405282815287602084870101111561301657600080fd5b6121cf836020830160208801612c1e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161308457613084612ed2565b5060010190565b60006020828403121561309d57600080fd5b5051919050565b9182526001600160a01b0316602082015260400190565b6020808252600290820152614e4d60f01b60408201526060019056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a4e40b9641135954640ca80aed2c263d55c040dd710d9766ebe710002ab0c21364736f6c634300081100330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000b7084866b70adad518b8fcf5aa6ada89e46e75c4000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000087169416aa63f67412503f8b888099258f56fb000000000000000000000000000000000000000000000000000000000112a8800000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087169416aa63f67412503f8b888099258f56fb00000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087169416aa63f67412503f8b888099258f56fb0000000000000000000000000087169416aa63f67412503f8b888099258f56fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045465737400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454455354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087169416aa63f67412503f8b888099258f56fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102675760003560e01c8063024c2ddd146103cb57806306fdde03146103f1578063095ea7b3146104065780630b285b1f1461042957806318160ddd146104555780631cd348c01461045d5780631ec9801d146104775780632150ec291461048257806323b872dd146104935780632a4a09dd146104a65780632d838119146104ae5780632ecaf675146104c157806330d08211146104c957806331392fcb146104d1578063313ce567146104e657806334f6ebf5146104ff57806338b9033314610507578063395093511461050f57806342966c68146105225780634fea2c7a146105355780635c975abb146105485780635f6529a31461055057806361086b00146105615780636303516c1461056957806370a082311461057a578063715018a61461058d5780637ebae80e146105955780638da5cb5b146105da578063936af911146105e257806394e10784146105f557806395d89b41146105fd57806397a9d560146106055780639af1d35a14610622578063a0712d6814610663578063a457c2d714610676578063a4e2d63414610689578063a8b0898214610691578063a9059cbb146106a2578063b17b658d146106b5578063b22941dd146106e1578063c45a015514610701578063ccfa214f14610712578063dd62ed3e146103cb578063eb8e886314610722578063efab831c1461072a578063f10437fc14610735578063f238cc6f14610740578063f2fde38b14610748578063f851a4401461075b578063fa86f8ce1461076c578063fb1eb14b14610774578063fd8191631461077c578063fe575a87146107c8575b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156102b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d59190612bc8565b6040516366ffd66360e11b8152600080356001600160e01b03191660048301529192506001600160a01b0383169063cdffacc690602401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190612bc8565b90506001600160a01b0381166103a45760405162461bcd60e51b8152602060048201526017602482015276119d5b98dd1a5bdb88191bd95cc81b9bdd08195e1a5cdd604a1b60448201526064015b60405180910390fd5b60405136600082376000803683855af43d806000843e8180156103c5578184f35b8184fd5b005b6103de6103d9366004612be5565b6107f4565b6040519081526020015b60405180910390f35b6103f9610821565b6040516103e89190612c6e565b610419610414366004612c81565b6108b6565b60405190151581526020016103e8565b610419610437366004612cad565b6001600160a01b031660009081526012602052604090205460ff1690565b6015546103de565b601d546001600160a01b03165b6040516103e89190612cca565b60255460ff16610419565b600a546001600160a01b031661046a565b6104196104a1366004612cde565b6108cc565b600b546103de565b6103de6104bc366004612d1f565b610ba8565b6034546103de565b6026546103de565b6104d9610bf9565b6040516103e89190612d38565b601b5460ff165b60405160ff90911681526020016103e8565b61046a610c8c565b6001546103de565b61041961051d366004612c81565b610cff565b6103c9610530366004612d1f565b610e18565b6103c9610543366004612d1f565b610fca565b610419611212565b6030546001600160a01b031661046a565b6035546103de565b601e546001600160a01b031661046a565b6103de610588366004612cad565b611241565b6103c96112d0565b604080518082018252600080825260209182015281518083018352602e54808252602f5460ff16151591830191825283519081529051151591810191909152016103e8565b61046a611337565b6103c96105f0366004612dc1565b611346565b6103de6114f7565b6103f961151a565b61060d61152c565b604080519283526020830191909152016103e8565b61062a6116c6565b6040805182518051825260209081015181830152830151818301529082015160608083019190915290910151608082015260a0016103e8565b6103c9610671366004612d1f565b61170a565b610419610684366004612c81565b611746565b6104d961189f565b6023546001600160a01b031661046a565b6104196106b0366004612c81565b611932565b6104196106c3366004612cad565b6001600160a01b031660009081526018602052604090205460ff1690565b6106f46106ef366004612d1f565b611b5c565b6040516103e89190612e35565b601c546001600160a01b031661046a565b603654610100900460ff16610419565b600c546103de565b60365460ff16610419565b600d5460ff166104ed565b602d546103de565b6103c9610756366004612cad565b611c73565b6033546001600160a01b031661046a565b6024546103de565b6017546103de565b610784611d50565b6040516103e89190600060a0820190508251825260208301516020830152604083015160408301526060830151606083015260808301511515608083015292915050565b6104196107d6366004612cad565b6001600160a01b03166000908152601f602052604090205460ff1690565b6001600160a01b038083166000908152601160209081526040808320938516835292905220545b92915050565b60606001601801805461083390612e98565b80601f016020809104026020016040519081016040528092919081815260200182805461085f90612e98565b80156108ac5780601f10610881576101008083540402835291602001916108ac565b820191906000526020600020905b81548152906001019060200180831161088f57829003601f168201915b5050505050905090565b60006108c3338484611e6c565b50600192915050565b601e54600090600160a81b900460ff1661091057601e805460ff60a81b1916600160a81b179055600061090085858561202b565b905061090c8184612ee8565b9250505b603654610100900460ff1615610a0e57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561096a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098e9190612bc8565b6001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201528188166024820152908616604482015260648101859052608401600060405180830381600087803b1580156109f557600080fd5b505af1158015610a09573d6000803e3d6000fd5b505050505b610a198484846121da565b6001600160a01b038416600090815260116020908152604080832033845290915290205482811015610a735760405162461bcd60e51b815260206004820152600360248201526245544160e81b604482015260640161039b565b6001600160a01b038516600090815260116020908152604080832033808552925290912054610aae918791610aa9908790612ee8565b611e6c565b601e805460ff60a81b19169055603654610100900460ff1615610b9b57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190612bc8565b6001600160a01b031663f49062ca3386866040518463ffffffff1660e01b8152600401610b6893929190612efb565b600060405180830381600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050505b60019150505b9392505050565b601654600090821115610be35760405162461bcd60e51b815260206004820152600360248201526220a62960e91b604482015260640161039b565b6000610bed6114f7565b9050610ba18184612f1f565b610c01612af9565b5060408051610100808201835260025460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601c54604080516322d608f360e21b815290516000926001600160a01b031691638b5823cc9160048083019260209291908290030181865afa158015610cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfa9190612bc8565b905090565b603654600090610100900460ff1615610de257601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015610d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d809190612bc8565b6001600160a01b031663cf5961bb3385856040518463ffffffff1660e01b8152600401610daf93929190612efb565b600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b3360008181526011602090815260408083206001600160a01b03881684529091529020546108c391908590610aa9908690612f41565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee79190612bc8565b9050600080826001600160a01b031684604051602401610f0991815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b17905251610f3e9190612f54565b600060405180830381855af49150503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b509150915081610fc457604481511015610f9757600080fd5b80806020019051810190610fab9190612f86565b60405162461bcd60e51b815260040161039b9190612c6e565b50505050565b601c54602480546040516301e2e22f60e51b815260048101919091526000926001600160a01b031691633c5c45e09101602060405180830381865afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b9190612bc8565b9050336001600160a01b0382161461107a5760405162461bcd60e51b8152602060048201526002602482015261524160f01b604482015260640161039b565b61108c81611086611337565b846121da565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156110d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fa9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190612bc8565b9050600080826001600160a01b03168560405160240161117d91815260200190565b60408051601f198184030181529181526020820180516001600160e01b0316630852cd8d60e31b179052516111b29190612f54565b600060405180830381855af49150503d80600081146111ed576040519150601f19603f3d011682016040523d82523d6000602084013e6111f2565b606091505b50915091508161120b57604481511015610f9757600080fd5b5050505050565b600254600090600160301b900460ff16151581036112305750600090565b50601e54600160a01b900460ff1690565b60025460009062010000900460ff16156112b4576001600160a01b03821660009081526012602052604090205460ff161561129257506001600160a01b031660009081526010602052604090205490565b6001600160a01b0382166000908152600f602052604090205461081b90610ba8565b506001600160a01b031660009081526010602052604090205490565b336112d9611337565b6001600160a01b0316146112ff5760405162461bcd60e51b815260040161039b90613027565b600080546040516001600160a01b03909116906000805160206130d8833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b603654610100900460ff1661135a57600080fd5b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156113a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c89190612bc8565b6001600160a01b0316336001600160a01b03161461140e5760405162461bcd60e51b81526020600482015260036024820152621313d360ea1b604482015260640161039b565b60005b818110156114f2576114e083838381811061142e5761142e61305c565b90506020020160208101906114439190612cad565b601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b19190612bc8565b6114db8686868181106114c6576114c661305c565b90506020020160208101906105889190612cad565b6121da565b806114ea81613072565b915050611411565b505050565b600080600061150461152c565b90925090506115138183612f1f565b9250505090565b60606001601901805461083390612e98565b6016546015546000918291825b60135481101561169457826001600e016000600160120184815481106115615761156161305c565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806115d25750816001600f016000600160120184815481106115ab576115ab61305c565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156115e95750506016546015549094909350915050565b60138054600f91600091849081106116035761160361305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116329084612ee8565b92506001600f016000600160120183815481106116515761165161305c565b60009182526020808320909101546001600160a01b031683528201929092526040019020546116809083612ee8565b91508061168c81613072565b915050611539565b506015546016546116a59190612f1f565b8210156116bd57505060165460155490939092509050565b90939092509050565b6116ce612b3d565b506040805160c0810182526004546080820190815260055460a08301528152600654602082015260075491810191909152600854606082015290565b33611713611337565b6001600160a01b0316146117395760405162461bcd60e51b815260040161039b90613027565b61174333826126f7565b50565b603654600090610100900460ff161561182957601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190612bc8565b6001600160a01b031663568c75a93385856040518463ffffffff1660e01b81526004016117f693929190612efb565b600060405180830381600087803b15801561181057600080fd5b505af1158015611824573d6000803e3d6000fd5b505050505b3360009081526011602090815260408083206001600160a01b0387168452909152902054828110156118865760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a12d60e11b604082015260600190565b6118953385610aa98685612ee8565b5060019392505050565b6118a7612af9565b5060408051610100808201835260035460ff80821615158452918104821615156020840152620100008104821615159383019390935263010000008304811615156060830152600160201b8304811615156080830152600160281b83048116151560a0830152600160301b83048116151560c0830152600160381b909204909116151560e082015290565b601e54600090600160a81b900460ff1661197c57601e805460ff60a81b1916600160a81b179055600061196c6119653390565b858561202b565b90506119788184612ee8565b9250505b603654610100900460ff1615611a5c57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156119d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fa9190612bc8565b6001600160a01b0316631ffb811f3385856040518463ffffffff1660e01b8152600401611a2993929190612efb565b600060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b505050505b611a673384846121da565b601e805460ff60a81b19169055603654610100900460ff16156108c357601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611ace573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af29190612bc8565b6001600160a01b031663f49062ca3385856040518463ffffffff1660e01b8152600401611b2193929190612efb565b600060405180830381600087803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b5050505050600192915050565b611b64612b6b565b6009805483908110611b7857611b7861305c565b9060005260206000209060040201604051806080016040529081600082018054611ba190612e98565b80601f0160208091040260200160405190810160405280929190818152602001828054611bcd90612e98565b8015611c1a5780601f10611bef57610100808354040283529160200191611c1a565b820191906000526020600020905b815481529060010190602001808311611bfd57829003601f168201915b50505091835250506040805180820182526001840154815260028401546020808301919091528301526003909201546001600160a01b03811692820192909252600160a01b90910460ff16151560609091015292915050565b33611c7c611337565b6001600160a01b031614611ca25760405162461bcd60e51b815260040161039b90613027565b6001600160a01b038116611d075760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161039b565b600080546040516001600160a01b03808516939216916000805160206130d883398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611d846040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b506040805160a0810182526027548152602854602082015260295491810191909152602a546060820152602b5460ff161515608082015290565b6000808060001985870985870292508281108382030391505080600003611df75760008411611dec57600080fd5b508290049050610ba1565b808411611e0357600080fd5b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6001600160a01b038316611eab5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0a32d60e11b604082015260600190565b6001600160a01b038216611eea5760405162461bcd60e51b815260040161039b9060208082526004908201526322a0aa2d60e11b604082015260600190565b603654610100900460ff1615611fca57601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa158015611f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f689190612bc8565b6001600160a01b03166347abf3be8484846040518463ffffffff1660e01b8152600401611f9793929190612efb565b600060405180830381600087803b158015611fb157600080fd5b505af1158015611fc5573d6000803e3d6000fd5b505050505b6001600160a01b0383811660008181526011602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806001601b0160009054906101000a90046001600160a01b03166001600160a01b031663f577d9806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612084573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a89190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121099190612bc8565b9050600080826001600160a01b031687878760405160240161212d93929190612efb565b60408051601f198184030181529181526020820180516001600160e01b0316630da753b760e31b179052516121629190612f54565b600060405180830381855af49150503d806000811461219d576040519150601f19603f3d011682016040523d82523d6000602084013e6121a2565b606091505b5091509150816121bb57604481511015610f9757600080fd5b808060200190518101906121cf919061308b565b979650505050505050565b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122489190612bc8565b6001600160a01b031663c7249c576040518163ffffffff1660e01b8152600401602060405180830381865afa158015612285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a99190612bc8565b60255490915060ff1680156122c05750602b5460ff165b80156122e457506001600160a01b03841660009081526018602052604090205460ff165b1561239a57600080826001600160a01b031684866040516024016123099291906130a4565b60408051601f198184030181529181526020820180516001600160e01b03166333bbcf1d60e11b1790525161233e9190612f54565b600060405180830381855af49150503d8060008114612379576040519150601f19603f3d011682016040523d82523d6000602084013e61237e565b606091505b50915091508161239757604481511015610f9757600080fd5b50505b600254600160381b900460ff1680156123cb57506001600160a01b03841660009081526018602052604090205460ff165b1561248157600080826001600160a01b031684866040516024016123f09291906130a4565b60408051601f198184030181529181526020820180516001600160e01b0316631cf707f160e31b179052516124259190612f54565b600060405180830381855af49150503d8060008114612460576040519150601f19603f3d011682016040523d82523d6000602084013e612465565b606091505b50915091508161247e57604481511015610f9757600080fd5b50505b60255460ff1680156124955750602f5460ff165b80156124b957506001600160a01b03841660009081526018602052604090205460ff165b1561256d57600080826001600160a01b0316856040516024016124dc9190612cca565b60408051601f198184030181529181526020820180516001600160e01b0316631f35506360e11b179052516125119190612f54565b600060405180830381855af49150503d806000811461254c576040519150601f19603f3d011682016040523d82523d6000602084013e612551565b606091505b50915091508161256a57604481511015610f9757600080fd5b50505b601c54604080516301eaefb360e71b815290516000926001600160a01b03169163f577d9809160048083019260209291908290030181865afa1580156125b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125db9190612bc8565b6001600160a01b03166387265bac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612bc8565b9050600080826001600160a01b031687878760405160240161266093929190612efb565b60408051601f198184030181529181526020820180516001600160e01b03166318703c4f60e11b179052516126959190612f54565b600060405180830381855af49150503d80600081146126d0576040519150601f19603f3d011682016040523d82523d6000602084013e6126d5565b606091505b5091509150816126ee57604481511015610f9757600080fd5b50505050505050565b6001600160a01b0382166127335760405162461bcd60e51b815260206004820152600360248201526222a6ad60e91b604482015260640161039b565b600254600160281b900460ff1661275c5760405162461bcd60e51b815260040161039b906130bb565b60025462010000900460ff16156127855760405162461bcd60e51b815260040161039b906130bb565b603654610100900460ff161561286757601c54604080516322d608f360e21b815290516001600160a01b0390921691638b5823cc916004808201926020929091908290030181865afa1580156127df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128039190612bc8565b6040516218a28b60e61b81526001600160a01b038481166004830152602482018490529190911690630628a2c090604401600060405180830381600087803b15801561284e57600080fd5b505af1158015612862573d6000803e3d6000fd5b505050505b601c54604080516323ba783160e21b815290516000926001600160a01b031691638ee9e0c49160048083019260209291908290030181865afa1580156128b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d59190612bc8565b905060006129a683836001600160a01b031663ced72f876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561291b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293f919061308b565b846001600160a01b031663f4e1fc416040518163ffffffff1660e01b8152600401602060405180830381865afa15801561297d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a1919061308b565b611dbe565b90506000826001600160a01b0316634e7ceacb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0c9190612bc8565b90508360016014016000828254612a239190612f41565b90915550506001600160a01b03811660009081526010602052604081208054849290612a50908490612f41565b90915550612a6090508285612ee8565b6001600160a01b03861660009081526010602052604081208054909190612a88908490612f41565b90915550506040518281526001600160a01b038216906000906000805160206130f88339815191529060200160405180910390a36001600160a01b03851660006000805160206130f8833981519152612ae18588612ee8565b60405190815260200160405180910390a35050505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b6040518060800160405280612b50612b99565b81526020016000815260200160008152602001600081525090565b604051806080016040528060608152602001612b85612b99565b815260006020820181905260409091015290565b604051806040016040528060008152602001600081525090565b6001600160a01b038116811461174357600080fd5b600060208284031215612bda57600080fd5b8151610ba181612bb3565b60008060408385031215612bf857600080fd5b8235612c0381612bb3565b91506020830135612c1381612bb3565b809150509250929050565b60005b83811015612c39578181015183820152602001612c21565b50506000910152565b60008151808452612c5a816020860160208601612c1e565b601f01601f19169290920160200192915050565b602081526000610ba16020830184612c42565b60008060408385031215612c9457600080fd5b8235612c9f81612bb3565b946020939093013593505050565b600060208284031215612cbf57600080fd5b8135610ba181612bb3565b6001600160a01b0391909116815260200190565b600080600060608486031215612cf357600080fd5b8335612cfe81612bb3565b92506020840135612d0e81612bb3565b929592945050506040919091013590565b600060208284031215612d3157600080fd5b5035919050565b6000610100820190508251151582526020830151151560208301526040830151151560408301526060830151151560608301526080830151612d7e608084018215159052565b5060a0830151612d9260a084018215159052565b5060c0830151612da660c084018215159052565b5060e0830151612dba60e084018215159052565b5092915050565b60008060208385031215612dd457600080fd5b82356001600160401b0380821115612deb57600080fd5b818501915085601f830112612dff57600080fd5b813581811115612e0e57600080fd5b8660208260051b8501011115612e2357600080fd5b60209290920196919550909350505050565b602081526000825160a06020840152612e5160c0840182612c42565b90506020840151612e6f604085018280518252602090810151910152565b5060408401516001600160a01b03166080840152606090930151151560a0909201919091525090565b600181811c90821680612eac57607f821691505b602082108103612ecc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081b5761081b612ed2565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600082612f3c57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561081b5761081b612ed2565b60008251612f66818460208701612c1e565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612f9857600080fd5b81516001600160401b0380821115612faf57600080fd5b818401915084601f830112612fc357600080fd5b815181811115612fd557612fd5612f70565b604051601f8201601f19908116603f01168101908382118183101715612ffd57612ffd612f70565b8160405282815287602084870101111561301657600080fd5b6121cf836020830160208801612c1e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006001820161308457613084612ed2565b5060010190565b60006020828403121561309d57600080fd5b5051919050565b9182526001600160a01b0316602082015260400190565b6020808252600290820152614e4d60f01b60408201526060019056fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220a4e40b9641135954640ca80aed2c263d55c040dd710d9766ebe710002ab0c21364736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000b7084866b70adad518b8fcf5aa6ada89e46e75c4000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000087169416aa63f67412503f8b888099258f56fb000000000000000000000000000000000000000000000000000000000112a8800000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087169416aa63f67412503f8b888099258f56fb00000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087169416aa63f67412503f8b888099258f56fb0000000000000000000000000087169416aa63f67412503f8b888099258f56fb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045465737400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454455354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000087169416aa63f67412503f8b888099258f56fb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _factory (address): 0xB7084866b70AdAD518B8FCf5AA6adA89e46E75c4
-----Encoded View---------------
58 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000b7084866b70adad518b8fcf5aa6ada89e46e75c4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000560
Arg [3] : 00000000000000000000000000000000000000000000000000000000000005a0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 0000000000000000000000000087169416aa63f67412503f8b888099258f56fb
Arg [6] : 000000000000000000000000000000000000000000000000000000000112a880
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [29] : 0000000000000000000000000087169416aa63f67412503f8b888099258f56fb
Arg [30] : 00000000000000000000000000000000000000000000000000000000000005e0
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [34] : 0000000000000000000000000087169416aa63f67412503f8b888099258f56fb
Arg [35] : 0000000000000000000000000087169416aa63f67412503f8b888099258f56fb
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [42] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [45] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [46] : 5465737400000000000000000000000000000000000000000000000000000000
Arg [47] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [48] : 5445535400000000000000000000000000000000000000000000000000000000
Arg [49] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [51] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [53] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [54] : 0000000000000000000000000087169416aa63f67412503f8b888099258f56fb
Arg [55] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [56] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [57] : 7465737400000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
133042:18203:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;150481:9;;150468:40;;;-1:-1:-1;;;150468:40:0;;;;150446:19;;-1:-1:-1;;;;;150481:9:0;;150468:38;;:40;;;;;;;;;;;;;;150481:9;150468:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;150536:47;;-1:-1:-1;;;150536:47:0;;150520:13;150575:7;;-1:-1:-1;;;;;;150575:7:0;150536:47;;;550:52:1;150446:62:0;;-1:-1:-1;;;;;;150536:38:0;;;;;523:18:1;;150536:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;150520:63;-1:-1:-1;;;;;;150602:19:0;;150594:55;;;;-1:-1:-1;;;150594:55:0;;815:2:1;150594:55:0;;;797:21:1;854:2;834:18;;;827:30;-1:-1:-1;;;873:18:1;;;866:53;936:18;;150594:55:0;;;;;;;;;150701:4;150695:11;150741:14;150738:1;150733:3;150720:36;150944:1;150924;150891:14;150869:3;150845:5;150821;150790:170;150988:16;151041:4;151038:1;151033:3;151018:28;151069:6;151089:58;;;;151200:4;151195:3;151188:17;151089:58;151127:4;151122:3;151115:17;151062:158;;139393:150;;;;;;:::i;:::-;;:::i;:::-;;;1504:25:1;;;1492:2;1477:18;139393:150:0;;;;;;;;138056:85;;;:::i;:::-;;;;;;;:::i;144227:152::-;;;;;;:::i;:::-;;:::i;:::-;;;2877:14:1;;2870:22;2852:41;;2840:2;2825:18;144227:152:0;2712:187:1;139551:115:0;;;;;;:::i;:::-;-1:-1:-1;;;;;139635:23:0;139611:4;139635:23;;;:13;:23;;;;;;;;;139551:115;138339:88;138410:9;;138339:88;;139981:96;140054:15;;-1:-1:-1;;;;;140054:15:0;139981:96;;;;;;;:::i;140389:87::-;140456:12;;;;140389:87;;138983:110;139063:22;;-1:-1:-1;;;;;139063:22:0;138983:110;;144387:962;;;;;;:::i;:::-;;:::i;139101:100::-;139176:17;;139101:100;;142284:213;;;;;;:::i;:::-;;:::i;141179:98::-;141253:16;;141179:98;;140484:108;140563:21;;140484:108;;138545:103;;;:::i;:::-;;;;;;;:::i;138246:85::-;138312:11;;;;138246:85;;;5147:4:1;5135:17;;;5117:36;;5105:2;5090:18;138246:85:0;4975:184:1;141635:156:0;;;:::i;138435:102::-;138511:1;:18;138435:102;;145357:401;;;;;;:::i;:::-;;:::i;149787:411::-;;;;;;:::i;:::-;;:::i;136478:614::-;;;;;;:::i;:::-;;:::i;136064:166::-;;;:::i;140987:96::-;141060:15;;-1:-1:-1;;;;;141060:15:0;140987:96;;141285:118;141369:26;;141285:118;;140085:86;140153:10;;-1:-1:-1;;;;;140153:10:0;140085:86;;141910:290;;;;;;:::i;:::-;;:::i;8314:148::-;;;:::i;140837:142::-;-1:-1:-1;;;;;;;;;;;;;;;;;140938:33:0;;;;;;;140945:26;140938:33;;;;;;;;;;;;;;;;140837:142;;5630:32:1;;;5714:24;;5707:32;5700:40;5678:20;;;5671:70;;;;5603:18;140837:142:0;5400:347:1;7663:87:0;;;:::i;135257:420::-;;;;;;:::i;:::-;;:::i;142505:159::-;;;:::i;138149:89::-;;;:::i;142672:585::-;;;:::i;:::-;;;;6546:25:1;;;6602:2;6587:18;;6580:34;;;;6519:18;142672:585:0;6372:248:1;138765:82:0;;;:::i;:::-;;;;6987:13:1;;6694:12;;6682:25;;6756:4;6745:16;;;6739:23;6723:14;;;6716:47;7056:17;;7050:24;7028:20;;;7021:54;7119:17;;;7113:24;7106:4;7091:20;;;7084:54;;;;7182:17;;;7176:24;7169:4;7154:20;;7147:54;6952:3;6937:19;138765:82:0;6774:433:1;148732:91:0;;;;;;:::i;:::-;;:::i;145766:534::-;;;;;;:::i;:::-;;:::i;138660:97::-;;;:::i;140179:92::-;140250:13;;-1:-1:-1;;;;;140250:13:0;140179:92;;143349:724;;;;;;:::i;:::-;;:::i;139772:109::-;;;;;;:::i;:::-;-1:-1:-1;;;;;139853:20:0;139829:4;139853:20;;;:10;:20;;;;;;;;;139772:109;138855:120;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;139889:84::-;139956:9;;-1:-1:-1;;;;;139956:9:0;139889:84;;141536:91;141605:14;;;;;;;141536:91;;139209:82;139275:8;;139209:82;;141411:117;141493:27;;;;141411:117;;139299:86;139366:11;;;;139299:86;;140723:106;140801:20;;140723:106;;8617:244;;;;;;:::i;:::-;;:::i;141091:80::-;141156:7;;-1:-1:-1;;;;;141156:7:0;141091:80;;140283:98;140357:16;;140283:98;;139674:90;139744:12;;139674:90;;140600:115;;;:::i;:::-;;;;;;8032:4:1;8074:3;8063:9;8059:19;8051:27;;8111:6;8105:13;8094:9;8087:32;8175:4;8167:6;8163:17;8157:24;8150:4;8139:9;8135:20;8128:54;8238:4;8230:6;8226:17;8220:24;8213:4;8202:9;8198:20;8191:54;8301:4;8293:6;8289:17;8283:24;8276:4;8265:9;8261:20;8254:54;8378:4;8370:6;8366:17;8360:24;8353:32;8346:40;8339:4;8328:9;8324:20;8317:70;7874:519;;;;;135833:115:0;;;;;;:::i;:::-;-1:-1:-1;;;;;135919:21:0;135895:4;135919:21;;;:11;:21;;;;;;;;;135833:115;139393:150;-1:-1:-1;;;;;139500:24:0;;;139473:7;139500:24;;;:13;:24;;;;;;;;:35;;;;;;;;;;139393:150;;;;;:::o;138056:85::-;138093:13;138126:1;:7;;138119:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138056:85;:::o;144227:152::-;144293:4;144310:39;6272:10;144333:7;144342:6;144310:8;:39::i;:::-;-1:-1:-1;144367:4:0;144227:152;;;;:::o;144387:962::-;144497:9;;144476:4;;-1:-1:-1;;;144497:9:0;;;;144493:175;;144523:9;:16;;-1:-1:-1;;;;144523:16:0;-1:-1:-1;;;144523:16:0;;;;144579:38;144591:6;144599:9;144610:6;144579:11;:38::i;:::-;144554:63;-1:-1:-1;144632:24:0;144554:63;144632:24;;:::i;:::-;;;144508:160;144493:175;144682:14;;;;;;;144678:175;;;144746:9;;144733:47;;;-1:-1:-1;;;144733:47:0;;;;-1:-1:-1;;;;;144746:9:0;;;;144733:45;;:47;;;;;;;;;;;;;;;144746:9;144733:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;144713:87:0;;6272:10;144713:128;;-1:-1:-1;;;;;;144713:128:0;;;;;;;-1:-1:-1;;;;;9335:15:1;;;144713:128:0;;;9317:34:1;9387:15;;;9367:18;;;9360:43;9439:15;;;9419:18;;;9412:43;9471:18;;;9464:34;;;9251:19;;144713:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144678:175;144863:36;144873:6;144881:9;144892:6;144863:9;:36::i;:::-;-1:-1:-1;;;;;144939:21:0;;144912:24;144939:21;;;:13;:21;;;;;;;;6272:10;144939:35;;;;;;;;144993:26;;;;144985:42;;;;-1:-1:-1;;;144985:42:0;;9711:2:1;144985:42:0;;;9693:21:1;9750:1;9730:18;;;9723:29;-1:-1:-1;;;9768:18:1;;;9761:33;9811:18;;144985:42:0;9509:326:1;144985:42:0;-1:-1:-1;;;;;145071:21:0;;;;;;:13;:21;;;;;;;;6272:10;145071:35;;;;;;;;;145040:76;;145049:6;;145071:44;;145109:6;;145071:44;:::i;:::-;145040:8;:76::i;:::-;145129:9;:17;;-1:-1:-1;;;;145129:17:0;;;145161:14;;145129:17;145161:14;;145129:17;145161:14;145157:162;;;145225:9;;145212:47;;;-1:-1:-1;;;145212:47:0;;;;-1:-1:-1;;;;;145225:9:0;;;;145212:45;;:47;;;;;;;;;;;;;;;145225:9;145212:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;145192:82:0;;6272:10;145289:9;145300:6;145192:115;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145157:162;145337:4;145330:11;;;144387:962;;;;;;:::o;142284:213::-;142389:9;;142350:7;;142378:20;;;142370:36;;;;-1:-1:-1;;;142370:36:0;;10422:2:1;142370:36:0;;;10404:21:1;10461:1;10441:18;;;10434:29;-1:-1:-1;;;10479:18:1;;;10472:33;10522:18;;142370:36:0;10220:326:1;142370:36:0;142417:19;142440:10;:8;:10::i;:::-;142417:33;-1:-1:-1;142468:21:0;142417:33;142468:7;:21;:::i;138545:103::-;138589:18;;:::i;:::-;-1:-1:-1;138620:20:0;;;;;;;;;138627:13;138620:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;138620:20:0;;;;;;;;;;-1:-1:-1;;;138620:20:0;;;;;;;;;;-1:-1:-1;;;138620:20:0;;;;;;;;;;-1:-1:-1;;;138620:20:0;;;;;;;;;;;;;138545:103::o;141635:156::-;141748:9;;141735:47;;;-1:-1:-1;;;141735:47:0;;;;141676:19;;-1:-1:-1;;;;;141748:9:0;;141735:45;;:47;;;;;;;;;;;;;;141748:9;141735:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;141708:75;;141635:156;:::o;145357:401::-;145466:14;;145445:4;;145466:14;;;;;145462:174;;;145530:9;;145517:47;;;-1:-1:-1;;;145517:47:0;;;;-1:-1:-1;;;;;145530:9:0;;;;145517:45;;:47;;;;;;;;;;;;;;;145530:9;145517:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;145497:92:0;;6272:10;145604:7;145613:10;145497:127;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145462:174;6272:10;145678:27;;;;:13;:27;;;;;;;;-1:-1:-1;;;;;145678:36:0;;;;;;;;;;145646:82;;6272:10;145669:7;;145678:49;;145717:10;;145678:49;:::i;149787:411::-;149887:9;;149874:40;;;-1:-1:-1;;;149874:40:0;;;;149835:23;;-1:-1:-1;;;;;149887:9:0;;149874:38;;:40;;;;;;;;;;;;;;149887:9;149874:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;149861:66:0;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;149835:94;;149941:12;149955:19;149978:15;-1:-1:-1;;;;;149978:28:0;150048:6;150007:48;;;;;;1504:25:1;;1492:2;1477:18;;1358:177;150007:48:0;;;;-1:-1:-1;;150007:48:0;;;;;;;;;;;;;;-1:-1:-1;;;;;150007:48:0;-1:-1:-1;;;150007:48:0;;;149978:78;;;150007:48;149978:78;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149940:116;;;;150072:7;150067:124;;150116:2;150100:6;:13;:18;150096:32;;;150120:8;;;150096:32;150161:6;150150:28;;;;;;;;;;;;:::i;:::-;150143:36;;-1:-1:-1;;;150143:36:0;;;;;;;;:::i;150067:124::-;149824:374;;;149787:411;:::o;136478:614::-;136569:9;;136600:16;;;136556:61;;-1:-1:-1;;;136556:61:0;;;;;1504:25:1;;;;136536:17:0;;-1:-1:-1;;;;;136569:9:0;;136556:43;;1477:18:1;136556:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;136536:81;-1:-1:-1;136636:10:0;-1:-1:-1;;;;;136636:23:0;;;136628:38;;;;-1:-1:-1;;;136628:38:0;;12431:2:1;136628:38:0;;;12413:21:1;12470:1;12450:18;;;12443:29;-1:-1:-1;;;12488:18:1;;;12481:32;12530:18;;136628:38:0;12229:325:1;136628:38:0;136677;136687:9;136698:7;:5;:7::i;:::-;136707;136677:9;:38::i;:::-;136780:9;;136767:40;;;-1:-1:-1;;;136767:40:0;;;;136728:23;;-1:-1:-1;;;;;136780:9:0;;136767:38;;:40;;;;;;;;;;;;;;136780:9;136767:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;136754:66:0;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;136728:94;;136834:12;136848:19;136871:15;-1:-1:-1;;;;;136871:28:0;136941:7;136900:49;;;;;;1504:25:1;;1492:2;1477:18;;1358:177;136900:49:0;;;;-1:-1:-1;;136900:49:0;;;;;;;;;;;;;;-1:-1:-1;;;;;136900:49:0;-1:-1:-1;;;136900:49:0;;;136871:79;;;136900:49;136871:79;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;136833:117;;;;136966:7;136961:124;;137010:2;136994:6;:13;:18;136990:32;;;137014:8;;;136961:124;136525:567;;;;136478:614;:::o;136064:166::-;136123:13;:22;136103:4;;-1:-1:-1;;;136123:22:0;;;;:31;;;;136120:75;;-1:-1:-1;136178:5:0;;136064:166::o;136120:75::-;-1:-1:-1;136212:10:0;;-1:-1:-1;;;136212:10:0;;;;;136064:166::o;141910:290::-;141990:13;:23;141967:7;;141990:23;;;;;141987:170;;;-1:-1:-1;;;;;142034:22:0;;;;;;:13;:22;;;;;;;;142030:53;;;-1:-1:-1;;;;;;142065:18:0;;;;;:9;:18;;;;;;;141910:290::o;142030:53::-;-1:-1:-1;;;;;142125:18:0;;;;;;:9;:18;;;;;;142105:39;;:19;:39::i;141987:170::-;-1:-1:-1;;;;;;142174:18:0;;;;;:9;:18;;;;;;;141910:290::o;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;135257:420::-;135347:14;;;;;;;135339:23;;;;;;135454:9;;135441:47;;;-1:-1:-1;;;135441:47:0;;;;-1:-1:-1;;;;;135454:9:0;;;;135441:45;;:47;;;;;;;;;;;;;;;135454:9;135441:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;135417:72:0;6272:10;-1:-1:-1;;;;;135417:72:0;;135409:88;;;;-1:-1:-1;;;135409:88:0;;13122:2:1;135409:88:0;;;13104:21:1;13161:1;13141:18;;;13134:29;-1:-1:-1;;;13179:18:1;;;13172:33;13222:18;;135409:88:0;12920:326:1;135409:88:0;135513:6;135508:162;135525:15;;;135508:162;;;135562:96;135572:4;;135577:1;135572:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;135602:9;;135589:47;;;-1:-1:-1;;;135589:47:0;;;;-1:-1:-1;;;;;135602:9:0;;;;135589:45;;:47;;;;;;;;;;;;;;;135602:9;135589:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;135639:18;135649:4;;135654:1;135649:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;135639:18::-;135562:9;:96::i;:::-;135542:3;;;;:::i;:::-;;;;135508:162;;;;135257:420;;:::o;142505:159::-;142545:7;142566:15;142583;142602:19;:17;:19::i;:::-;142565:56;;-1:-1:-1;142565:56:0;-1:-1:-1;142639:17:0;142565:56;;142639:17;:::i;:::-;142632:24;;;;142505:159;:::o;138149:89::-;138188:13;138221:1;:9;;138214:16;;;;;:::i;142672:585::-;142768:9;;;142806;142721:7;;;;;142832:305;142856:11;:18;142852:22;;142832:305;;;142928:7;142900:1;:9;;:25;142910:1;:11;;142922:1;142910:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;142910:14:0;142900:25;;;;;;;;;;;;;:35;;:74;;;142967:7;142939:1;:9;;:25;142949:1;:11;;142961:1;142949:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;142949:14:0;142939:25;;;;;;;;;;;;;:35;142900:74;142896:109;;;-1:-1:-1;;142984:9:0;;;142995;142984;;142995;;-1:-1:-1;142672:585:0;-1:-1:-1;;142672:585:0:o;142896:109::-;143050:11;:14;;143040:9;;:25;;143062:1;;143050:14;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;143050:14:0;143040:25;;;;;;;;;;;;;143030:35;;:7;:35;:::i;:::-;143020:45;;143100:1;:9;;:25;143110:1;:11;;143122:1;143110:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;143110:14:0;143100:25;;;;;;;;;;;;;143090:35;;:7;:35;:::i;:::-;143080:45;-1:-1:-1;142876:3:0;;;;:::i;:::-;;;;142832:305;;;-1:-1:-1;143173:9:0;;143161;;:21;;143173:9;143161:21;:::i;:::-;143151:7;:31;143147:66;;;-1:-1:-1;;143192:9:0;;;143203;143192;;143203;;-1:-1:-1;142672:585:0;-1:-1:-1;142672:585:0:o;143147:66::-;143232:7;;143241;;-1:-1:-1;142672:585:0;-1:-1:-1;142672:585:0:o;138765:82::-;138802:11;;:::i;:::-;-1:-1:-1;138826:13:0;;;;;;;;138833:6;138826:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;138826:13:0;;;;138765:82::o;148732:91::-;6272:10;7883:7;:5;:7::i;:::-;-1:-1:-1;;;;;7883:23:0;;7875:68;;;;-1:-1:-1;;;7875:68:0;;;;;;;:::i;:::-;148790:25:::1;148796:10;148808:6;148790:5;:25::i;:::-;148732:91:::0;:::o;145766:534::-;145881:14;;145859:4;;145881:14;;;;;145877:179;;;145945:9;;145932:47;;;-1:-1:-1;;;145932:47:0;;;;-1:-1:-1;;;;;145945:9:0;;;;145932:45;;:47;;;;;;;;;;;;;;;145945:9;145932:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;145912:92:0;;6272:10;146019:7;146028:15;145912:132;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145877:179;6272:10;146066:24;146093:27;;;:13;:27;;;;;;;;-1:-1:-1;;;;;146093:36:0;;;;;;;;;;146148:35;;;;146140:52;;;;-1:-1:-1;;;146140:52:0;;;;;;13725:2:1;13707:21;;;13764:1;13744:18;;;13737:29;-1:-1:-1;;;13797:2:1;13782:18;;13775:34;13841:2;13826:18;;13523:327;146140:52:0;146203:67;6272:10;146226:7;146235:34;146254:15;146235:16;:34;:::i;146203:67::-;-1:-1:-1;146288:4:0;;145766:534;-1:-1:-1;;;145766:534:0:o;138660:97::-;138701:18;;:::i;:::-;-1:-1:-1;138732:17:0;;;;;;;;;138739:10;138732:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;138732:17:0;;;;;;;;;;-1:-1:-1;;;138732:17:0;;;;;;;;;;-1:-1:-1;;;138732:17:0;;;;;;;;;;-1:-1:-1;;;138732:17:0;;;;;;;;;;;;;138660:97::o;143349:724::-;143439:9;;143418:4;;-1:-1:-1;;;143439:9:0;;;;143435:181;;143465:9;:16;;-1:-1:-1;;;;143465:16:0;-1:-1:-1;;;143465:16:0;;;;143521:44;143533:12;6272:10;;6192:98;143533:12;143547:9;143558:6;143521:11;:44::i;:::-;143496:69;-1:-1:-1;143580:24:0;143496:69;143580:24;;:::i;:::-;;;143450:166;143435:181;143630:14;;;;;;;143626:163;;;143694:9;;143681:47;;;-1:-1:-1;;;143681:47:0;;;;-1:-1:-1;;;;;143694:9:0;;;;143681:45;;:47;;;;;;;;;;;;;;;143694:9;143681:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;143661:83:0;;6272:10;143759:9;143770:6;143661:116;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143626:163;143800:42;6272:10;143824:9;143835:6;143800:9;:42::i;:::-;143853:9;:17;;-1:-1:-1;;;;143853:17:0;;;143885:14;;143853:17;143885:14;;143853:17;143885:14;143881:162;;;143949:9;;143936:47;;;-1:-1:-1;;;143936:47:0;;;;-1:-1:-1;;;;;143949:9:0;;;;143936:45;;:47;;;;;;;;;;;;;;;143949:9;143936:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;143916:82:0;;6272:10;144013:9;144024:6;143916:115;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;144061:4:0;143349:724;;;;:::o;138855:120::-;138910:16;;:::i;:::-;138946:13;:21;;138960:6;;138946:21;;;;;;:::i;:::-;;;;;;;;;;;138939:28;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;138939:28:0;;;-1:-1:-1;;138939:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;138939:28:0;;;;;;;;;-1:-1:-1;;;138939:28:0;;;;;;;;;;;;;;-1:-1:-1;;138855:120: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;;14057:2:1;8698:73:0::1;::::0;::::1;14039:21:1::0;14096:2;14076:18;;;14069:30;14135:34;14115:18;;;14108:62;-1:-1:-1;;;14186:18:1;;;14179:36;14232:19;;8698:73:0::1;13855: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;140600:115::-;140648:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140648:22:0;-1:-1:-1;140683:24:0;;;;;;;;140690:17;140683:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140600:115::o;72774:3745::-;72874:14;;;-1:-1:-1;;73354:1:0;73351;73344:20;73390:1;73387;73383:9;73374:18;;73438:5;73434:2;73431:13;73423:5;73419:2;73415:14;73411:34;73402:43;;;73519:5;73528:1;73519:10;73515:161;;73564:1;73550:11;:15;73542:24;;;;;;-1:-1:-1;73611:23:0;;;;-1:-1:-1;73655:13:0;;73515:161;73795:5;73781:11;:19;73773:28;;;;;;74062:17;74132:11;74129:1;74126;74119:25;75462:1;74526;74492:31;;:35;;74491:51;;74639:22;;;;75443:1;:15;;75442:21;;75693:17;;;75689:21;;75682:28;75752:17;;;75748:21;;75741:28;75812:17;;;75808:21;;75801:28;75872:17;;;75868:21;;75861:28;75932:17;;;75928:21;;75921:28;75993:17;;;75989:21;;;75982:28;;;74476:12;75022;;;75018:23;;;75014:31;;;74249:20;;;74238:32;;;75075:12;;;;74289:21;;74772:16;;;;75066:21;;;;76465:11;;;-1:-1:-1;;;;72774:3745:0:o;146308:446::-;-1:-1:-1;;;;;146402:20:0;;146394:37;;;;-1:-1:-1;;;146394:37:0;;;;;;14464:2:1;14446:21;;;14503:1;14483:18;;;14476:29;-1:-1:-1;;;14536:2:1;14521:18;;14514:34;14580:2;14565:18;;14262:327;146394:37:0;-1:-1:-1;;;;;146450:21:0;;146442:38;;;;-1:-1:-1;;;146442:38:0;;;;;;14796:2:1;14778:21;;;14835:1;14815:18;;;14808:29;-1:-1:-1;;;14868:2:1;14853:18;;14846:34;14912:2;14897:18;;14594:327;146442:38:0;146495:14;;;;;;;146491:154;;;146559:9;;146546:47;;;-1:-1:-1;;;146546:47:0;;;;-1:-1:-1;;;;;146559:9:0;;;;146546:45;;:47;;;;;;;;;;;;;;;146559:9;146546:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;146526:82:0;;146609:6;146617:7;146626:6;146526:107;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146491:154;-1:-1:-1;;;;;146658:21:0;;;;;;;:13;:21;;;;;;;;:30;;;;;;;;;;;;;:39;;;146713:33;;1504:25:1;;;146713:33:0;;1477:18:1;146713:33:0;;;;;;;146308:446;;;:::o;137443:587::-;137541:22;137576:23;137628:1;:9;;;;;;;;;;-1:-1:-1;;;;;137628:9:0;-1:-1:-1;;;;;137615:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;137602:66:0;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;137576:94;;137682:12;137696:19;137719:15;-1:-1:-1;;;;;137719:28:0;137812:6;137820:9;137831:6;137748:90;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;137748:90:0;;;;;;;;;;;;;;-1:-1:-1;;;;;137748:90:0;-1:-1:-1;;;137748:90:0;;;137719:120;;;137748:90;137719:120;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137681:158;;;;137855:7;137850:124;;137899:2;137883:6;:13;:18;137879:32;;;137903:8;;;137850:124;138002:6;137991:29;;;;;;;;;;;;:::i;:::-;137984:36;137443:587;-1:-1:-1;;;;;;;137443:587:0:o;146762:1862::-;146934:9;;146921:40;;;-1:-1:-1;;;146921:40:0;;;;146878:27;;-1:-1:-1;;;;;146934:9:0;;146921:38;;:40;;;;;;;;;;;;;;146934:9;146921:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;146908:70:0;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;146994:12;;146878:102;;-1:-1:-1;146994:12:0;;:42;;;;-1:-1:-1;147010:26:0;;;;146994:42;:64;;;;-1:-1:-1;;;;;;147040:18:0;;;;;;:10;:18;;;;;;;;146994:64;146991:393;;;147076:12;147090:19;147113;-1:-1:-1;;;;;147113:32:0;147203:6;147211:9;147146:75;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147146:75:0;;;;;;;;;;;;;;-1:-1:-1;;;;;147146:75:0;-1:-1:-1;;;147146:75:0;;;147113:109;;;147146:75;147113:109;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;147075:147;;;;147242:7;147237:136;;147290:2;147274:6;:13;:18;147270:32;;;147294:8;;;147237:136;147060:324;;146991:393;147398:13;:32;-1:-1:-1;;;147398:32:0;;;;:54;;;;-1:-1:-1;;;;;;147434:18:0;;;;;;:10;:18;;;;;;;;147398:54;147395:399;;;147470:13;147485:20;147509:19;-1:-1:-1;;;;;147509:32:0;147610:6;147618:9;147542:86;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147542:86:0;;;;;;;;;;;;;;-1:-1:-1;;;;;147542:86:0;-1:-1:-1;;;147542:86:0;;;147509:120;;;147542:86;147509:120;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;147469:160;;;;147649:8;147644:139;;147699:2;147682:7;:14;:19;147678:33;;;147703:8;;;147644:139;147454:340;;147395:399;147808:12;;;;:51;;;;-1:-1:-1;147824:35:0;;;;147808:51;:73;;;;-1:-1:-1;;;;;;147863:18:0;;;;;;:10;:18;;;;;;;;147808:73;147805:400;;;147899:13;147914:20;147938:19;-1:-1:-1;;;;;147938:32:0;148029:9;147971:68;;;;;;;;:::i;:::-;;;;-1:-1:-1;;147971:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;147971:68:0;-1:-1:-1;;;147971:68:0;;;147938:102;;;147971:68;147938:102;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;147898:142;;;;148060:8;148055:139;;148110:2;148093:7;:14;:19;148089:33;;;148114:8;;;148055:139;147883:322;;147805:400;148268:9;;148255:40;;;-1:-1:-1;;;148255:40:0;;;;148216:23;;-1:-1:-1;;;;;148268:9:0;;148255:38;;:40;;;;;;;;;;;;;;148268:9;148255:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;148242:66:0;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;148216:94;;148322:13;148337:20;148361:15;-1:-1:-1;;;;;148361:28:0;148452:6;148460:9;148471:6;148390:88;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;148390:88:0;;;;;;;;;;;;;;-1:-1:-1;;;;;148390:88:0;-1:-1:-1;;;148390:88:0;;;148361:118;;;148390:88;148361:118;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;148321:158;;;;148495:8;148490:127;;148541:2;148524:7;:14;:19;148520:33;;;148545:8;;;148490:127;146840:1784;;;;146762:1862;;;:::o;148875:904::-;-1:-1:-1;;;;;148959:21:0;;148951:37;;;;-1:-1:-1;;;148951:37:0;;15596:2:1;148951:37:0;;;15578:21:1;15635:1;15615:18;;;15608:29;-1:-1:-1;;;15653:18:1;;;15646:33;15696:18;;148951:37:0;15394:326:1;148951:37:0;149007:13;:21;-1:-1:-1;;;149007:21:0;;;;148999:36;;;;-1:-1:-1;;;148999:36:0;;;;;;;:::i;:::-;149055:13;:23;;;;;;149054:24;149046:39;;;;-1:-1:-1;;;149046:39:0;;;;;;;:::i;:::-;149100:14;;;;;;;149096:143;;;149164:9;;149151:47;;;-1:-1:-1;;;149151:47:0;;;;-1:-1:-1;;;;;149164:9:0;;;;149151:45;;:47;;;;;;;;;;;;;;;149164:9;149151:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;149131:96;;-1:-1:-1;;;149131:96:0;;-1:-1:-1;;;;;16247:32:1;;;149131:96:0;;;16229:51:1;16296:18;;;16289:34;;;149131:79:0;;;;;;;16202:18:1;;149131:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149096:143;149299:9;;149286:38;;;-1:-1:-1;;;149286:38:0;;;;149252:20;;-1:-1:-1;;;;;149299:9:0;;149286:36;;:38;;;;;;;;;;;;;;149299:9;149286:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;149252:73;;149336:11;149350:74;149366:6;149374:9;-1:-1:-1;;;;;149374:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;149394:9;-1:-1:-1;;;;;149394:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;149350:15;:74::i;:::-;149336:88;;149435:18;149456:9;-1:-1:-1;;;;;149456:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;149435:46;;149567:6;149554:1;:9;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;149584:21:0;;;;;;:9;:21;;;;;:28;;149609:3;;149584:21;:28;;149609:3;;149584:28;:::i;:::-;;;;-1:-1:-1;149645:12:0;;-1:-1:-1;149654:3:0;149645:6;:12;:::i;:::-;-1:-1:-1;;;;;149623:18:0;;;;;;:9;:18;;;;;:34;;:18;;;:34;;;;;:::i;:::-;;;;-1:-1:-1;;149675:37:0;;1504:25:1;;;-1:-1:-1;;;;;149675:37:0;;;149692:1;;-1:-1:-1;;;;;;;;;;;149675:37:0;1492:2:1;1477:18;149675:37:0;;;;;;;-1:-1:-1;;;;;149728:43:0;;149745:1;-1:-1:-1;;;;;;;;;;;149758:12:0;149767:3;149758:6;:12;:::i;:::-;149728:43;;1504:25:1;;;1492:2;1477:18;149728:43:0;;;;;;;148940:839;;;148875:904;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:251;220:6;273:2;261:9;252:7;248:23;244:32;241:52;;;289:1;286;279:12;241:52;321:9;315:16;340:31;365:5;340:31;:::i;965:388::-;1033:6;1041;1094:2;1082:9;1073:7;1069:23;1065:32;1062:52;;;1110:1;1107;1100:12;1062:52;1149:9;1136:23;1168:31;1193:5;1168:31;:::i;:::-;1218:5;-1:-1:-1;1275:2:1;1260:18;;1247:32;1288:33;1247:32;1288:33;:::i;:::-;1340:7;1330:17;;;965:388;;;;;:::o;1540:250::-;1625:1;1635:113;1649:6;1646:1;1643:13;1635:113;;;1725:11;;;1719:18;1706:11;;;1699:39;1671:2;1664:10;1635:113;;;-1:-1:-1;;1782:1:1;1764:16;;1757:27;1540:250::o;1795:271::-;1837:3;1875:5;1869:12;1902:6;1897:3;1890:19;1918:76;1987:6;1980:4;1975:3;1971:14;1964:4;1957:5;1953:16;1918:76;:::i;:::-;2048:2;2027:15;-1:-1:-1;;2023:29:1;2014:39;;;;2055:4;2010:50;;1795:271;-1:-1:-1;;1795:271:1:o;2071:220::-;2220:2;2209:9;2202:21;2183:4;2240:45;2281:2;2270:9;2266:18;2258:6;2240:45;:::i;2296:315::-;2364:6;2372;2425:2;2413:9;2404:7;2400:23;2396:32;2393:52;;;2441:1;2438;2431:12;2393:52;2480:9;2467:23;2499:31;2524:5;2499:31;:::i;:::-;2549:5;2601:2;2586:18;;;;2573:32;;-1:-1:-1;;;2296:315:1:o;2904:247::-;2963:6;3016:2;3004:9;2995:7;2991:23;2987:32;2984:52;;;3032:1;3029;3022:12;2984:52;3071:9;3058:23;3090:31;3115:5;3090:31;:::i;3156:203::-;-1:-1:-1;;;;;3320:32:1;;;;3302:51;;3290:2;3275:18;;3156:203::o;3364:456::-;3441:6;3449;3457;3510:2;3498:9;3489:7;3485:23;3481:32;3478:52;;;3526:1;3523;3516:12;3478:52;3565:9;3552:23;3584:31;3609:5;3584:31;:::i;:::-;3634:5;-1:-1:-1;3691:2:1;3676:18;;3663:32;3704:33;3663:32;3704:33;:::i;:::-;3364:456;;3756:7;;-1:-1:-1;;;3810:2:1;3795:18;;;;3782:32;;3364:456::o;3825:180::-;3884:6;3937:2;3925:9;3916:7;3912:23;3908:32;3905:52;;;3953:1;3950;3943:12;3905:52;-1:-1:-1;3976:23:1;;3825:180;-1:-1:-1;3825:180:1:o;4010:960::-;4160:4;4202:3;4191:9;4187:19;4179:27;;4253:6;4247:13;4240:21;4233:29;4222:9;4215:48;4333:4;4325:6;4321:17;4315:24;4308:32;4301:40;4294:4;4283:9;4279:20;4272:70;4412:4;4404:6;4400:17;4394:24;4387:32;4380:40;4373:4;4362:9;4358:20;4351:70;4491:4;4483:6;4479:17;4473:24;4466:32;4459:40;4452:4;4441:9;4437:20;4430:70;4547:4;4539:6;4535:17;4529:24;4562:51;4607:4;4596:9;4592:20;4578:12;2686:13;2679:21;2667:34;;2616:91;4562:51;;4662:4;4654:6;4650:17;4644:24;4677:53;4724:4;4713:9;4709:20;4693:14;2686:13;2679:21;2667:34;;2616:91;4677:53;;4779:4;4771:6;4767:17;4761:24;4794:53;4841:4;4830:9;4826:20;4810:14;2686:13;2679:21;2667:34;;2616:91;4794:53;;4896:4;4888:6;4884:17;4878:24;4911:53;4958:4;4947:9;4943:20;4927:14;2686:13;2679:21;2667:34;;2616:91;4911:53;;4010:960;;;;:::o;5752:615::-;5838:6;5846;5899:2;5887:9;5878:7;5874:23;5870:32;5867:52;;;5915:1;5912;5905:12;5867:52;5942:23;;-1:-1:-1;;;;;6014:14:1;;;6011:34;;;6041:1;6038;6031:12;6011:34;6079:6;6068:9;6064:22;6054:32;;6124:7;6117:4;6113:2;6109:13;6105:27;6095:55;;6146:1;6143;6136:12;6095:55;6186:2;6173:16;6212:2;6204:6;6201:14;6198:34;;;6228:1;6225;6218:12;6198:34;6281:7;6276:2;6266:6;6263:1;6259:14;6255:2;6251:23;6247:32;6244:45;6241:65;;;6302:1;6299;6292:12;6241:65;6333:2;6325:11;;;;;6355:6;;-1:-1:-1;5752:615:1;;-1:-1:-1;;;;5752:615:1:o;7212:657::-;7395:2;7384:9;7377:21;7358:4;7433:6;7427:13;7476:4;7471:2;7460:9;7456:18;7449:32;7504:52;7551:3;7540:9;7536:19;7522:12;7504:52;:::i;:::-;7490:66;;7605:2;7597:6;7593:15;7587:22;7618:57;7671:2;7660:9;7656:18;7640:14;6694:12;;6682:25;;6756:4;6745:16;;;6739:23;6723:14;;6716:47;6625:144;7618:57;-1:-1:-1;7734:2:1;7722:15;;7716:22;-1:-1:-1;;;;;7712:48:1;7706:3;7691:19;;7684:77;7831:4;7819:17;;;7813:24;7806:32;7799:40;7748:3;7777:20;;;7770:70;;;;-1:-1:-1;7819:17:1;7212:657::o;8398:380::-;8477:1;8473:12;;;;8520;;;8541:61;;8595:4;8587:6;8583:17;8573:27;;8541:61;8648:2;8640:6;8637:14;8617:18;8614:38;8611:161;;8694:10;8689:3;8685:20;8682:1;8675:31;8729:4;8726:1;8719:15;8757:4;8754:1;8747:15;8611:161;;8398:380;;;:::o;8783:127::-;8844:10;8839:3;8835:20;8832:1;8825:31;8875:4;8872:1;8865:15;8899:4;8896:1;8889:15;8915:128;8982:9;;;9003:11;;;9000:37;;;9017:18;;:::i;9840:375::-;-1:-1:-1;;;;;10098:15:1;;;10080:34;;10150:15;;;;10145:2;10130:18;;10123:43;10197:2;10182:18;;10175:34;;;;10030:2;10015:18;;9840:375::o;10551:217::-;10591:1;10617;10607:132;;10661:10;10656:3;10652:20;10649:1;10642:31;10696:4;10693:1;10686:15;10724:4;10721:1;10714:15;10607:132;-1:-1:-1;10753:9:1;;10551:217::o;10773:125::-;10838:9;;;10859:10;;;10856:36;;;10872:18;;:::i;10903:287::-;11032:3;11070:6;11064:13;11086:66;11145:6;11140:3;11133:4;11125:6;11121:17;11086:66;:::i;:::-;11168:16;;;;;10903:287;-1:-1:-1;;10903:287:1:o;11195:127::-;11256:10;11251:3;11247:20;11244:1;11237:31;11287:4;11284:1;11277:15;11311:4;11308:1;11301:15;11327:897;11407:6;11460:2;11448:9;11439:7;11435:23;11431:32;11428:52;;;11476:1;11473;11466:12;11428:52;11503:16;;-1:-1:-1;;;;;11568:14:1;;;11565:34;;;11595:1;11592;11585:12;11565:34;11633:6;11622:9;11618:22;11608:32;;11678:7;11671:4;11667:2;11663:13;11659:27;11649:55;;11700:1;11697;11690:12;11649:55;11729:2;11723:9;11751:2;11747;11744:10;11741:36;;;11757:18;;:::i;:::-;11832:2;11826:9;11800:2;11886:13;;-1:-1:-1;;11882:22:1;;;11906:2;11878:31;11874:40;11862:53;;;11930:18;;;11950:22;;;11927:46;11924:72;;;11976:18;;:::i;:::-;12016:10;12012:2;12005:22;12051:2;12043:6;12036:18;12091:7;12086:2;12081;12077;12073:11;12069:20;12066:33;12063:53;;;12112:1;12109;12102:12;12063:53;12125:68;12190:2;12185;12177:6;12173:15;12168:2;12164;12160:11;12125:68;:::i;12559:356::-;12761:2;12743:21;;;12780:18;;;12773:30;12839:34;12834:2;12819:18;;12812:62;12906:2;12891:18;;12559:356::o;13251:127::-;13312:10;13307:3;13303:20;13300:1;13293:31;13343:4;13340:1;13333:15;13367:4;13364:1;13357:15;13383:135;13422:3;13443:17;;;13440:43;;13463:18;;:::i;:::-;-1:-1:-1;13510:1:1;13499:13;;13383:135::o;14926:184::-;14996:6;15049:2;15037:9;15028:7;15024:23;15020:32;15017:52;;;15065:1;15062;15055:12;15017:52;-1:-1:-1;15088:16:1;;14926:184;-1:-1:-1;14926:184:1:o;15115:274::-;15289:25;;;-1:-1:-1;;;;;15350:32:1;15345:2;15330:18;;15323:60;15277:2;15262:18;;15115:274::o;15725:325::-;15927:2;15909:21;;;15966:1;15946:18;;;15939:29;-1:-1:-1;;;15999:2:1;15984:18;;15977:32;16041:2;16026:18;;15725:325::o
Swarm Source
ipfs://a4e40b9641135954640ca80aed2c263d55c040dd710d9766ebe710002ab0c213
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.