> For the complete documentation index, see [llms.txt](https://docs.aftermath.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aftermath.finance/perpetuals/architecture/market-specifications/24-5-commodity-markets.md).

# 24/5 Commodity Markets

Specifications, session hours, and oracle details for commodity-referenced perpetuals.

Commodity-referenced perpetuals track spot or futures-based commodity prices via oracle feeds that reflect real-world exchange pricing. Because the underlying commodity markets are not open around the clock, these perpetuals follow the trading session schedule of the relevant exchange.

### Instrument Specifications

| Market | Ticker         | Description                                                                                                                  | Settlement | Max Leverage | MMR | Liq. Leverage | Margin Mode | Contract Size | Oracle                                                                                                                                            |
| ------ | -------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------- | ------------ | --- | ------------- | ----------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| Silver | XAG/USD:USDC   | Tracks the value of 1 troy ounce of silver.                                                                                  | USDC       | 10×          | 5%  | 20×           | Isolated    | 0.00001       | [Pyth (XAG)](https://app.pyth.com/explore/Metal.XAG%2FUSD)                                                                                        |
| WTI    | WTI/USD:USDC   | Tracks West Texas Intermediate crude oil through cash-settled ICE Futures Europe WTI futures. See Oracle Roll section below. | USDC       | 5×           | 10% | 10×           | Isolated    | 0.00001       | [Pyth CLLX6 (front)](https://app.pyth.com/explore/Commodities.CLLX6%2FUSD) / [CLLZ6 (next)](https://app.pyth.com/explore/Commodities.CLLZ6%2FUSD) |
| Brent  | BRENT/USD:USDC | Tracks the price of Brent crude oil. See Oracle Roll section below.                                                          | USDC       | 5×           | 10% | 10×           | Isolated    | 0.00001       | [Pyth (front)](https://app.pyth.com/explore/Commodities.BRENTZ6%2FUSD) / [next](https://app.pyth.com/explore/Commodities.BRENTF7%2FUSD)           |

**MMR** (Maintenance Margin Ratio) is the minimum margin a position must hold before liquidation; **Liq. Leverage** = 1 / MMR. Liquidations are partial — only the amount needed to restore the position to max initial leverage is closed. See [Margin](/perpetuals/architecture/margin.md) and [Liquidations](/perpetuals/architecture/liquidations.md). Parameters are governance-configurable with an on-chain time delay.

### Session Hours

| Market    | Session hours                                                                                                                                                                                              |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **WTI**   | Sunday 11:00 PM–midnight; Monday midnight–11:00 PM; Tuesday–Friday 1:00 AM–11:00 PM; Saturday closed. All times use the Europe/London time zone.                                                           |
| **Brent** | Sunday 11:00 PM–midnight, Monday midnight–11:00 PM, and Tuesday–Friday 1:00 AM–11:00 PM in the Europe/London time zone. Trading follows the feed-specific holiday schedule shown on the linked Pyth pages. |

WTI's hours follow the regular market session reported by both configured `CLL` feeds. The Europe/London time zone applies daylight-saving changes automatically. Pyth's feed-specific holiday closures and early closes override the weekly schedule; when the required feeds are closed, the rolling oracle cannot receive a fresh index update.

### Oracle Roll (WTI)

The market remains named **WTI** with ticker `WTI/USD:USDC`. Its oracle inputs now use Pyth's `CLL` contract series, which tracks [WTI crude futures listed on ICE Futures Europe](https://www.ice.com/products/213). `CLL` is the Pyth feed-family code for this venue-specific WTI series; it does not refer to a different underlying commodity. The ICE contract is quoted in USD per barrel and cash-settled against the prevailing market price for U.S. light sweet crude.

WTI is priced from dated futures contracts. When a front-month contract approaches expiry, a discrete oracle switch from one feed to another would create a predictable price cliff that is trivially front-runnable.

Aftermath solves this with a continuous linear blend computed on-chain whenever the rolling price feed is updated:

#### Blend Formula

$$
P\_{blended} = w\_{front\_month} ⋅
P\_{front\_month} + w\_{next\_month} ⋅ P\_{next\_month}
$$

Where w₁ + w₂ = 1 always. The deployed rolling oracle derives the weights from the current timestamp `t` and the configured on-chain roll window:

* If `t ≤ roll_start`: w₁ = 1.0 (100% front month)
* If `t ≥ roll_end`: w₁ = 0.0 (100% next month)
* Otherwise: w₂ = (`t` − `roll_start`) / (`roll_end` − `roll_start`), and w₁ = 1 − w₂

The roll window is configured on-chain. For the current WTI roll, blending begins October 7, 2026 at 9:30 PM UTC and completes October 13, 2026 at 9:30 PM UTC, ahead of the front contract's October 19 expiry. This provides a smooth, continuous transition with no front-runnable price discontinuity.

#### Key Properties

* Computed **on-chain** whenever the rolling feed is updated
* Eliminates the front-running opportunity present in discrete oracle switches
* Both raw Pyth feeds are visible on-chain for anyone to verify
* WTI futures roll monthly; the front feed, next feed, and roll window are configured on-chain for each cycle

#### Active Pyth Feeds

The oracle consumes two Pyth Network feeds simultaneously:

| Role  | Pyth feed                                                         | Lazer ID | ICE WTI contract | Feed expiry                                    | Pyth status |
| ----- | ----------------------------------------------------------------- | -------- | ---------------- | ---------------------------------------------- | ----------- |
| Front | [CLLX6/USD](https://app.pyth.com/explore/Commodities.CLLX6%2FUSD) | `3454`   | November 2026    | October 19, 2026 at 7:30 PM BST (6:30 PM UTC)  | Stable      |
| Next  | [CLLZ6/USD](https://app.pyth.com/explore/Commodities.CLLZ6%2FUSD) | `3455`   | December 2026    | November 19, 2026 at 6:30 PM GMT (6:30 PM UTC) | Stable      |

The [on-chain `WTIUSD` rolling object](/perpetuals/contracts.md) exposes `front_feed_id: 3454`, `next_feed_id: 3455`, `roll_start_timestamp_ms: 1791408600000`, `roll_end_timestamp_ms: 1791927000000`, and `expiry_timestamp_ms: 1792434600000`. These correspond to the roll and expiry times documented above, so anyone can verify the active configuration directly from Sui mainnet.

#### Verify the On-Chain Roll

The live configuration and the deployed roll calculation are both public on Sui. Send the following queries to the [Sui mainnet GraphQL endpoint](https://graphql.mainnet.sui.io/graphql).

First, query the WTI roll object:

```graphql
query VerifyWtiRollConfiguration {
  wtiRoll: object(
    address: "0xa9e7e6c24eb29920831ed5e5f5e101eb985eacf4ef619fc620f7f4511e9d286a"
  ) {
    version
    previousTransaction {
      digest
    }
    asMoveObject {
      contents {
        type {
          repr
        }
        json
      }
    }
  }
}
```

The returned JSON shows the active front and next Pyth feed IDs, roll start, roll end, and front-feed expiry. Timestamps are Unix milliseconds. `previousTransaction.digest` identifies the transaction that last changed the object.

Then inspect the deployed rolling-oracle implementation:

```graphql
query VerifyWtiRollLogic {
  package(
    address: "0x7ab17437b8abad366757ac8cec7cdf8ab483090d9d5026e45cc37f27769535e8"
  ) {
    version
    module(name: "price_feed_storage") {
      name
      disassembly
    }
  }
}
```

In `blended_price_and_timestamp_ms`, the deployed Move bytecode returns the front feed at or before `roll_start`, the next feed at or after `roll_end`, and the time-weighted blend between them during the window. This lets anyone verify both the configured inputs and the roll behavior without relying on an off-chain description.

After `roll_end`, the next feed becomes the price source. The feed configuration is then advanced for the subsequent expiry. Contract symbols use standard futures month codes: F=Jan, G=Feb, H=Mar, J=Apr, K=May, M=Jun, N=Jul, Q=Aug, U=Sep, V=Oct, X=Nov, Z=Dec.

### Oracle Roll (BRENT)

BRENT uses the same on-chain linear-blend mechanism as WTI, applied to ICE Brent crude futures. Its current oracle configuration is:

* Front contract: [BRENTZ6/USD](https://app.pyth.com/explore/Commodities.BRENTZ6%2FUSD), expiring October 30, 2026
* Next contract: [BRENTF7/USD](https://app.pyth.com/explore/Commodities.BRENTF7%2FUSD), expiring November 30, 2026
* Roll window: October 7, 2026 at 9:30 PM UTC through October 13, 2026 at 9:30 PM UTC

The same blend formula and key properties described above apply to BRENT. After the roll window, the next contract becomes the active price source and the on-chain feed configuration advances for the following monthly expiry.
