Metadata-Version: 2.4
Name: sra-riskgate
Version: 0.4.0
Summary: Deterministic pre-filter and risk evaluation gate for stablecoin transactions
Author: Sriram Ramakrishnan
License-Expression: Apache-2.0
Project-URL: Homepage, https://huggingface.co/sriram1983007/SRA-RiskGate-4B
Project-URL: Dataset, https://huggingface.co/datasets/sriram1983007/sra-stablecoin-risk-bench
Project-URL: Repository, https://github.com/sriram1983007-dev/sra-riskgate
Project-URL: Changelog, https://github.com/sriram1983007-dev/sra-riskgate/blob/main/CHANGELOG.md
Keywords: stablecoin,payments,compliance,risk,x402,usdc,agentkit,ai-agents
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Classifier: Topic :: Office/Business :: Financial
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pydantic>=2.0
Provides-Extra: agentkit
Requires-Dist: coinbase-agentkit<0.8,>=0.7.4; extra == "agentkit"
Requires-Dist: solana<0.37,>=0.36.6; extra == "agentkit"
Provides-Extra: x402
Requires-Dist: x402[evm]<3,>=2.25; extra == "x402"
Provides-Extra: test
Requires-Dist: pytest>=7; extra == "test"
Requires-Dist: eth-abi>=5; extra == "test"
Dynamic: license-file

# sra-riskgate

[![Tests](https://github.com/sriram1983007-dev/sra-riskgate/actions/workflows/tests.yml/badge.svg)](https://github.com/sriram1983007-dev/sra-riskgate/actions/workflows/tests.yml)
[![PyPI](https://img.shields.io/pypi/v/sra-riskgate)](https://pypi.org/project/sra-riskgate/)
[![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
[![Model](https://img.shields.io/badge/🤗%20Model-SRA--RiskGate--4B-yellow)](https://huggingface.co/sriram1983007/SRA-RiskGate-4B)
[![Results](https://img.shields.io/badge/🤗%20Results-Reproducible-brightgreen)](https://huggingface.co/datasets/sriram1983007/sra-bench-results)

Risk checks for stablecoin and AI-agent payments.

This repository contains:

- **`sra-riskgate`**, a small Python SDK with deterministic pre-filter rules (address validation,
  self-transfer blocking, amount ceilings, USDC depeg checks in both directions) and a
  [Coinbase AgentKit](https://github.com/coinbase/agentkit) action provider that sends USDC only
  after those rules approve.
- **`eval/`**, the scripts used to benchmark the
  [SRA-RiskGate-4B](https://huggingface.co/sriram1983007/SRA-RiskGate-4B) model on
  [sra-stablecoin-risk-bench](https://huggingface.co/datasets/sriram1983007/sra-stablecoin-risk-bench).

The SDK does not load the 4B model and does not perform sanctions screening. It is a fast,
deterministic first layer; the model handles the full policy and evidence review.

## Install

```bash
pip install sra-riskgate                 # core rules (only dependency: pydantic)
pip install "sra-riskgate[agentkit]"     # plus the Coinbase AgentKit integration
pip install "sra-riskgate[x402]"         # plus the x402 integration
```

## Rule pre-filter

```python
from sra_riskgate import RulePreFilter, TransactionPayload

gate = RulePreFilter(max_amount=50_000, depeg_hold_pct=1.0, depeg_reject_pct=5.0)

verdict = gate.inspect(TransactionPayload(
    chain_id=1, token="USDC",
    sender="0x" + "a" * 40, recipient="0x" + "b" * 40,
    amount=5000.0, peg_deviation_pct=-1.5,
))
print(verdict.decision.value, verdict.flags, verdict.required_actions)
# hold ['MODERATE_DEPEG'] ['manual_review']
```

| Rule | Decision |
|---|---|
| Malformed, zero or self address; non-positive or non-finite amount | rejected at validation |
| Peg deviation NaN or infinite | reject |
| abs(peg deviation) ≥ `depeg_reject_pct` | reject |
| abs(peg deviation) ≥ `depeg_hold_pct` | hold |
| amount > `max_amount` | hold |
| otherwise | approve |

## AgentKit action provider

```python
from coinbase_agentkit import AgentKit, AgentKitConfig, CdpEvmWalletProvider, CdpEvmWalletProviderConfig
from sra_riskgate.integrations.agentkit import RiskGateActionProvider

wallet = CdpEvmWalletProvider(CdpEvmWalletProviderConfig(
    api_key_id="...", api_key_secret="...", wallet_secret="...", network_id="base-sepolia",
))
agentkit = AgentKit(AgentKitConfig(
    wallet_provider=wallet,
    # Register ONLY this provider for payments: AgentKit's wallet and ERC-20
    # providers expose their own transfer actions that bypass the gate.
    action_providers=[RiskGateActionProvider(max_amount=1000.0, peg_feed=my_usdc_peg_feed)],
))
```

The agent gets one action, `risk_gated_usdc_transfer`. It sends USDC as an ERC-20 transfer
(never the native token) on Ethereum, Base and Base Sepolia, reads the chain from the wallet,
reports reverted transactions as failures, and holds the transfer if the peg feed errors.
Without a `peg_feed`, depeg checks are disabled and every result says so.

## x402 hooks

Works with the official [x402](https://github.com/x402-foundation/x402) Python SDK through its
lifecycle hooks, so the same checks run wherever x402 is used.

```python
from x402 import x402FacilitatorSync, x402ClientSync
from sra_riskgate.integrations.x402_hooks import RiskGateX402Hooks

# Resource server or facilitator: checked before verification and before settlement
facilitator = RiskGateX402Hooks(max_amount=1000).attach_to_facilitator(x402FacilitatorSync())

# Paying agent: checked before the agent signs anything
client = RiskGateX402Hooks(max_amount=50, payer_address=MY_WALLET).attach_to_client(x402ClientSync())
```

Rejected, held, malformed or unknown payments are aborted with a reason starting with
`sra_riskgate_` (for example `sra_riskgate_hold`), which x402 raises as `PaymentAbortedError`.
USDC on Ethereum, Base and Base Sepolia is checked; other assets are aborted unless
`allow_unsupported_assets=True`. Pass `peg_feed` to enable depeg checks and `on_decision` to log
every decision. x402's own client spend controls stay active alongside these checks.

Requires x402 2.25 or newer. Coinbase AgentKit 0.7.x currently depends on the older x402 1.x, so
install the `[agentkit]` and `[x402]` extras in separate environments.

## Model results

Independently reproduced on all 2,000 held-out test cases, with every prediction published in
[sra-bench-results](https://huggingface.co/datasets/sriram1983007/sra-bench-results):

| Metric | Base Qwen3-4B | SRA-RiskGate-4B |
|---|---|---|
| Unsafe payment approvals ↓ | 34.6% | **0.47%** |
| Payment decision accuracy ↑ | 59.8% | **99.5%** |
| Injected payments approved ↓ | 52.2% | **5.8%** |
| Dispute outcome accuracy ↑ | 0.0% | **77.8%** |
| Over-blocking ↓ | 5.2% | **0.0%** |

See the [model card](https://huggingface.co/sriram1983007/SRA-RiskGate-4B) for the full table
and limitations. To reproduce or add a model, see [`eval/README.md`](eval/README.md).

## Development

```bash
pip install -e ".[test]"            # core tests
pip install -e ".[agentkit,test]"   # plus AgentKit integration tests
pytest -q
```

Every push and pull request runs the test suite on GitHub Actions. Before publishing to PyPI,
build the wheel, install it in a fresh virtual environment and run the tests against the
installed package.

## License

Apache-2.0
