Created
July 29, 2025 04:52
-
-
Save FoobarProtocol/b30cbc3c356957a7e055b997338ea39c to your computer and use it in GitHub Desktop.
Extract all functions and relevant information from all vaults owned by the same set of authorized signers as the ones from the Bybit Vault
This file contains hidden or 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
| #!/usr/bin/env python3 | |
| """ | |
| Fetch Token Flow query results for a list of contract addresses. | |
| * For each address: | |
| 1. POST the SQL (with address injected) -> receive sfqid | |
| 2. POST sfqid -> receive JSON results | |
| 3. Save to 0xXXXXXXXX.json (first 10 chars of address) | |
| Requires: requests, tqdm | |
| Install: pip install requests tqdm | |
| """ | |
| import json | |
| import uuid | |
| import time | |
| import requests | |
| from tqdm import tqdm | |
| # ────────────────────────────────────────────────────────── | |
| # 1) LIST OF CONTRACT ADDRESSES | |
| # ────────────────────────────────────────────────────────── | |
| ADDRESSES = [ | |
| "0x0162cd2ba40e23378bf0fd41f919e1be075f025f", | |
| "0x0729ff91c188ebc6f290ba4e228cff72ef940044", | |
| "0x086a8d541febd35bed66a799e08a1799af5f4481", | |
| "0x089423ad2f9f195a72b28d37c902a1d060586d39", | |
| "0x22afb6c6cbbf93c1faea58d418a131e6419136d2", | |
| "0x2cdd560058d5ac32dc416aaa09eaf93230c0b7b3", | |
| "0x2ebf891f4718eb8367013d8d975a1e5afcae277f", | |
| "0x3cc3a225769900e003e264dd4cb43e90896bc21a", | |
| "0x3dd4b4dbe6aee6f49a65f0c1ac508deff761c195", | |
| "0x6f4565c9d673dbdd379aba0b13f8088d1af3bb0c", | |
| "0x705199fe234a7a2f1bc8b95dd7d08284c8f467f1", | |
| "0x72ede922683dc98497317744cd9ee62345462561", | |
| "0x75ae0e74b18290646b5c56c2ff6e58f9e41a9c33", | |
| "0x828424517f9f04015db02169f4026d57b2b07229", | |
| "0x85bb961973a56c6c3d95571e6da2eb39ba08f098", | |
| "0x8ce1153aecf131e12963ce995d07036583f3a4e3", | |
| "0xa7a93fd0a276fc1c0197a5b5623ed117786eed06", | |
| "0xb9e977203150711fa134055e8244e87f9d6504d2", | |
| "0xbe72691aca605050d1e693a2c2c6a9f3f41dc939", | |
| "0xc3350595ed42ebe94556277bc77d257c76065291", | |
| "0xd2a730496f04db457176c3a265c2b459a64d4068", | |
| "0xd2f0c70ac768cba8c10ee64fc2657ee8c1ca862f", | |
| "0xd367f8322b64f29faf71ddb5c1877dc9ed6ec644", | |
| "0xdeaf3d23c6b712ba708bde7f063e32a40d3b44ba", | |
| "0xe1ab8c08294f8ee707d4efa458eab8bbeeb09215", | |
| "0xe3df2cceac61b1afa311372ecc5b40a3a6585a9e", | |
| ] | |
| # ────────────────────────────────────────────────────────── | |
| # 2) CONSTANT TEMPLATE SQL (address placeholder: {addr}) | |
| # ────────────────────────────────────────────────────────── | |
| SQL_TEMPLATE = """ | |
| SELECT | |
| t.block_number, | |
| t.block_timestamp, | |
| t.tx_hash, | |
| c.call_data, | |
| c.call_path, | |
| c.call_depth, | |
| c.call_type, | |
| c.from_address, | |
| c.to_address, | |
| c.function_signature, | |
| c.function_name, | |
| c.arguments, | |
| c.outputs, | |
| c.call_value, | |
| c.gas_used, | |
| c.reverted, | |
| e.event_name, | |
| e.event_signature, | |
| e.parameters, | |
| e.event_topics, | |
| e.log_data, | |
| e.raw_parameters, | |
| e.contract_address AS event_emitter | |
| FROM ETHEREUM.CORE.TRANSACTIONS t | |
| JOIN ETHEREUM.CORE.CALLS c | |
| ON t.tx_hash = c.tx_hash | |
| LEFT JOIN ETHEREUM.CORE.EVENTS e | |
| ON t.tx_hash = e.tx_hash | |
| WHERE | |
| t.to_address = LOWER('{addr}') | |
| AND ( | |
| (c.call_type = 'CALL' AND c.function_name = 'execTransaction') | |
| OR | |
| e.event_name IS NOT NULL | |
| ) | |
| ORDER BY | |
| t.block_number ASC, | |
| c.call_path; | |
| """.strip() | |
| # ────────────────────────────────────────────────────────── | |
| # 3) STATIC HEADERS (update your TOKEN / COOKIE!) | |
| # ────────────────────────────────────────────────────────── | |
| BASE_HEADERS = { | |
| "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:141.0) Gecko/20100101 Firefox/141.0", | |
| "Accept": "application/json, text/plain, */*", | |
| "Accept-Language": "en-US,en;q=0.5", | |
| "Accept-Encoding": "gzip, deflate, br, zstd", | |
| "Referer": "https://app.tokenflow.live/studio/editor/67f8fecbbfbc75b4006e6ec1", | |
| "Content-Type": "application/json", | |
| "Authorization": "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IkJMTjRTNDRGdkd6VlFycEFJRHFNRCJ9.eyJ4LXVzZXItcm9sZSI6WyJyZWdpc3RlcmVkLXVzZXIiXSwiaXNzIjoiaHR0cHM6Ly9hdXRoLnRva2VuZmxvdy5saXZlLyIsInN1YiI6Im9hdXRoMnxnaXRodWItY3VzdG9tfDEzMDg3OTY3NyIsImF1ZCI6WyJodHRwczovL3Rva2VuZmxvdy9zdHVkaW8iLCJodHRwczovL3Rva2VuZmxvdy5ldS5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzQ4Nzk4NTgzLCJleHAiOjE3NDg4ODQ5ODMsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhenAiOiJwTVFYTnFVMzczTTBNemhIT3RqY2wyN3A0T2xvYnVXOCIsInBlcm1pc3Npb25zIjpbImFkZC51c2VyIiwiY3JlYXRlLmRhc2hib2FyZCIsImNyZWF0ZS5mb2xkZXIiLCJjcmVhdGUucXVlcnkgIiwiZGVsZXRlLmRhc2hib2FyZC5vd24iLCJkZWxldGUuZm9sZGVyLm93biIsImRlbGV0ZS5xdWVyeS5vd24iLCJlZGl0LmRhc2hib2FyZC5vd24iLCJlZGl0LmZvbGRlci5vd24iLCJlZGl0LnF1ZXJ5Lm93biIsImV4ZWN1dGUucXVlcnkuY29tbXVuaXR5IiwiZXhlY3V0ZS5xdWVyeS5wdWJsaWMiLCJzY2hlZHVsZS5xdWVyeS5vd24iLCJzaGFyZS5kYXNoYm9hcmQub3duIiwic2hhcmUucXVlcnkub3duIiwidmlldy5kYXNoYm9hcmQuZ3Vlc3QiLCJ2aWV3LmRhc2hib2FyZC5vdGhlciIsInZpZXcuZGFzaGJvYXJkLm93biIsInZpZXcuZm9sZGVyLm93biIsInZpZXcucXVlcnkub3RoZXIiLCJ2aWV3LnF1ZXJ5Lm93biIsInZpZXcudXNlci5vd24iXX0.TVqG1VMv4pAdbuOafUoFrXxtmFUZNA81hAEhX56E0w-BmkNfD629fnZk6eYMflQXZRMRd9Q_ThpRES2JXuSZZjohG4zYSrTno9XYRdxPCloUtGL9mDxB_5EBkIIQes652hok-zDoHGqzeBwHAypXlX9qwSUFRBMEOtzFEZ2ZK9qb10weomVMw4Y1fjb8TlHfyL7gJcyo7_AB8VhMIQVfuwEBYU3HC8dXKcHkjNZdBxjY_uHr5blmp86YsXeNc-0F9h8Rn-vySIjloJ7fx3x-gBcGTjiUL3tHrrezhDM8XXdDRMd80OQSiZeMEACXQo1GqOyk6HzS7o1U3w0eFmkNog", | |
| "Origin": "https://app.tokenflow.live", | |
| "DNT": "1", | |
| "Sec-GPC": "1", | |
| "Connection": "keep-alive" | |
| } | |
| URL = "https://app.tokenflow.live/studio/api/proxy/data_warehouse" | |
| # ────────────────────────────────────────────────────────── | |
| # 4) FUNCTIONS | |
| # ────────────────────────────────────────────────────────── | |
| def fresh_ids() -> dict: | |
| """Return fresh request-id / idempotency headers each call.""" | |
| return { | |
| "x-tokenflow-request-id": str(uuid.uuid4()), | |
| "Idempotency-Key": str(uuid.uuid4().int) | |
| } | |
| def submit_sql(address: str, session: requests.Session) -> str: | |
| """Step 1: submit SQL → return sfqid.""" | |
| sql = SQL_TEMPLATE.format(addr=address.lower()) | |
| body = {"query": sql, "execute_async": True} | |
| r = session.post( | |
| URL, | |
| headers={**BASE_HEADERS, **fresh_ids()}, | |
| json=body, | |
| timeout=60 | |
| ) | |
| r.raise_for_status() | |
| sfqid = r.json()["detail"] | |
| return sfqid | |
| def fetch_results(sfqid: str, session: requests.Session) -> dict: | |
| """Step 2: POST sfqid → return JSON result.""" | |
| body = {"sfqid": sfqid} | |
| r = session.post( | |
| URL, | |
| headers={**BASE_HEADERS, **fresh_ids()}, | |
| json=body, | |
| timeout=120 | |
| ) | |
| r.raise_for_status() | |
| return r.json() | |
| def save_json(addr: str, data: dict) -> None: | |
| fname = f"{addr[:10]}.json" # e.g. 0x0162cd2b.json | |
| with open(fname, "w", encoding="utf-8") as f: | |
| json.dump(data, f, indent=2) | |
| # ────────────────────────────────────────────────────────── | |
| # 5) MAIN LOOP | |
| # ────────────────────────────────────────────────────────── | |
| def main(): | |
| session = requests.Session() | |
| for addr in tqdm(ADDRESSES, desc="Contracts"): | |
| try: | |
| sfqid = submit_sql(addr, session) | |
| # small pause avoids “query not ready” race | |
| time.sleep(0.3) | |
| result = fetch_results(sfqid, session) | |
| save_json(addr, result) | |
| except Exception as exc: | |
| print(f"\n[ERROR] {addr}: {exc}") | |
| continue | |
| print("\n✅ Finished – JSON files written.") | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment