# RedStone Oracle Divergence \[Use RedStone data in Newton policies to stop vault actions when price feeds are stale, divergent, or persistently outside thresholds.]

The RedStone policy compares a RedStone price feed against an onchain oracle and checks whether the divergence is acceptable. It is useful when vault operations depend on fresh and reliable market data.

## Deployment

| Field | Value |
| --- | --- |
| Pack id | `redstone` |
| PolicyData addresses | [VaultKit address table](/developers/vaults/policy-packs#deployed-policydata-addresses) |
| Canonical deployments | [`deployments.json`](https://github.com/newt-foundation/newton-policy-packs/blob/main/deployments.json) |

### Secret

| Secret | Required? | Where to get it |
| --- | --- | --- |
| None | Keyless | [redstone.finance](https://redstone.finance) |

## Data Inputs

The RedStone data oracle returns values such as:

* `redstone_feed_age_seconds`
* `divergence_bp`
* `prev_snapshot_present`
* `prev_divergence_bp`
* `sustained_seconds`

## Rego Checks

Use these exact Rego checks to enforce each guardrail.

### Stale Feed

```rego
deny contains "redstone_feed_stale" if v.redstone_feed_age_seconds > t.max_feed_age_seconds
```

### Hard Divergence Cap

```rego
deny contains "divergence_above_hard_cap" if v.divergence_bp >= t.deny_bp
```

### Sustained Divergence

```rego
deny contains "divergence_sustained" if {
    t.enable_sustained_check
    v.prev_snapshot_present
    v.divergence_bp >= t.warn_bp
    v.prev_divergence_bp >= t.warn_bp
    v.sustained_seconds >= t.deny_sustained_seconds
}
```

### Final Allow Rule

```rego
allow if count(deny) == 0
```

## Complete Policy

```rego
package redstone_oracle_divergence

import future.keywords

default allow := false

t := data.params.redstone
v := data.wasm.redstone

deny contains "redstone_feed_stale" if v.redstone_feed_age_seconds > t.max_feed_age_seconds

deny contains "divergence_above_hard_cap" if v.divergence_bp >= t.deny_bp

deny contains "divergence_sustained" if {
    t.enable_sustained_check
    v.prev_snapshot_present
    v.divergence_bp >= t.warn_bp
    v.prev_divergence_bp >= t.warn_bp
    v.sustained_seconds >= t.deny_sustained_seconds
}

allow if count(deny) == 0
```
