Skip to content

Instantly share code, notes, and snippets.

@FoobarProtocol
Created July 29, 2025 04:52
Show Gist options
  • Select an option

  • Save FoobarProtocol/b30cbc3c356957a7e055b997338ea39c to your computer and use it in GitHub Desktop.

Select an option

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
#!/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