From b2172fe0d0a5c0fe6160de9c87b4ec5dd7b3b213 Mon Sep 17 00:00:00 2001 From: cryptopath Date: Tue, 22 Nov 2022 13:22:50 +0000 Subject: [PATCH] code refactoring, bug fixes, sql tables --- cli.py | 2 +- mev_inspect/arbitrages.py | 14 ++--- mev_inspect/block.py | 111 +++++++++++++++++++---------------- mev_inspect/crud/reserves.py | 17 ++++++ mev_inspect/db.py | 5 +- mev_inspect/inspect_block.py | 75 +++++++++-------------- mev_inspect/inspector.py | 2 +- sql/arbitrage_swaps.sql | 63 ++++++++++++++++++++ sql/arbitrages.sql | 55 +++++++++++++++++ sql/liquidations.sql | 56 ++++++++++++++++++ sql/reserves.sql | 39 ++++++++++++ sql/swaps.sql | 59 +++++++++++++++++++ 12 files changed, 388 insertions(+), 110 deletions(-) create mode 100644 mev_inspect/crud/reserves.py create mode 100644 sql/arbitrage_swaps.sql create mode 100644 sql/arbitrages.sql create mode 100644 sql/liquidations.sql create mode 100644 sql/reserves.sql create mode 100644 sql/swaps.sql diff --git a/cli.py b/cli.py index b5a6674..c30577c 100644 --- a/cli.py +++ b/cli.py @@ -73,7 +73,7 @@ async def fetch_block_command(block_number: int, rpc: str): "--max-concurrency", type=int, help="maximum number of concurrent connections", - default=5, + default=1, ) @click.option( "--request-timeout", type=int, help="timeout for requests to nodes", default=500 diff --git a/mev_inspect/arbitrages.py b/mev_inspect/arbitrages.py index 0873b94..f0b68f0 100644 --- a/mev_inspect/arbitrages.py +++ b/mev_inspect/arbitrages.py @@ -5,7 +5,7 @@ from mev_inspect.schemas.arbitrages import Arbitrage from mev_inspect.schemas.swaps import Swap from mev_inspect.utils import equal_within_percent -MAX_TOKEN_AMOUNT_PERCENT_DIFFERENCE = 0.01 +MAX_TOKEN_AMOUNT_PERCENT_DIFFERENCE = 0.00001 def get_arbitrages(swaps: List[Swap]) -> List[Arbitrage]: @@ -55,7 +55,8 @@ def _get_arbitrages_from_swaps(swaps: List[Swap]) -> List[Arbitrage]: continue unused_ends = [end for end in ends if end not in used_swaps] - route = _get_shortest_route(start, unused_ends, swaps) + unused_swaps = [swap for swap in swaps if swap not in used_swaps] + route = _get_shortest_route(start, unused_ends, unused_swaps) if route is not None: start_amount = route[0].token_in_amount @@ -81,14 +82,7 @@ def _get_arbitrages_from_swaps(swaps: List[Swap]) -> List[Arbitrage]: all_arbitrages.append(arb) used_swaps.extend(route) - if len(all_arbitrages) == 1: - return all_arbitrages - else: - return [ - arb - for arb in all_arbitrages - if (arb.swaps[0].trace_address < arb.swaps[-1].trace_address) - ] + return all_arbitrages def _get_shortest_route( diff --git a/mev_inspect/block.py b/mev_inspect/block.py index 44e1ee3..9275abb 100644 --- a/mev_inspect/block.py +++ b/mev_inspect/block.py @@ -1,7 +1,7 @@ import asyncio import logging import time -from typing import List, Optional, Tuple, Dict +from typing import List, Optional from sqlalchemy import orm from web3 import Web3 @@ -26,27 +26,14 @@ async def get_latest_block_number(base_provider) -> int: return hex_to_int(latest_block["result"]["number"]) -async def _get_logs_for_topics(base_provider, after_block, before_block, topics): - print("getting log traces") - start = time.time() - logs = await base_provider.make_request("eth_getLogs", - [{ +async def _get_logs_for_topics(w3, after_block, before_block, topics): + return await w3.eth.get_logs( + { "fromBlock": hex(after_block), "toBlock": hex(before_block), "topics": topics, - }]) - print("getting log traces done ", time.time() - start, len(logs)) - return logs['result'] - -def _logs_by_tx(logs): - logs_by_tx = dict() - for log in logs: - transaction_hash = log['transactionHash'] - if transaction_hash in logs_by_tx.keys(): - logs_by_tx[transaction_hash].append(log) - else: - logs_by_tx[transaction_hash] = [log] - return logs_by_tx + }) + def get_swap(data): data = data[2:] @@ -62,17 +49,38 @@ univ2abi = ''' [{"inputs":[],"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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] ''' +def parse_topic(log, index): + return log['topics'][index].hex() + +def parse_blockNumber(log): + return log['blockNumber'] + +def parse_transactionHash(log): + return log['transactionHash'].hex() + +def parse_address(log): + return log['address'].lower() + +def parse_logIndex(log): + return log['logIndex'] + +def parse_data(log): + return log['data'] + +def parse_token(w3, token): + return "0x"+w3.toHex(token)[26:] + async def classify_logs(logs, reserves, w3): cswaps = [] cliquidations = [] + new_reserves = [] topic_swap = "0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822" topic_liquidation = "0xe413a321e8681d831f4dbccbca790d2952b56f977908e45be37335533e005286" for log in logs: - if log['topics'][0] == topic_swap: - # print(log) - block = int(log['blockNumber'], 16) - transaction_hash = log['transactionHash'] - pool_address = log['address'] + if parse_topic(log, 0) == topic_swap: + block = parse_blockNumber(log) + transaction_hash = parse_transactionHash(log) + pool_address = parse_address(log) if pool_address in reserves: token0, token1 = reserves[pool_address] else: @@ -81,19 +89,26 @@ async def classify_logs(logs, reserves, w3): w3.eth.call({'to': addr, 'data': '0x0dfe1681'}), w3.eth.call({'to': addr, 'data': '0xd21220a7'}) ) - token0 = w3.toHex(token0) - token1 = w3.toHex(token1) + token0 = parse_token(w3, token0) + token1 = parse_token(w3, token1) reserves[pool_address] = (token0, token1) + new_reserves.append( + { + "pool_address": pool_address, + "token0": token0, + "token1": token1 + } + ) - am0in, am1in, am0out, am1out = get_swap(log['data']) + am0in, am1in, am0out, am1out = get_swap(parse_data(log)) swap = Swap( abi_name="uniswap_v2", transaction_hash=transaction_hash, block_number=block, - trace_address=[int(log['logIndex'], 16)], + trace_address=[parse_logIndex(log)], contract_address=pool_address, - from_address="0x"+log['topics'][1][26:], - to_address="0x"+log['topics'][2][26:], + from_address="0x"+parse_topic(log, 1)[26:], + to_address="0x"+parse_topic(log, 2)[26:], token_in_address=token0 if am0in != 0 else token1, # TODO token_in_amount= am0in if am0in != 0 else am1in, token_out_address=token1 if am1out != 0 else token0, # TODO @@ -102,41 +117,39 @@ async def classify_logs(logs, reserves, w3): error=None ) cswaps.append(swap) - elif log['topics'][0] == topic_liquidation: - block = str(int(log['blockNumber'], 16)) - am_debt, am_recv, addr_usr = get_liquidation(log['data']) + elif parse_topic(log, 0) == topic_liquidation: + block = str(parse_blockNumber(log)) + am_debt, am_recv, addr_usr = get_liquidation(parse_data(log)) liquidation = Liquidation( - liquidated_user = "0x"+log['topics'][3][26:], + liquidated_user = "0x"+parse_topic(log, 3)[26:], liquidator_user = addr_usr, - debt_token_address = "0x"+log['topics'][2][26:], + debt_token_address = "0x"+parse_topic(log, 2)[26:], debt_purchase_amount = am_debt, received_amount = am_recv, - received_token_address = "0x"+log['topics'][1][26:], + received_token_address = "0x"+parse_topic(log, 1)[26:], protocol = None, - transaction_hash = log['transactionHash'], - trace_address = [int(log['logIndex'], 16)], + transaction_hash = parse_transactionHash(log), + trace_address = [parse_logIndex(log)], block_number = block, error = None ) cliquidations.append(liquidation) - return cswaps, cliquidations + return cswaps, cliquidations, new_reserves -reserves: Dict[str, Tuple[str, str]] = dict() - -async def get_classified_traces_from_events(w3: Web3, after_block: int, before_block: int): - base_provider = w3.provider +async def get_classified_traces_from_events(w3, after_block, before_block, reserves): start = after_block - stride = 300 + stride = 2000 + topic_swap = "0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822" + topic_liquidation = "0xe413a321e8681d831f4dbccbca790d2952b56f977908e45be37335533e005286" while start < before_block: begin = start - end = start + stride if (start + stride) < before_block else before_block-1 + end = start + stride if (start + stride) < before_block else before_block + end -= 1 start += stride print("fetching from node...", begin, end, flush=True) - all_logs = await _get_logs_for_topics(base_provider, begin, end, [["0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822","0xe413a321e8681d831f4dbccbca790d2952b56f977908e45be37335533e005286"]]) - logs_by_tx = _logs_by_tx(all_logs) - for tx in logs_by_tx.keys(): - yield await classify_logs(logs_by_tx[tx], reserves, w3) + all_logs = await _get_logs_for_topics(w3, begin, end, [[topic_swap, topic_liquidation]]) + yield await classify_logs(all_logs, reserves, w3) async def create_from_block_number( w3: Web3, diff --git a/mev_inspect/crud/reserves.py b/mev_inspect/crud/reserves.py new file mode 100644 index 0000000..59e7828 --- /dev/null +++ b/mev_inspect/crud/reserves.py @@ -0,0 +1,17 @@ +def get_reserves(db_session): + result = db_session.execute( + "SELECT * FROM reserves" + ) + return result + +def set_reserves(db_session, values): + db_session.execute( + """ + INSERT INTO reserves + (pool_address, token0, token1) + VALUES + (:pool_address, :token0, :token1) + """, + params = values, + ) + db_session.commit() diff --git a/mev_inspect/db.py b/mev_inspect/db.py index 7fb1a97..47b689c 100644 --- a/mev_inspect/db.py +++ b/mev_inspect/db.py @@ -30,9 +30,10 @@ def get_inspect_database_uri(): def _get_engine(uri: str): return create_engine( uri, - executemany_mode="values", + executemany_mode="batch", executemany_values_page_size=10000, - executemany_batch_page_size=500, + executemany_batch_page_size=10000, + ) diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index 7f387a1..57f5319 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -1,5 +1,5 @@ import logging -from typing import List, Optional, Any, Dict +from typing import List, Optional, Any, Dict, Tuple from sqlalchemy import orm from web3 import Web3 @@ -8,6 +8,7 @@ from mev_inspect.arbitrages import get_arbitrages from mev_inspect.block import create_from_block_number, get_classified_traces_from_events from mev_inspect.classifiers.trace import TraceClassifier from mev_inspect.crud.arbitrages import delete_arbitrages_for_blocks, write_arbitrages +from mev_inspect.crud.reserves import get_reserves, set_reserves from mev_inspect.crud.blocks import delete_blocks, write_blocks from mev_inspect.crud.liquidations import ( delete_liquidations_for_blocks, @@ -56,6 +57,10 @@ from mev_inspect.transfers import get_transfers logger = logging.getLogger(__name__) +import psycopg2 +import pickle +import time + async def inspect_block( inspect_db_session: orm.Session, @@ -75,6 +80,8 @@ async def inspect_block( should_write_classified_traces, ) +reserves: Dict[str, Tuple[str, str]] = dict() + async def inspect_many_blocks( inspect_db_session: orm.Session, @@ -86,54 +93,28 @@ async def inspect_many_blocks( should_write_classified_traces: bool = True, ): - count = 0 - arbitrages_payload = [] - liquidations_payload = [] - async for swaps, liquidations in get_classified_traces_from_events(w3, after_block_number, before_block_number): + for row in get_reserves(inspect_db_session).fetchall(): + reserves[row[0]] = (row[1], row[2]) + + all_swaps: List[Swap] = [] + all_arbitrages: List[Arbitrage] = [] + all_liquidations: List[Liquidation] = [] + + async for swaps, liquidations, new_reserves in get_classified_traces_from_events(w3, after_block_number, before_block_number, reserves): arbitrages = get_arbitrages(swaps) + if len(new_reserves) > 0: + set_reserves(inspect_db_session, new_reserves) - - count += len(arbitrages) - logger.info(f"{count} Found {len(swaps)} swaps and {len(arbitrages)} arbitrages") - if len(arbitrages) > 0: - for arb in arbitrages: - arb_payload: Dict[str, Any] = dict() - arb_payload['block_number'] = arb.block_number - arb_payload['transaction'] = arb.transaction_hash - arb_payload['account'] = arb.account_address - arb_payload['profit_amt'] = arb.profit_amount - arb_payload['token'] = arb.profit_token_address - arbitrages_payload.append(arb_payload) - count += 1 - - if len(liquidations) > 0: - for liq in liquidations: - liq_payload: Dict[str, Any] = dict() - liq_payload['block_number'] = liq.block_number - liq_payload['transaction'] = liq.transaction_hash - liq_payload['liquidator'] = liq.liquidator_user - liq_payload['purchase_addr'] = liq.debt_token_address - liq_payload['receive_addr'] = liq.received_token_address - liq_payload['purchase_amount'] = liq.debt_purchase_amount - liq_payload['receive_amount'] = liq.received_amount - liquidations_payload.append(liq_payload) - count+=1 - - if count >= 100: - print("sending to endpoint now") - # resp = requests.post("https://asia-south1-marlin-internal.cloudfunctions.net/mevPolygon/alerts", headers={'Content-type': 'application/json'}, json={"arbitrages": arbitrages_payload, "liquidations": liquidations_payload}) - # print("sending to endpoint ", resp.content.decode("utf-8"), flush=True) - arbitrages_payload = [] - liquidations_payload = [] - count = 0 - - if count > 0: - print("sending to endpoint now") - # resp = requests.post("https://asia-south1-marlin-internal.cloudfunctions.net/mevPolygon/alerts", headers={'Content-type': 'application/json'}, json={"arbitrages": arbitrages_payload, "liquidations": liquidations_payload}) - # print("sending to endpoint ", resp.content.decode("utf-8"), flush=True) - arbitrages_payload = [] - liquidations_payload = [] - count = 0 + all_swaps.extend(swaps) + all_arbitrages.extend(arbitrages) + all_liquidations.extend(liquidations) + + start = time.time() + write_swaps(inspect_db_session, all_swaps) + write_arbitrages(inspect_db_session, all_arbitrages) + write_liquidations(inspect_db_session, all_liquidations) + print("sent swaps: {}, arbitrages: {}, time: {}".format(len(all_swaps), len(all_arbitrages), time.time()-start)) + print("inspect complete...", after_block_number, before_block_number, flush=True) # all_blocks: List[Block] = [] # all_classified_traces: List[ClassifiedTrace] = [] diff --git a/mev_inspect/inspector.py b/mev_inspect/inspector.py index e3bb9c0..80b3fbf 100644 --- a/mev_inspect/inspector.py +++ b/mev_inspect/inspector.py @@ -67,7 +67,7 @@ class MEVInspector: trace_db_session: Optional[orm.Session], after_block: int, before_block: int, - block_batch_size: int = 300, + block_batch_size: int = 10000, ): tasks = [] for block_number in range(after_block, before_block, block_batch_size): diff --git a/sql/arbitrage_swaps.sql b/sql/arbitrage_swaps.sql new file mode 100644 index 0000000..1ce7ae3 --- /dev/null +++ b/sql/arbitrage_swaps.sql @@ -0,0 +1,63 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.4 +-- Dumped by pg_dump version 15.0 (Ubuntu 15.0-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: arbitrage_swaps; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.arbitrage_swaps ( + created_at timestamp without time zone DEFAULT now(), + arbitrage_id character varying(1024) NOT NULL, + swap_transaction_hash character varying(66) NOT NULL, + swap_trace_address integer[] NOT NULL +); + + +ALTER TABLE public.arbitrage_swaps OWNER TO postgres; + +-- +-- Name: arbitrage_swaps arbitrage_swaps_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.arbitrage_swaps + ADD CONSTRAINT arbitrage_swaps_pkey PRIMARY KEY (arbitrage_id, swap_transaction_hash, swap_trace_address); + + +-- +-- Name: arbitrage_swaps_swaps_idx; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX arbitrage_swaps_swaps_idx ON public.arbitrage_swaps USING btree (swap_transaction_hash, swap_trace_address); + + +-- +-- Name: arbitrage_swaps arbitrage_swaps_arbitrage_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.arbitrage_swaps + ADD CONSTRAINT arbitrage_swaps_arbitrage_id_fkey FOREIGN KEY (arbitrage_id) REFERENCES public.arbitrages(id) ON DELETE CASCADE; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/sql/arbitrages.sql b/sql/arbitrages.sql new file mode 100644 index 0000000..80b8a6f --- /dev/null +++ b/sql/arbitrages.sql @@ -0,0 +1,55 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.4 +-- Dumped by pg_dump version 15.0 (Ubuntu 15.0-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: arbitrages; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.arbitrages ( + id character varying(256) NOT NULL, + created_at timestamp without time zone DEFAULT now(), + account_address character varying(256) NOT NULL, + profit_token_address character varying(256) NOT NULL, + block_number numeric NOT NULL, + transaction_hash character varying(256) NOT NULL, + start_amount numeric NOT NULL, + end_amount numeric NOT NULL, + profit_amount numeric NOT NULL, + error character varying(256), + protocols character varying(256)[] DEFAULT '{}'::character varying[] +); + + +ALTER TABLE public.arbitrages OWNER TO postgres; + +-- +-- Name: arbitrages arbitrages_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.arbitrages + ADD CONSTRAINT arbitrages_pkey PRIMARY KEY (id); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/sql/liquidations.sql b/sql/liquidations.sql new file mode 100644 index 0000000..7f56101 --- /dev/null +++ b/sql/liquidations.sql @@ -0,0 +1,56 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.4 +-- Dumped by pg_dump version 15.0 (Ubuntu 15.0-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: liquidations; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.liquidations ( + created_at timestamp without time zone DEFAULT now(), + liquidated_user character varying(256) NOT NULL, + liquidator_user character varying(256) NOT NULL, + debt_token_address character varying(256) NOT NULL, + debt_purchase_amount numeric NOT NULL, + received_amount numeric NOT NULL, + protocol character varying(256), + transaction_hash character varying(66) NOT NULL, + trace_address character varying(256) NOT NULL, + block_number numeric NOT NULL, + received_token_address character varying(256), + error character varying(256) +); + + +ALTER TABLE public.liquidations OWNER TO postgres; + +-- +-- Name: liquidations liquidations_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.liquidations + ADD CONSTRAINT liquidations_pkey PRIMARY KEY (transaction_hash, trace_address); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/sql/reserves.sql b/sql/reserves.sql new file mode 100644 index 0000000..a2f5d2a --- /dev/null +++ b/sql/reserves.sql @@ -0,0 +1,39 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1) +-- Dumped by pg_dump version 14.5 (Ubuntu 14.5-0ubuntu0.22.04.1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: reserves; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.reserves ( + pool_address character(42), + token0 character(42), + token1 character(42) +); + + +ALTER TABLE public.reserves OWNER TO postgres; + +-- +-- PostgreSQL database dump complete +-- + diff --git a/sql/swaps.sql b/sql/swaps.sql new file mode 100644 index 0000000..2d31f42 --- /dev/null +++ b/sql/swaps.sql @@ -0,0 +1,59 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.4 +-- Dumped by pg_dump version 15.0 (Ubuntu 15.0-1.pgdg22.04+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: swaps; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.swaps ( + created_at timestamp without time zone DEFAULT now(), + abi_name character varying(1024) NOT NULL, + transaction_hash character varying(66) NOT NULL, + block_number numeric NOT NULL, + protocol character varying(256), + contract_address character varying(256) NOT NULL, + from_address character varying(256) NOT NULL, + to_address character varying(256) NOT NULL, + token_in_address character varying(256) NOT NULL, + token_in_amount numeric NOT NULL, + token_out_address character varying(256) NOT NULL, + token_out_amount numeric NOT NULL, + trace_address integer[] NOT NULL, + error character varying(256), + transaction_position numeric +); + + +ALTER TABLE public.swaps OWNER TO postgres; + +-- +-- Name: swaps swaps_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.swaps + ADD CONSTRAINT swaps_pkey PRIMARY KEY (block_number, transaction_hash, trace_address); + + +-- +-- PostgreSQL database dump complete +-- +