Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6ed6bc9
Add beta Futures data streams page
Aug 22, 2026
557e8ab
Add single-source data risk note to Futures page
Aug 22, 2026
4a40e1e
Simplify beta note and drop launch-specific language
Aug 23, 2026
0a1ddac
Trim redundant naming disclaimer
Aug 23, 2026
e2ad5af
Add schema fields, exact roll time, and tighten liquidity wording
Aug 24, 2026
d789e61
Expand Schema section with v14 field list
Aug 24, 2026
50af80d
Address review feedback from Will
Aug 24, 2026
5dad343
Add Brent coverage, last_trading_day field, roll methodology fields, …
Aug 28, 2026
b69b851
Rename Brent to UK Oil for naming consistency
Aug 28, 2026
b730d95
Remove CME name from roll-timing example
Aug 28, 2026
838fef1
Merge branch 'main' into docs/commodities-futures-beta
dev-dist Sep 16, 2026
6044d7f
restructure, ingest, tested examples, wip development notes
dev-dist Sep 16, 2026
da38c0c
Merge branch 'main' into docs/commodities-futures-beta
dev-dist Sep 28, 2026
8f38867
update interpolatedgoldmanrollprice description
dev-dist Sep 28, 2026
5c1ad21
Merge branch 'main' into docs/commodities-futures-beta
dev-dist Sep 28, 2026
eb2dacc
Merge branch 'main' into docs/commodities-futures-beta
dev-dist Oct 21, 2026
fbf68ed
llms
dev-dist Oct 21, 2026
e1cbff7
updates after recent testing for beta launch
dev-dist Oct 21, 2026
f74a0dd
Merge branch 'main' into docs/commodities-futures-beta
dev-dist Oct 21, 2026
c95ad9c
update to reflect real contract
dev-dist Oct 21, 2026
73bd00f
update market hours considerations
dev-dist Oct 21, 2026
59d4c1d
revert changes back to sebastin's og copy
dev-dist Oct 21, 2026
bdf71d0
review updates
dev-dist Oct 22, 2026
51411b2
goldeman fix
dev-dist Oct 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions public/changelog.json
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,14 @@
}
},
"data": [
{
"category": "release",
"date": "2026-10-21",
"description": "Chainlink Data Streams now offers **beta access** to US Oil, UK Oil, and Natural Gas futures streams on Arbitrum. Start with the [Futures](https://docs.chain.link/data-streams/rwa-streams/futures) page for coverage and integration guidance.\n\nFutures reports use the [Futures (v14) schema](https://docs.chain.link/data-streams/reference/report-schema-v14), which includes contract expiration, first day of notice, contract month, market status, and Goldman Roll prices. For trading hours and `marketStatus` values, see [Market Hours](https://docs.chain.link/data-streams/market-hours#futures-v14).\n\nBeta access: contact [chainlink_data_feeds@smartcontract.com](mailto:chainlink_data_feeds@smartcontract.com).",
"relatedNetworks": ["arbitrum"],
"title": "Futures streams beta now available",
"topic": "Data Streams"
},
{
"category": "feature",
"date": "2026-10-19",
Expand Down
86 changes: 86 additions & 0 deletions public/samples/DataStreams/FuturesFetch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// FuturesFetch.go — Fetch and decode a Futures (v14) report with the Go SDK.
//
// Usage:
// export API_KEY="..."
// export API_SECRET="..."
// go run FuturesFetch.go 0x000eaf52614042ff33b2726b0d9c5db032fc816d4a215bd823d9385662afd57d
package main

import (
"context"
"fmt"
"os"
"time"

streams "github.com/smartcontractkit/data-streams-sdk/go/v2"
feed "github.com/smartcontractkit/data-streams-sdk/go/v2/feed"
report "github.com/smartcontractkit/data-streams-sdk/go/v2/report"
v14 "github.com/smartcontractkit/data-streams-sdk/go/v2/report/v14"
)

func main() {
if len(os.Args) < 2 {
fmt.Fprintf(os.Stderr, "Usage: go run FuturesFetch.go [FeedID]\n")
os.Exit(1)
}
feedIDInput := os.Args[1]

apiKey := os.Getenv("API_KEY")
apiSecret := os.Getenv("API_SECRET")
if apiKey == "" || apiSecret == "" {
fmt.Fprintf(os.Stderr, "API_KEY and API_SECRET environment variables must be set\n")
os.Exit(1)
}

cfg := streams.Config{
ApiKey: apiKey,
ApiSecret: apiSecret,
RestURL: "https://api.testnet-dataengine.chain.link",
Logger: streams.LogPrintf,
}

client, err := streams.New(cfg)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create client: %v\n", err)
os.Exit(1)
}

ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()

var feedID feed.ID
if err := feedID.FromString(feedIDInput); err != nil {
fmt.Fprintf(os.Stderr, "Invalid feed ID format '%s': %v\n", feedIDInput, err)
os.Exit(1)
}

reportResponse, err := client.GetLatestReport(ctx, feedID)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to get latest report: %v\n", err)
os.Exit(1)
}

// Decode the v14 (Futures) report
decodedReport, err := report.Decode[v14.Data](reportResponse.FullReport)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to decode report: %v\n", err)
os.Exit(1)
}

d := decodedReport.Data

