Skip to content

Instantly share code, notes, and snippets.

@darkerego
Last active January 24, 2023 00:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darkerego/0c6b044a7c20a123f2fb500a2fe107b7 to your computer and use it in GitHub Desktop.
Save darkerego/0c6b044a7c20a123f2fb500a2fe107b7 to your computer and use it in GitHub Desktop.
Crash Aurora Node
# from lib import multicalls
import asyncio
import nest_asyncio
tokens = [
{
"sym": "weth",
"address": "0xC9BdeEd33CD01541e1eeD10f90519d2C06Fe3feB",
"decimals": 18
},
{
"sym": "HAK",
"address": "0x5ac53f985ea80c6af769b9272f35f122201d0f56",
"decimals": 18
},
{
"sym": "AAVE",
"address": "0x4e834cdcc911605227eedddb89fad336ab9dc00a",
"decimals": 18
},
{
"sym": "ABR",
"address": "0x2BAe00C8BC1868a5F7a216E881Bae9e662630111",
"decimals": 18
},
{
"sym": "atLUNA",
"address": "0xC4bdd27c33ec7daa6fcfd8532ddB524Bf4038096",
"decimals": 18
},
{
"sym": "atUST",
"address": "0x5ce9F0B6AFb36135b5ddBF11705cEB65E634A9dC",
"decimals": 18
},
{
"sym": "abBUSD",
"address": "0x5C92A4A7f59A9484AFD79DbE251AD2380E589783",
"decimals": 18
},
{
"sym": "PAD",
"address": "0xBaE0d7DFcd03C90EBCe003C58332c1346A72836A",
"decimals": 18
},
{
"sym": "SOL",
"address": "0x0f00576d07B594Bdc1caf44b6014A6A02E5AFd48",
"decimals": 18
},
{
"sym": "agEUR",
"address": "0xdc7acde9ff18b4d189010a21a44ce51ec874ea7c",
"decimals": 18
},
{
"sym": "ANGLE",
"address": "0xb7e3617adb58dc34068522bd20cfe1660780b750",
"decimals": 18
},
{
"sym": "AURORA",
"address": "0x8bec47865ade3b172a928df8f990bc7f2a3b9f79",
"decimals": 18
},
{
"sym": "BAKED",
"address": "0x8973c9ec7b79fe880697cdbca744892682764c37",
"decimals": 18
},
{
"sym": "BAL",
"address": "0xb59d0fdaf498182ff19c4e80c00ecfc4470926e2",
"decimals": 18
},
{
"sym": "BAT",
"address": "0x2b9025aecc5ce7a8e6880d3e9c6e458927ecba04",
"decimals": 18
},
{
"sym": "bHOME",
"address": "0xe4baf0af161bf03434d1c5a53957981493c12c99",
"decimals": 6
},
{
"sym": "COMP",
"address": "0xdeacf0faa2b80af41470003b5f6cd113d47b4dcd",
"decimals": 18
},
{
"sym": "CREAM",
"address": "0xabe9818c5fb5e751c4310be6f0f18c8d85f9bd7f",
"decimals": 18
},
{
"sym": "CRF",
"address": "0x026dda7f0f0a2e42163c9c80d2a5b6958e35fc49",
"decimals": 18
},
{
"sym": "DAI",
"address": "0xe3520349f477a5f6eb06107066048508498a291b",
"decimals": 18
},
{
"sym": "DODO",
"address": "0xe301ed8c7630c9678c39e4e45193d1e7dfb914f7",
"decimals": 18
},
{
"sym": "FLX",
"address": "0xea62791aa682d455614eaa2a12ba3d9a2fd197af",
"decimals": 18
},
{
"sym": "FRAX",
"address": "0xda2585430fef327ad8ee44af8f1f989a2a91a3d2",
"decimals": 18
},
{
"sym": "FXS",
"address": "0xc8fdd32e0bf33f0396a18209188bb8c6fb8747d2",
"decimals": 18
},
{
"sym": "JUMBO",
"address": "0x6454e4a4891c6b78a5a85304d34558dda5f3d6d8",
"decimals": 18
},
{
"sym": "KSW",
"address": "0xE4eB03598f4DCAB740331fa432f4b85FF58AA97E",
"decimals": 18
},
{
"sym": "LINK",
"address": "0x94190d8ef039c670c6d6b9990142e0ce2a1e3178",
"decimals": 18
},
{
"sym": "LUNA",
"address": "0xfca152a9916895bf564e3f26a611f9e1e6aa6e73",
"decimals": 0
},
{
"sym": "MKR",
"address": "0x1d1f82d8b8fc72f29a8c268285347563cb6cd8b3",
"decimals": 18
},
{
"sym": "MNFT",
"address": "0xd126b48c072f4668e944a8895bc74044d5f2e85b",
"decimals": 18
},
{
"sym": "MODA",
"address": "0x74974575d2f1668c63036d51ff48dbaa68e52408",
"decimals": 18
},
{
"sym": "NDOL",
"address": "0xC86Ca2BB9C9c9c9F140d832dE00BfA9e153FA1e3",
"decimals": 18
},
{
"sym": "wNEAR",
"address": "0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d",
"decimals": 24
},
{
"sym": "NECC",
"address": "0x6EBA841F1201fFDDe7DDC2ba995D3308f6C4aEa0",
"decimals": 9
},
{
"sym": "NFD",
"address": "0x90eb16621274fb47a071001fbbf7550948874cb5",
"decimals": 18
},
{
"sym": "nNECC",
"address": "0x449f661c53aE0611a24c2883a910A563A7e42489",
"decimals": 18
},
{
"sym": "OCT",
"address": "0x951cfdc9544b726872a8faf56792ef6704731aae",
"decimals": 18
},
{
"sym": "OIN",
"address": "0x07b2055fbd17b601c780aeb3abf4c2b3a30c7aae",
"decimals": 8
},
{
"sym": "PAD",
"address": "0x885f8CF6E45bdd3fdcDc644efdcd0AC93880c781",
"decimals": 18
},
{
"sym": "PICKLE",
"address": "0x291c8fceaca3342b29cc36171deb98106f712c66",
"decimals": 18
},
{
"sym": "PULSE",
"address": "0x8828a5047d093f6354e3fe29ffcb2761300dc994",
"decimals": 18
},
{
"sym": "REN",
"address": "0x18921f1e257038e538ba24d49fa6495c8b1617bc",
"decimals": 18
},
{
"sym": "SNX",
"address": "0xdc9be1ff012d3c6da818d136a3b2e5fdd4442f74",
"decimals": 18
},
{
"sym": "SUSHI",
"address": "0x7821c773a12485b12a2b5b7bc451c3eb200986b1",
"decimals": 18
},
{
"sym": "TRI",
"address": "0xFa94348467f64D5A457F75F8bc40495D33c65aBB",
"decimals": 18
},
{
"sym": "UMINT",
"address": "0x984c2505a14da732d7271416356f535953610340",
"decimals": 18
},
{
"sym": "UNI",
"address": "0x1bc741235ec0ee86ad488fa49b69bb6c823ee7b7",
"decimals": 18
},
{
"sym": "USDC",
"address": "0xb12bfca5a55806aaf64e99521918a4bf0fc40802",
"decimals": 6
},
{
"sym": "USDT",
"address": "0x4988a896b1227218e4a686fde5eabdcabd91571f",
"decimals": 6
},
{
"sym": "UST",
"address": "0x098d5b6a26bca1d71f2335805d71b244f94e8a5f",
"decimals": 0
},
{
"sym": "WBTC",
"address": "0xf4eb217ba2454613b15dbdea6e5f22276410e89e",
"decimals": 8
},
{
"sym": "WSTR",
"address": "0xf34d508bac379825255cc80f66cbc89dfeff92e4",
"decimals": 18
},
{
"sym": "XNL",
"address": "0x7ca1c28663b76cfde424a9494555b94846205585",
"decimals": 18
},
{
"sym": "YFI",
"address": "0xa64514a8af3ff7366ad3d5daa5a548eefcef85e0",
"decimals": 18
},
{
"sym": "EMPYR",
"address": "0xE9F226a228Eb58d408FdB94c3ED5A18AF6968fE1",
"decimals": 9
}]
import asyncio
import os
import dotenv
import web3
from aiohttp import ClientResponseError
from web3.exceptions import ContractLogicError
from itertools import permutations
# from lib.modules import *
import multicall
class PoolPair:
# not needed for this
pass
class MultiCalls:
def __init__(self, w3, contract):
self.arb_contract = contract
self.w3 = w3
self.calls = []
self.param_dict = {}
def reset(self):
self.calls.clear()
def add_call_estimate_dual(self, trade: PoolPair):
call = multicall.Call(self.w3.toChecksumAddress(self.arb_contract),
['estimateDualDexTrade(address,address,address,address,uint256)((uint256))',
trade.pool1.pair.router, trade.pool2.pair.router, trade.pool1.pair.base,
trade.pool1.pair.quote, trade.order_qty],
[(trade.identifier, self.done_callback)])
self.calls.append(call)
def add_call_estimate_dual_reverse(self, trade: PoolPair):
call = multicall.Call(self.w3.toChecksumAddress(self.arb_contract),
['estimateDualDexTrade(address,address,address,address,uint256)((uint256))',
trade.pool1.pair.router, trade.pool2.pair.router, trade.pool1.pair.quote,
trade.pool1.pair.base, trade.order_qty],
[(trade.identifier, self.done_callback)])
self.calls.append(call)
def add_call_get_pair(self, factory, token1, token2):
call = multicall.Call(self.w3.toChecksumAddress(factory),
['getPair(address,address)((address))', token1, token2],
[(f'{factory}_{token1}_{token2}', self.done_callback)])
self.calls.append(call)
def add_call_get_reserves(self, pair_address):
pair_address = self.w3.toChecksumAddress(pair_address)
call = multicall.Call(pair_address, ['getReserves()((uint112,uint112,uint32))'],
[(pair_address, self.done_callback)])
self.calls.append(call)
def add_call_get_factory(self, router_address):
router_address = self.w3.toChecksumAddress(router_address)
call = multicall.Call(router_address, ['factory()((address))'],
[(router_address, self.done_callback)])
self.calls.append(call)
@staticmethod
def done_callback(value):
return value
async def run(self):
ret = {}
sleeper = 1.5
# print(self.calls)
for x in range(3):
m = multicall.Multicall(calls=self.calls, _w3=self.w3)
try:
ret = m()
except ClientResponseError as err:
print(err)
sleeper += sleeper
await asyncio.sleep(sleeper)
except ContractLogicError as err:
print(f'[!] Multicall Failed: {err}!')
sleeper += sleeper
await asyncio.sleep(sleeper)
else:
break
# self.reset()
return ret
async def reproduce_error(tokens):
""" To reproduce error on Aurora nodes, you can
run this:
"""
routers = ['0x2CB45Edb4517d5947aFdE3BEAbF95A582506858B',
'0xa3a1ef5ae6561572023363862e238afa84c72ef5',
'0xA1B1742e9c32C7cAa9726d8204bD5715e3419861',
'0xBaE0d7DFcd03C90EBCe003C58332c1346A72836A']
aurora_ws_endpoint = None # Set endpoint here
if not aurora_ws_endpoint:
print('You need to set the endpoint URL in the code first')
exit(1)
dotenv.load_dotenv()
w3 = web3.Web3(web3.WebsocketProvider(aurora_ws_endpoint)) # input rpc endpoint
mc = MultiCalls(w3, None)
for router in routers:
mc.add_call_get_factory(router)
factories = ret = await mc.run() # This should work .. but,
mc.reset()
_pairs = permutations([x.get('address') for x in tokens], 2)
for k, factory in factories.items():
for pair in _pairs:
print(pair)
pair = sorted(pair)
mc.add_call_get_pair(w3.toChecksumAddress(factory[0]), w3.toChecksumAddress(pair[0]),
w3.toChecksumAddress(pair[1]))
await mc.run()
"""After it crashes, further web3 calls will fail. this will fail.
The websocket should not be working , and web3 will start throwing 404 errors"""
print(w3.eth.gas_price)
if __name__ == '__main__':
nest_asyncio.apply()
asyncio.run(reproduce_error(tokens))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment