Skip to content

Instantly share code, notes, and snippets.

@itzmeanjan
Last active May 28, 2021
Embed
What would you like to do?
Polygon ( aka Matic Network ) Mempool Exploration
#!/usr/bin/python3
from python_graphql_client import GraphqlClient
from json import dumps
from asyncio import run
from re import compile as re_compile
from pytimeparse import parse
reg = re_compile(r'^(\d+(\.\d+)?)')
handle = None
def prettyPrint(data):
tx = data["data"]["newConfirmedTx"]
price = reg.search(tx['gasPrice'])
if not price:
return
parsed = parse(tx["pendingFor"])
if not parsed:
return
handle.write(f'{float(price.group())}; {parsed}\n')
print(dumps(data, sort_keys=True, indent=2))
def main():
try:
client = GraphqlClient(endpoint="ws://localhost:7000/v1/graphql")
query = """
subscription {
newConfirmedTx {
gasPrice
pendingFor
}
}
"""
with open('log.csv', 'w+') as fd:
global handle
handle = fd
print('Catching confirmed tx(s) ...')
run(client.subscribe(query=query, handle=prettyPrint))
except Exception as e:
print(e)
except KeyboardInterrupt:
print('\nStopping')
if __name__ == '__main__':
main()
pandas==1.1.2
matplotlib==3.3.2
python_graphql_client==0.4.3
pytimeparse==1.1.8
#!/usr/bin/python3
from matplotlib import pyplot as plt
from pandas.core.frame import DataFrame
def plot(df) -> bool:
try:
with plt.style.context('dark_background'):
fig = plt.Figure(
figsize=(18, 9),
dpi=100)
fig.gca().plot('x', 'y', 'wo ', data=df, markersize=1.0)
fig.gca().set_xlabel('Gas Price ( in Gwei )', labelpad=12)
fig.gca().set_ylabel('Waiting time in Mempool ( in Second )', labelpad=12)
fig.suptitle('Polygon Mempool Analysis', fontsize=20, y=1)
fig.savefig(
'plot.png',
bbox_inches='tight',
pad_inches=.5)
plt.close(fig)
return True
except Exception as e:
print(f'Error : {e}')
return False
def read() -> DataFrame:
fd = open('log.csv', 'r')
x = []
y = []
while True:
ln = fd.readline()
if not ln:
break
vals = [float(v.strip()) for v in ln.split(';')]
x.append(vals[0])
y.append(vals[1])
return DataFrame({'x': x, 'y': y})
def main():
if plot(read()):
print('Plotted !')
if __name__ == '__main__':
main()
@itzmeanjan

This comment has been minimized.

Copy link
Owner Author

@itzmeanjan itzmeanjan commented May 28, 2021

What's this ?

These scripts are supposed to be used in conjunction with harmony - Reduce Chaos in Mempool, for exploring mempool data.

More about harmony

  • First set up harmony by following respective README.md
  • Make sure you've >= Python3.8
  • Create virtual environment
python3 -m venv venv
source venv/bin/activate
  • Install dependencies
pip install -r requirements.txt
  • Run catch.py for catching confirmed txs & logging them in ./log.csv
python catch.py # let it run for sometime
  • You must see log.csv generated in same directory
head log.csv
gas-price-in-gwei time-spent-waiting-in-mempool-in-second
22.8658532; 2237.219117212
1.0; 3824.690001799
5.0; 1833.636202321
50.0; 984.657260686
  • Now you can run viz.py for generating scatter plot of GasPrice vs Tx Waiting Period
python viz.py
  • It should generate plot.png in same directory
file plot.png
@itzmeanjan

This comment has been minimized.

Copy link
Owner Author

@itzmeanjan itzmeanjan commented May 28, 2021

When you're done, consider disabling virtual environment

deactivate
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment