69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
|
|
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()
|