fmt.Printf("\nDecoded V14 Report for Stream ID %s:\n", feedIDInput)
fmt.Println("------------------------------------------")
fmt.Printf("Mid Price : %s\n", d.MidPrice.String())
fmt.Printf("Bid Price : %s\n", d.BidPrice.String())
fmt.Printf("Ask Price : %s\n", d.AskPrice.String())
fmt.Printf("Expiry Time : %d\n", d.ExpiryTime.Unix())
fmt.Printf("First Day of Notice : %d\n", d.FirstDayOfNotice.Unix())
fmt.Printf("Last Seen TimestampNs : %d\n", d.LastSeenTimestampNs.UnixNano())
fmt.Printf("Market Status : %d\n", d.MarketStatus)
fmt.Printf("Contract Month : %d\n", d.ContractMonth)
fmt.Printf("Goldman Roll Price : %s\n", d.GoldmanRollPrice.String())
fmt.Printf("Current Business Day : %d\n", d.CurrentBusinessDay)
fmt.Printf("Interp Goldman Roll : %s\n", d.InterpolatedGoldmanRollPrice.String())
fmt.Println("------------------------------------------")
}
60 changes: 60 additions & 0 deletions public/samples/DataStreams/FuturesFetch.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// FuturesFetch.rs — Fetch and decode a Futures (v14) report with the Rust SDK.
//
// Usage:
// export API_KEY="..."
// export API_SECRET="..."
// cargo run 0x000eaf52614042ff33b2726b0d9c5db032fc816d4a215bd823d9385662afd57d
use chainlink_data_streams_report::feed_id::ID;
use chainlink_data_streams_report::report::{ decode_full_report, v14::ReportDataV14 };
use chainlink_data_streams_sdk::client::Client;
use chainlink_data_streams_sdk::config::Config;
use std::env;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("Usage: cargo run [FeedID]");
std::process::exit(1);
}
let feed_id_input = &args[1];

let api_key = env::var("API_KEY").expect("API_KEY must be set");
let api_secret = env::var("API_SECRET").expect("API_SECRET must be set");

let config = Config::new(
api_key,
api_secret,
"https://api.testnet-dataengine.chain.link".to_string(),
"wss://api.testnet-dataengine.chain.link/ws".to_string(),
)
.build()?;

let client = Client::new(config)?;

let feed_id = ID::from_hex_str(feed_id_input)?;

let response = client.get_latest_report(feed_id).await?;

let full_report = hex::decode(&response.report.full_report[2..])?;
let (_report_context, report_blob) = decode_full_report(&full_report)?;
let report_data = ReportDataV14::decode(&report_blob)?;

println!("\nDecoded V14 Report for Stream ID {}:", feed_id_input);
println!("------------------------------------------");
println!("Mid Price : {}", report_data.mid_price);
println!("Bid Price : {}", report_data.bid_price);
println!("Ask Price : {}", report_data.ask_price);
println!("Expiry Time : {}", report_data.expiry_time);
println!("First Day of Notice : {}", report_data.first_day_of_notice);
println!("Last Seen TimestampNs : {}", report_data.last_seen_timestamp_ns);
println!("Market Status : {}", report_data.market_status);
println!("Contract Month : {}", report_data.contract_month);
println!("Goldman Roll Price : {}", report_data.goldman_roll_price);
println!("Current Business Day : {}", report_data.current_business_day);
println!("Interp Goldman Roll : {}", report_data.interpolated_goldman_roll_price);
println!("------------------------------------------");

Ok(())
}
51 changes: 51 additions & 0 deletions public/samples/DataStreams/FuturesFetch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// FuturesFetch.ts — Fetch and decode a Futures (v14) report with the TypeScript SDK.
//
// Usage:
// export API_KEY="..."
// export USER_SECRET="..."
// npx tsx FuturesFetch.ts 0x000eaf52614042ff33b2726b0d9c5db032fc816d4a215bd823d9385662afd57d
import { createClient, decodeReport, getReportVersion, formatReport, LogLevel } from "@chainlink/data-streams-sdk"
import "dotenv/config"

async function main() {
if (process.argv.length < 3) {
console.error("Please provide a feed ID as an argument")
process.exit(1)
}

const feedId = process.argv[2]
const version = getReportVersion(feedId)

const config = {
apiKey: process.env.API_KEY || "YOUR_API_KEY",
userSecret: process.env.USER_SECRET || "YOUR_USER_SECRET",
endpoint: "https://api.testnet-dataengine.chain.link",
wsEndpoint: "wss://ws.testnet-dataengine.chain.link",
logging: {
logger: console,
logLevel: LogLevel.INFO,
},
}

const client = createClient(config)
console.log(`\nFetching latest report for feed ${feedId} (${version})...\n`)

const report = await client.getLatestReport(feedId)
console.log(`Raw Report Blob: ${report.fullReport}`)

// The TS SDK auto-detects the report version from the feed ID.
const decodedData = decodeReport(report.fullReport, report.feedID)

const decodedReport = {
...decodedData,
feedID: report.feedID,
validFromTimestamp: report.validFromTimestamp,
observationsTimestamp: report.observationsTimestamp,
}
console.log(formatReport(decodedReport, version))
}

main().catch((error) => {
console.error("Error:", error instanceof Error ? error.message : error)
process.exit(1)
})
8 changes: 8 additions & 0 deletions src/config/sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1714,6 +1714,10 @@ export const SIDEBAR_WITH_SUNSET_PRODUCTS: Partial<Record<Sections, SectionEntry
title: "Report Schema v11 (RWA Advanced)",
url: "data-streams/reference/report-schema-v11",
},
{
title: "Report Schema v14 (Futures)",
url: "data-streams/reference/report-schema-v14",
},
{
title: "Handling Market Events",
url: "data-streams/rwa-streams/handling-market-events",
Expand All @@ -1727,6 +1731,10 @@ export const SIDEBAR_WITH_SUNSET_PRODUCTS: Partial<Record<Sections, SectionEntry
title: "APAC Equities",
url: "data-streams/rwa-streams/apac-equities",
},
{
title: "Futures",
url: "data-streams/rwa-streams/futures",
},
],
},
{
Expand Down
Loading
Loading