Skip to content

Preda-1/Vault

Repository files navigation

Vault Paradex Refund Toolkit

Overview

This repository hosts a lightweight data toolkit used to audit Paradex vault activity on Starknet. It focuses on reconstructing refund allocations from raw on-chain events gathered through the Starknet JSON-RPC API. The codebase is intentionally dependency-free so that it can be executed in restricted environments that only ship with the Python standard library.

Primary use cases:

  • Generate structured JSON and CSV reports quantifying refunds owed to vault depositors.
  • Experiment with different trade-window assumptions to see how exclusion rules impact refunds.
  • Compare independently curated refund lists to validate reconciliation efforts.

Repository Structure

├── compare_refunds.py                   # Compare two JSON refund sources.
├── refunds_after_close_cashflow*.py     # Script entry points (one per refund policy).
└── vault_refunds/                       # Shared library powering all scripts.
    ├── cli.py
    ├── events.py
    ├── refunds.py
    ├── rpc.py
    └── utils.py

The vault_refunds package encapsulates all reusable logic: JSON-RPC plumbing, event parsing, decimal handling, and refund computation. The root-level scripts are thin wrappers that select a specific refund policy and expose it through a friendly CLI.

Requirements

  • Python 3.9 or newer.
  • A Starknet JSON-RPC endpoint with access to the Paradex vault events you intend to analyse.

No additional dependencies are required.

Usage

All refund scripts share the same arguments; they only differ by the trade-window policy applied to deposits and/or withdraws. Logically they compute:

Script Mode Refund Formula
refunds_after_close_cashflow.py Standard max(0, deposits - withdraws)
refunds_after_close_cashflow_excl_window.py Exclude deposits in trade window max(0, deposits_outside_window - withdraws)
refunds_after_close_cashflow_excl_wdw_withdraws.py Exclude withdraws in trade window max(0, deposits - withdraws_outside_window)
refunds_after_close_cashflow_excl_both.py Exclude deposits and withdraws in trade window max(0, deposits_outside_window - withdraws_outside_window)

Typical command (refunds_after_close_cashflow.py shown, the others follow the same pattern):

python refunds_after_close_cashflow.py ^
  --vault 0x... ^
  --rpc https://my-starknet-node.example ^
  --token-allowlist 0x...USDC ^
  --postfilter-after 2025-08-12T12:30:00Z ^
  --trade-start 2025-08-07T12:40:00Z ^
  --trade-end 2025-08-12T12:30:00Z ^
  --from-block 0 ^
  --to-block -1 ^
  --chunk-size 2048 ^
  --out-json refunds_after_close_cashflow.json ^
  --csv-out refunds_after_close_cashflow.csv

Key arguments:

  • --vault: Paradex vault contract address.
  • --rpc: Starknet JSON-RPC endpoint URL.
  • --token-allowlist: ERC-20 addresses to keep (e.g. the USDC vault asset).
  • --asset-decimals: Token decimals (default 6 for USDC).
  • --deposit-selector / --withdraw-selector: Event selectors; defaults match the Paradex vault ABI.
  • --postfilter-after: Only wallets with a withdraw strictly after this timestamp are considered.
  • --trade-start / --trade-end: Inclusive trade window used in the exclusion logic.
  • --from-block / --to-block: Optional block range (use -1 to process up to the latest block).
  • --chunk-size: Event pagination size (tune for your RPC provider).
  • --out-json: JSON report path.
  • --csv-out: Optional CSV summary path limited to addresses that receive a refund.

The JSON output follows the structure below:

{
  "meta": {
    "vault": "0x...",
    "token_allowlist": ["0x..."],
    "asset_decimals": 6,
    "postfilter_after": "2025-08-12T12:30:00Z",
    "trade_window": {
      "start": "2025-08-07T12:40:00Z",
      "end": "2025-08-12T12:30:00Z",
      "rule": "Deposits ... excluded ..."
    },
    "unknown_addr_in_deposits": 0,
    "unknown_addr_in_withdraws": 0,
    "events_scanned": {
      "deposits": 12345,
      "withdraws": 6789
    },
    "notes": [
      "Refund = max(0, ...)"
    ]
  },
  "totals": {
    "sum_deposits_all": "123.456000",
    "sum_withdraws_all": "12.340000",
    "sum_refund": "111.116000"
  },
  "results": [
    {
      "address": "0x...",
      "deposits_total": "10.000000",
      "withdraws_total": "1.000000",
      "refund_amount": "9.000000",
      "deposits": [
        {
          "ts": "2025-08-10T12:00:00Z",
          "block_number": 123,
          "token": "0x...USDC",
          "amount": "5.000000",
          "tx": "0x..."
        }
      ],
      "withdraws": [
        {
          "ts": "2025-08-12T13:00:00Z",
          "block_number": 456,
          "token": "0x...USDC",
          "amount": "1.000000",
          "tx": "0x..."
        }
      ]
    }
  ]
}

Comparing Refund Lists

compare_refunds.py helps validate that two JSON outputs agree within a configurable tolerance:

python compare_refunds.py --cashflow refunds_after_close_cashflow.json --legacy refunds_complet.json

The script reports:

  • Address coverage of each file and the shared intersection.
  • Aggregate refund totals for both sources.
  • Number of addresses with differences above the tolerance.
  • Largest discrepancies and addresses that appear in only one file (top five each).

Development Notes

  • The repository avoids storing any sensitive information. Addresses and selectors included in the defaults are publicly known Paradex values.
  • All strings are strictly ASCII to guarantee compatibility with terminals and CI logs.
  • python -m compileall . can be used to perform a quick static sanity check.
  • The new modular layout allows re-use from Jupyter notebooks or other scripts:
from vault_refunds.cli import run_cli, RefundMode

run_cli(RefundMode.STANDARD, argv=[
    "--vault", "0x...",
    "--rpc", "https://...",
    "--token-allowlist", "0x...USDC",
    "--out-json", "report.json",
])

License

Choose the license that matches your publishing requirements before pushing the project to a public repository. Until then the code is provided without an explicit license.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages