Files
PolyWeather/scripts/replay_payment_events.py
T

69 lines
2.3 KiB
Python
Raw Normal View History

import argparse
import json
import os
import sys
from typing import Any, Dict, List
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if PROJECT_ROOT not in sys.path:
sys.path.insert(0, PROJECT_ROOT)
from src.payments import PAYMENT_CHECKOUT # noqa: E402
from src.payments.event_loop import _decode_order_paid_log # noqa: E402
def _collect_logs(from_block: int, to_block: int) -> List[Dict[str, Any]]:
w3 = PAYMENT_CHECKOUT._get_web3(force_refresh=True) # noqa: SLF001
receiver_contracts = sorted(
{
token.receiver_contract
for token in PAYMENT_CHECKOUT.supported_tokens.values()
if token.receiver_contract
}
)
if not receiver_contracts:
return []
topic0 = str(PAYMENT_CHECKOUT._event_topic or "").strip() # noqa: SLF001
params: Dict[str, Any] = {
"fromBlock": int(from_block),
"toBlock": int(to_block),
"topics": [topic0],
"address": receiver_contracts if len(receiver_contracts) > 1 else receiver_contracts[0],
}
logs = w3.eth.get_logs(params)
out: List[Dict[str, Any]] = []
for log_item in logs:
decoded = _decode_order_paid_log(log_item)
if decoded:
out.append(decoded)
return out
def main():
parser = argparse.ArgumentParser(description="Replay payment OrderPaid events across a block range.")
parser.add_argument("--from-block", type=int, required=True)
parser.add_argument("--to-block", type=int, required=True)
parser.add_argument(
"--output",
default=os.path.join(PROJECT_ROOT, "artifacts", "payments", "replay_payment_events.json"),
)
args = parser.parse_args()
rows = _collect_logs(args.from_block, args.to_block)
payload = {
"from_block": int(args.from_block),
"to_block": int(args.to_block),
"count": len(rows),
"events": rows,
}
output_dir = os.path.dirname(os.path.abspath(args.output))
if output_dir:
os.makedirs(output_dir, exist_ok=True)
with open(args.output, "w", encoding="utf-8") as fh:
json.dump(payload, fh, ensure_ascii=False, indent=2)
print(json.dumps({"count": len(rows), "output": args.output}, ensure_ascii=False))
if __name__ == "__main__":
main()