Implementation

Description:

Proxy contract enabling upgradeable smart contract patterns. Delegates calls to an implementation contract.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
// SPDX-License-Identifier: MIT
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }
  function div(uint256 a, uint256 b) internal pure returns (uint256) {    
    uint256 c = a / b;
    return c;
  }
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
  function ceil(uint a, uint m) internal pure returns (uint r) {
    return (a + m - 1) / m * m;
  }
}
contract Owned {
    address payable public owner;
    event OwnershipTransferred(address indexed _from, address indexed _to);
    constructor() public {
        owner = msg.sender;
    }
    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }
    function transferOwnership(address payable _newOwner) public onlyOwner {
        owner = _newOwner;
        emit OwnershipTransferred(msg.sender, _newOwner);
    }
}


interface IBEP20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint256 balance);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);
    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 initialize(address, address) external;
}

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);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
   
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
interface IPresaleProxy{
   function getDeploymentFee() external returns (uint256);
   function getTokenFee() external returns (uint256);
   function getAffilateFee() external view returns (uint256);
   function getParentOf(address,address) external view returns (address);
   function setParentOf(address,address) external returns (address);
   function addAffilatePurchase(address,uint256) external returns (uint256);
   function getTotalAffilatePurchased(address) external view returns (uint256);
   function getAffilatePurchase(address,address) external view returns (uint256);
   function getfundReciever() external returns (address);
   function getCheckSuccess() external returns (bool);
   function setIsWhitelisted(bool) external returns (bool);
   function getLiquidityTokenAmount() external returns(uint256);
   function getAffilateMax() external view returns (uint256);
   function getAffilateMin() external view returns (uint256);
   function getFeeOptions(uint _fee) external view returns (uint256 ,uint256);
}
interface Implementer {
    function getImplementer() external view returns (address);
}
contract BSCPresale is Owned  {
    using SafeMath for uint256; 
    bool  isPresaleOpen;
    address  tokenAddress;
    uint256  tokenDecimals = 18;
    string  tokenName;
    string  tokenSymbol; 
    uint256 tokenRatePerEth = 60000000000;
    uint256 tokenRatePerEthPancake = 100;
    uint256  rateDecimals = 0;
    uint256  minEthLimit = 1e17; // 0.1 BNB
    uint256  maxEthLimit = 10e18; // 10 BNB
    uint256 MAX_INT = 115792089237316195423570985008687907853269984665640564039457584007913129639935;
    address PROXY;
    string[]  social;
    string  description;
    string  logo; 
    uint256 public soldTokens=0;  
    uint256 intervalDays;
    uint256  startTime;
    uint256  endTime = 2 days;
    bool isClaimable = false;  
    uint256  affilateMax;
        uint256  affilateMin;
    bool isWhitelisted = false;
   bool isSuccess = false;
    uint256 hardCap = 0;   
    uint256 softCap = 0; 
    uint256 public earnedCap =0; 
    uint256 public totalSold = 0;
    uint256 vestingInterval = 0;
    uint256 vestingPercent = 0;
    uint256  depolymentFee;
    uint256 fee;
    uint256 bnbfee;
    uint256 userFee;
     bool buytype; // isBNB = true
    address useWithToken;
    address payable fundReciever = 0xdFa5e2D210a9a34eE3288E98852085bc5f01ECdd;
    IUniswapV2Router02  uniswapV2Router;
    address uniswapV2Pair;  
    bool isautoAdd;
    bool isVested;
    bool isToken;
    bool LaunchpadType;
    string banner; 
    uint256 unlockOn;
    uint256 liquidityPercent;
    uint256 participants; 
    address payable ownerAddress; 
    mapping(address => uint256) usersInvestments;
    bool  checkForSuccess;
    uint256  affliateFee;
    uint256 minAff;
    uint256 maxAff;
    uint256 public  reserveAff;
    mapping(address => mapping(address => uint256)) public whitelistedAddresses;
    struct User{
        uint256 actualBalance;
        uint256 balanceOf;
        uint256 lastClaimed;
        uint256 initialClaim;
    }
    mapping (address => User) public userInfo;
    uint256 public LiquidityTokenAmount = 0 ; 
    uint256 AffilateAMOUNT;
    constructor(address[] memory _addresses,uint256[] memory _values,bool[] memory _isSet,string[] memory _details) public {

        PROXY = Implementer(msg.sender).getImplementer();
        tokenAddress = _addresses[0];
        tokenDecimals = IBEP20(tokenAddress).decimals();
        tokenName = IBEP20(tokenAddress).name();
        tokenSymbol =  IBEP20(tokenAddress).symbol();
        affilateMax = IPresaleProxy(PROXY).getAffilateMax();
        affilateMin = IPresaleProxy(PROXY).getAffilateMin();
        minEthLimit = _values[0];
        maxEthLimit = _values[1];
        tokenRatePerEth = _values[2];
        hardCap = _values[4];
        userFee = _values[12];
        affliateFee = _values[13];
        minAff = _values[14];
        maxAff= _values[15];
        softCap = _values[3];
        owner = payable(_addresses[2]);
        vestingPercent = _values[10];
        vestingInterval = _values[11];
        isVested = _isSet[1];
        isautoAdd = _isSet[0];
        isWhitelisted = _isSet[3];
        buytype = _isSet[4];
        isToken = _isSet[5];
        LaunchpadType = _isSet[6];
        useWithToken = _addresses[3];
        
        // Pancake testnet Router : 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3
          IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_addresses[1]);
        // set the rest of the contract variables
        if(isautoAdd){
            address pair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(tokenAddress, useWithToken != address(0) ? useWithToken :_uniswapV2Router.WETH());
            if(pair==address(0)){
                uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(tokenAddress, useWithToken != address(0) ? useWithToken :_uniswapV2Router.WETH());
            }else{
                uniswapV2Pair = pair;
            }
        } 
        uniswapV2Router = _uniswapV2Router;
        tokenRatePerEthPancake = _values[5];
        unlockOn = _values[6].mul(1 days);
        buytype = _isSet[4];
        if(!_isSet[4])
        useWithToken = _addresses[3];   
        startTime = _values[8];
        endTime = _values[9];
        if(startTime <= block.timestamp)
          isPresaleOpen = true;
        liquidityPercent = _values[7];
        depolymentFee = IPresaleProxy(PROXY).getDeploymentFee();
        // fee = _values[16];
        // bnbfee = _values[17];
        (fee,bnbfee) = IPresaleProxy(PROXY).getFeeOptions(_values[16]);
        ownerAddress = payable(IPresaleProxy(PROXY).getfundReciever());
        description = _details[0];
        social.push(_details[1]);
        social.push(_details[2]);
        social.push(_details[3]);
        logo = _details[4];
        social.push(_details[5]);
        social.push(_details[6]);
        social.push(_details[7]);
        social.push(_details[8]);
        social.push(_details[9]);
        social.push(_details[10]);
        social.push(_details[11]);
        banner = _details[12];     
    }  
    function startPresale(uint256 numberOfdays) external onlyOwner{
        startTime = block.timestamp;
        intervalDays = numberOfdays.mul(1 days);
        endTime = block.timestamp.add(intervalDays);
        isPresaleOpen = true;
        isClaimable = false;
    }
    struct Project{
        string name;
        string symbol;
        uint256 decimals;
        address tokenAddress;
        string[] social;
        string description;
        uint256 presaleRate;
        uint256 pancakeRate;
        uint256 hardCap;
        // uint256 userFee;
        uint256 softCap;
        bool isWhitelisted;
        bool isWithoutToken;
        bool buytype;
        bool isToken;
        uint256 earnedCap;
        uint256 participants;
        string logo;
        uint256 startTime;
        uint256 endTime;
        bool isVested;
        bool isPancake;
        uint256 vestingInterval;
        uint256 vestingPercent;
        uint256 minEthLimit;
        uint256 maxEthLimit;
        address owner;
        uint256 lpUnlockon;
        bool isClaimable;
        bool isPresaleOpen;
        address saleAddress;
        bool LaunchpadType;
        address useWithToken;
        uint256 liquidityPercent;
        string banner;   
    }
    function getSaleInfo() public view returns (Project memory){
        return Project({
            name : tokenName,
            symbol: tokenSymbol,
            decimals: tokenDecimals,
            tokenAddress: tokenAddress,
            social: social,
            description: description,
            presaleRate: tokenRatePerEth,
            pancakeRate: tokenRatePerEthPancake,
            hardCap: hardCap,
            softCap: softCap,
            isWithoutToken: false,
            isWhitelisted: isWhitelisted,
            buytype : buytype,
            isToken : isToken,
            earnedCap: earnedCap,
            participants: participants,
            logo: logo,
            startTime: startTime,
            endTime: endTime,
            isVested: isVested,
            isPancake: isautoAdd,
            vestingPercent: vestingPercent,
            vestingInterval: vestingInterval,
            minEthLimit: minEthLimit,
            maxEthLimit: maxEthLimit,
            owner: owner,
            lpUnlockon: unlockOn,
            isClaimable: isClaimable,
            isPresaleOpen: block.timestamp >= startTime && block.timestamp <= endTime && earnedCap <= hardCap,
            saleAddress: address(this),
            LaunchpadType:LaunchpadType,
            useWithToken:useWithToken,
            liquidityPercent:liquidityPercent,
            banner: banner
        });
    }

    struct UserInfo{
        uint256 bnbBalance;
        uint256 userInvested;
        uint256 userClaimbale;
        uint256 userWhitelistedAmount;
        uint256 userTokenBalance;
        uint256 unSoldTokens;
        uint256 initialClaim;
        uint256 actualBalance;
    }

    function getUserInfo(address user) public view returns (UserInfo memory){
        return UserInfo({
            bnbBalance: address(user).balance,
            userInvested: getUserInvestments(user),
            userClaimbale: getUserClaimbale(user),
            userWhitelistedAmount: whitelistedAddresses[tokenAddress][user],
            userTokenBalance: IBEP20(tokenAddress).balanceOf(user),
            unSoldTokens: getUnsoldTokensBalance(),
            initialClaim: userInfo[user].initialClaim,
            actualBalance: userInfo[user].actualBalance
        });
    }

    function getAffliateInfo() public view returns (uint256,uint256,uint256){
        return ( affliateFee,minAff,maxAff );
    }
 function setAffilateMinandMax(uint256 _max, uint256 _min) external onlyOwner {
        affilateMax = _max;
        affilateMin = _min;
    }

     function updateTokenInfo(string[] memory _info) external onlyOwner {
        description = _info[0];
        social[0]=(_info[1]);
        social[1]=(_info[2]);
        social[2]=(_info[3]);
        logo = _info[4];
    }
    
    function closePresale() external onlyOwner{ 
        totalSold = totalSold.add(soldTokens);
        endTime = block.timestamp;
        soldTokens = 0;
        isPresaleOpen = false;
    }

    function getUserInvestments(address user) public view returns (uint256){
        return usersInvestments[user];
    }
    function addWhitelistedAddress(address _address, uint256 _allocation) external onlyOwner {
        whitelistedAddresses[tokenAddress][_address] = _allocation;
    }
    function setWhitelist(bool _value) external onlyOwner {
        isWhitelisted = _value;
        IPresaleProxy(PROXY).setIsWhitelisted(_value);
    }           
    function addMultipleWhitelistedAddresses(address[] calldata _addresses, uint256[] calldata _allocation) external onlyOwner {
        isWhitelisted = true;
        for (uint i=0; i<_addresses.length; i++) {
            whitelistedAddresses[tokenAddress][_addresses[i]] = _allocation[i];
        }
    }

    function removeWhitelistedAddress(address _address) external onlyOwner {
        whitelistedAddresses[tokenAddress][_address] = 0;
    }    
    
    function getUserClaimbale(address user) public view returns (uint256){
        return userInfo[user].balanceOf;
    }
    
    function contribute(uint256 buyamount, address _referrer) public payable{
    uint256 value =  !buytype ? buyamount : msg.value;
    uint256 collectfee = userFee / value * 100;
    uint256 amount = value - collectfee;
    if(_referrer != address(0)){
    IPresaleProxy(PROXY).setParentOf(msg.sender,_referrer);
    IPresaleProxy(PROXY).addAffilatePurchase(msg.sender,amount);
    }
    if(buytype){
          payable(fundReciever).transfer(collectfee);
    }else{
        // transferFrom
        require(IBEP20(useWithToken).transferFrom(msg.sender,address(this),buyamount), "Insufficient Balance !");
        IBEP20(useWithToken).transfer(fundReciever,collectfee);
    }
        require( block.timestamp >= startTime && block.timestamp <= endTime, "Sale is not Active");
        isPresaleOpen = true;
        require(
                usersInvestments[msg.sender].add(amount) <= maxEthLimit
                && usersInvestments[msg.sender].add(amount) >= minEthLimit,
                "Installment Invalid."
            );
        if(usersInvestments[msg.sender] == 0)
        participants++;
         if(LaunchpadType){
         require(earnedCap.add(amount) <= hardCap,"Hard Cap Exceeds");
         }

        if(isWhitelisted){
            require(whitelistedAddresses[tokenAddress][msg.sender] > 0, "you are not whitelisted");
            require(whitelistedAddresses[tokenAddress][msg.sender] >= amount, "amount too high");
            require(usersInvestments[msg.sender].add(amount) <= whitelistedAddresses[tokenAddress][msg.sender], "Maximum purchase cap hit");
            whitelistedAddresses[tokenAddress][msg.sender] = whitelistedAddresses[tokenAddress][msg.sender].sub(amount);
        }
       
        if(!LaunchpadType){
         usersInvestments[msg.sender] = usersInvestments[msg.sender].add(amount);
         earnedCap = earnedCap.add(amount);
       }
       else{
        require( (IBEP20(tokenAddress).balanceOf(address(this))).sub(soldTokens) > 0 ,"No Presale Funds left");
        uint256 tokenAmount = getTokensPerEth(amount);
        require( (IBEP20(tokenAddress).balanceOf(address(this))).sub(soldTokens) >= tokenAmount ,"No Presale Funds left");
        userInfo[msg.sender].balanceOf = userInfo[msg.sender].balanceOf.add(tokenAmount);
        userInfo[msg.sender].actualBalance = userInfo[msg.sender].balanceOf;
        soldTokens = soldTokens.add(tokenAmount);
        usersInvestments[msg.sender] = usersInvestments[msg.sender].add(amount);
        earnedCap = earnedCap.add(amount);
        }  
 }   
  function claimTokens() public{
        require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
       
        require(isClaimable, "You cannot claim tokens until the finalizeSale.");
        if(LaunchpadType)
        require(userInfo[msg.sender].balanceOf > 0 , "No Tokens left !");
        if(!LaunchpadType){
             uint256 tokenAmount = getTokensPerEth(usersInvestments[msg.sender]);
             userInfo[msg.sender].balanceOf = userInfo[msg.sender].balanceOf.add(tokenAmount);
             userInfo[msg.sender].actualBalance = userInfo[msg.sender].balanceOf;
            //  soldTokens = soldTokens.add(tokenAmount);
            }
            if(affliateFee > 0){
            uint256 refAmount = (IPresaleProxy(PROXY).getAffilatePurchase(address(this),msg.sender).mul(reserveAff)).div(1e12);
            if(refAmount >= minAff){
            if(buytype){
                payable(msg.sender).transfer(maxAff > refAmount ? refAmount : maxAff);
            }else{
                IBEP20(useWithToken).transfer(msg.sender,maxAff > refAmount ? refAmount : maxAff);
            }
            }
            }
            VestedClaim(msg.sender);
       
    }

    function getAffilateCommissionPerUser(address _user) public view returns (uint256 _commission,uint256 _refBought){
        _refBought = IPresaleProxy(PROXY).getAffilatePurchase(address(this),_user);
         if(affliateFee > 0){
            uint256 refAmount = ((_refBought).mul(reserveAff)).div(1e12);
            if(refAmount >= minAff){
            _commission = maxAff > refAmount ? refAmount : maxAff;
            }
            }
           return (_commission,_refBought);
    }

    function VestedClaim(address user) internal {
        if(isVested){
        require(block.timestamp > userInfo[user].lastClaimed.add(vestingInterval),"Vesting Interval is not reached !");
        uint256 toTransfer =  userInfo[user].actualBalance.mul(vestingPercent).div(10000);
        if(toTransfer > userInfo[user].balanceOf)
            toTransfer = userInfo[user].balanceOf;
        require(IBEP20(tokenAddress).transfer(user, toTransfer), "Insufficient balance of presale contract!");
        userInfo[user].balanceOf = userInfo[user].balanceOf.sub(toTransfer);
        userInfo[user].lastClaimed = block.timestamp;
        if(userInfo[user].initialClaim <= 0)
            userInfo[user].initialClaim = block.timestamp;
       }else{
         require(IBEP20(tokenAddress).transfer(user, userInfo[user].balanceOf), "Insufficient balance of presale contract!");
        userInfo[user].balanceOf = 0;
        }
    }

    function getVestedclaim(address user) public view returns (uint256) {
        uint256 toTransfer = userInfo[user].actualBalance.mul(vestingPercent).div(10000);
        uint256 vestedClaim = userInfo[user].balanceOf < toTransfer ? toTransfer : userInfo[user].balanceOf;
        return (userInfo[user].balanceOf == 0) ? 0 : vestedClaim ;
    }

    function isEligibletoVestedClaim(address _user) public view returns (bool) {
        return (block.timestamp > userInfo[_user].lastClaimed.add(vestingInterval));
    }

     function calculateTokenPrice(uint256 _earnedCap,uint256 _hardCap) public pure returns (uint256){
        // uint256 pricePerToken = _earnedCap.mul(10 ** 8) / _hardCap ; // pricePerToken
        // uint256 valuePerBNB = 1 * 10 ** 8 / pricePerToken ; // valuePerBNB
        // uint256 priceRate = valuePerBNB;
        // return  priceRate;
        // deposit full total supply
        // presale total selling amount is hardcap
        // so after end sale hardcap / earnedcap
        return _hardCap.mul(10**18).div(_earnedCap);
    }
   
     function finalizeSale() public onlyOwner{
        require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
        if(soldTokens > 0){ totalSold = totalSold.add(soldTokens); soldTokens = 0; }
        checkForSuccess = IPresaleProxy(PROXY).getCheckSuccess();
        ownerAddress = payable(IPresaleProxy(PROXY).getfundReciever());
        uint256 feeAmount = earnedCap.mul(bnbfee).div(10**20);

        // set tokenpereth
            if(!LaunchpadType){
              tokenRatePerEth = calculateTokenPrice(earnedCap,hardCap); 
              tokenRatePerEthPancake = tokenRatePerEth;
              soldTokens = tokenRatePerEth.mul(earnedCap);
              totalSold = soldTokens;
              // burn the rest from total supply
            }

            ownerAddress.transfer(address(this).balance >= feeAmount ? feeAmount : 0); 
            if(!buytype){
                if(feeAmount > 0 ){ IBEP20(useWithToken).transfer(ownerAddress,feeAmount); }
            }
                   
            if(totalSold.mul(fee).div(10**20) > 0 ) 
              require(IBEP20(tokenAddress).transfer(address(ownerAddress),totalSold.mul(fee).div(10**20)), "Insufficient balance of presale contract!");
      

      
            if(earnedCap >= softCap || checkForSuccess)
                isSuccess = true;
        
            if(isSuccess && isautoAdd){
                _addLiquidityToken();
                    }else if(!isautoAdd){
                 // for BNB affliate
                if(affliateFee > 0){
                    uint256 InBalance = buytype ? address(this).balance : IBEP20(useWithToken).balanceOf(address(this));
                    reserveAff =  InBalance >= earnedCap.mul(affliateFee).div(10**20) ?  earnedCap.mul(affliateFee).div(10**20) : InBalance ;
                    uint256 totalAff = IPresaleProxy(PROXY).getTotalAffilatePurchased(address(this));
                    reserveAff = totalAff > 0 ?  (reserveAff.mul(1e12)).div(totalAff) : 0;
                }
            }
        
        isClaimable = !(isClaimable);
    }

    
    function _addLiquidityToken() internal{
     uint256 amountInEth = earnedCap.mul(liquidityPercent).div(100);
     uint256 tokenAmount = amountInEth.mul(tokenRatePerEthPancake).div(10**18);
     tokenAmount = getEqualientToken(useWithToken == address(0) ? 18 : IBEP20(useWithToken).decimals(),tokenDecimals,tokenAmount);
     LiquidityTokenAmount = tokenAmount;
     addLiquidity(tokenAmount,amountInEth);
     unlockOn = block.timestamp.add(unlockOn);

     // for BNB affliate
     if(affliateFee > 0){
        uint256 InBalance = buytype ? address(this).balance : IBEP20(useWithToken).balanceOf(address(this));
        reserveAff =  InBalance >= earnedCap.mul(affliateFee).div(10**20) ?  earnedCap.mul(affliateFee).div(10**20) : InBalance ;
        AffilateAMOUNT = reserveAff;
        uint256 totalAff = IPresaleProxy(PROXY).getTotalAffilatePurchased(address(this));
        reserveAff = totalAff > 0 ?  (reserveAff.mul(1e12)).div(totalAff) : 0;
     }
    }
    
    function checkTokentoAddLiquidty() public view returns(uint256) {
    uint256 contractBalance = IBEP20(tokenAddress).balanceOf(address(this)).sub(soldTokens.add(totalSold));
    uint256 amountInEth = earnedCap.mul(liquidityPercent).div(100);
    uint256 tokenAmount = amountInEth.mul(tokenRatePerEthPancake).div(10**18);
     tokenAmount =  tokenAmount.mul(uint256(1)).div(10**(uint256(18).sub(tokenDecimals).add(rateDecimals)));
         contractBalance = contractBalance.div(10 ** tokenDecimals);
            return (tokenAmount).sub(contractBalance);
    }  
    function getTokensPerEth(uint256 amount) public view returns(uint256) {
        return (amount.mul(tokenRatePerEth).div(
            10**(useWithToken == address(0) ? 18 : IBEP20(useWithToken).decimals()).sub(tokenDecimals).add(rateDecimals))).div(10 ** 18);
    }
   function getEqualientToken(uint256 _tokenIn,uint256 _tokenOut,uint256 _amount) public pure returns (uint256){
         return _tokenIn > _tokenOut ? _amount.mul(uint256(1)).div((10**(_tokenIn).sub(_tokenOut))) : _amount.mul(uint256(1)).mul((10**(_tokenIn).sub(_tokenOut))) ;
    } 
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        // approve token transfer to cover all possible scenarios
         IBEP20(tokenAddress).approve(address(uniswapV2Router), MAX_INT);
        // add the liquidity
        if(buytype){
          uniswapV2Router.addLiquidityETH{value: ethAmount}(
           tokenAddress,
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
        }else{
            // add liq token to token
      IBEP20(useWithToken).approve(address(uniswapV2Router), MAX_INT);
      uniswapV2Router.addLiquidity(
           tokenAddress,
           useWithToken,
            tokenAmount,
            ethAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
        }
    }

        function withdrawBNB() public onlyOwner{


        if(affliateFee > 0){
            uint256 refAmount = (IPresaleProxy(PROXY).getAffilatePurchase(address(this),msg.sender).mul(reserveAff)).div(1e12);
            if(refAmount >= minAff){
            if(buytype){
                payable(msg.sender).transfer(maxAff > refAmount ? refAmount : maxAff);
            }else{
                IBEP20(useWithToken).transfer(msg.sender,maxAff > refAmount ? refAmount : maxAff);
            }
            }
            }
       
        if(buytype) { require(address(this).balance > 0 , "No Funds Left"); owner.transfer(uint256(address(this).balance).sub(AffilateAMOUNT)); }else{ IBEP20(useWithToken).transfer(msg.sender,(IBEP20(useWithToken).balanceOf(address(this))).sub(AffilateAMOUNT)); }

    }
    function getUnsoldTokensBalance() public view returns(uint256) {
        return isPresaleOpen ? (IBEP20(tokenAddress).balanceOf(address(this))).sub(soldTokens): 0;
    }
    
    function getLiquidityTokenAmount() public view returns(uint256) {
        return LiquidityTokenAmount;
    }
    function getLPtokens() external onlyOwner {
       require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
        require (block.timestamp > unlockOn,"Unlock Period is still on");
        IBEP20(uniswapV2Pair).transfer(owner, (IBEP20(uniswapV2Pair).balanceOf(address(this))));
    }  
   function getUnsoldTokens() external onlyOwner {
       require(!(block.timestamp >= startTime && block.timestamp <= endTime), "Sale is Active");
        IBEP20(tokenAddress).transfer(owner, totalSold > IBEP20(tokenAddress).balanceOf(address(this)) ? totalSold.sub( IBEP20(tokenAddress).balanceOf(address(this)))  : (IBEP20(tokenAddress).balanceOf(address(this))).sub(totalSold));
    }
}
contract Implementation is Owned{
address public implementer;

    function setImplementer(address _implement) public onlyOwner{
        implementer = _implement;
    }

    function getImplementer() external view returns (address){
        return implementer;
    }
    function deployProxy(address[] calldata _addresses,uint256[] calldata _values,bool[] memory _isSet,string[] memory _details) external returns (address) {
        require(msg.sender == implementer, "Proxy Falied");
         address _saleAddress = address(new BSCPresale(_addresses,_values,_isSet,_details));
         return _saleAddress;
    }
}

Tags:
ERC20, Proxy, Swap, Liquidity, Upgradeable, Factory|addr:0xa2a3ada264396ea44c03ec9cfc16d97ac7106e7f|verified:true|block:23525646|tx:0x68f153af69134f2f9ef0945798cf2e151e80262ba304ae755b320ef0509ae238|first_check:1759840909

Submitted on: 2025-10-07 14:41:49

Comments

Log in to comment.

No comments yet.