Test Vectors

Static canonical strings with pre-computed SHA-256 digests for every signed attestation type — price, econ, indices, gas, and weather. Use these to verify your parsing, hashing, and signature verification implementation.

How to use these vectors

For each type: (1) UTF-8 encode the canonical string, (2) compute SHA-256, (3) compare to the expected digest. If your digest matches, your hashing implementation is correct. Field positions are shown for parsing verification. See Signature Verification for full code examples.

PRICE — Crypto / FX / Metals

canonical string
v1|PRICE|BTCUSD|84231.50|USD|2|binance,binance_us,bitfinex,bitstamp,coinbase,gateio,gemini,kraken,okx|median|1741514400|482910
SHA-256 digest
40ca32bf0d7f8b0fb43051b3ae7f8c7bcbe6532c00d56e6e8b48fab022291ad2
PositionFieldValue
0VERSIONv1
1TYPEPRICE
2PAIRBTCUSD
3PRICE84231.50
4CURRENCYUSD
5DECIMALS2
6SOURCESbinance,binance_us,bitfinex,bitstamp,coinbase,gateio,gemini,kraken,okx
7METHODmedian
8TIMESTAMP1741514400
9NONCE482910

10 fields. Sources are lexicographically sorted. Price zero-padded to DECIMALS precision.

ECON — US / EU Economic Indicators

canonical string
v1|ECON|US|CPI|326.785|index198284100|2026-02|2026-03-14|BLS|CUUR0000SA0|directapi|1741514400|830114
SHA-256 digest
9fb45f3fed7075bb0733e12d304a49d7477d732a98425bb9aba3b22f09ceae65
PositionFieldValue
0VERSIONv1
1TYPEECON
2REGIONUS
3INDICATORCPI
4VALUE326.785
5UNITindex198284100
6PERIOD2026-02
7VINTAGEDATE2026-03-14
8SOURCEAGENCYBLS
9SERIESIDCUUR0000SA0
10SOURCEMODELdirectapi
11TIMESTAMP1741514400
12NONCE830114

13 fields. COMMODITIES use the same structure with REGION=COMMODITIES and INDICATOR=SYMBOL (e.g. WTI).

COMMODITIES — via ECON type

canonical string
v1|ECON|COMMODITIES|WTI|94.65|usdperbarrel|2026-03-09|2026-03-15|EIA|DCOILWTICO|directapi|1741514400|402341
SHA-256 digest
6fd0776144fdc7c602ac18fed2d71e53750bee1933c210b4c9b8380ff6b2dfb3

13 fields. Same structure as ECON. TYPE=ECON, REGION=COMMODITIES, INDICATOR=WTI. SOURCEMODEL is always directapi.

VOLATILITY — MSVI Index

canonical string
v1|VOLATILITY|BTCUSD|MSVI|15.65|index|30D|RV:38.99:0.3,IV:38.39:0.25,TS:0.909:0.15,FR:20.02:0.2,PCR:0.651:0.1|CONFIDENCE:0.6765|METHOD:v1|1744416000|291847
SHA-256 digest
2c86e6520888d7fd08bc0acf3fb0c68710c4b04d101d46a80da94e708058f0e7
PositionFieldValue
0VERSIONv1
1TYPEVOLATILITY
2PAIRBTCUSD
3INDEXMSVI
4VALUE15.65
5UNITindex (lowercase)
6WINDOW30D
7COMPONENTSRV:38.99:0.3,IV:38.39:0.25,TS:0.909:0.15,FR:20.02:0.2,PCR:0.651:0.1
8CONFIDENCECONFIDENCE:0.6765
9METHODMETHOD:v1
10TIMESTAMP1744416000
11NONCE291847
MSVI differs from MSXI/MSSI

VOLATILITY has 30D window field at position 6 and no REGIME field. UNIT is lowercase index. Component values are raw (not normalized). See Canonical Format for precision rules.

SENTIMENT — MSXI Index

canonical string
v1|SENTIMENT|BTCUSD|MSXI|-9.88|INDEX|FR:-0.00:0.3,SKEW:-4.12:0.25,PCR:0.863:0.2,TS:0.923:0.15,BASIS:0.049:0.1|REGIME:NEUTRAL|CONFIDENCE:1.0000|METHOD:v1|1744416000|382910
SHA-256 digest
d4b14525eb4b1ad4e811363ad087c591d0fbad37c6779f7c25c019002ce8b8c4
PositionFieldValue
0VERSIONv1
1TYPESENTIMENT
2PAIRBTCUSD
3INDEXMSXI
4VALUE-9.88
5UNITINDEX (uppercase)
6COMPONENTSFR:-0.00:0.3,SKEW:-4.12:0.25,PCR:0.863:0.2,TS:0.923:0.15,BASIS:0.049:0.1
7REGIMEREGIME:NEUTRAL
8CONFIDENCECONFIDENCE:1.0000
9METHODMETHOD:v1
10TIMESTAMP1744416000
11NONCE382910

12 fields. Has REGIME (unlike VOLATILITY). UNIT is uppercase INDEX. Values can be negative (bearish positioning).

STRESS — MSSI Index

canonical string
v1|STRESS|MARKET|MSSI|64.32|INDEX|VOL:61.81:0.35,STBL:0.00:0.3,FR:38.57:0.35|REGIME:HIGH|CONFIDENCE:1.0000|METHOD:v1|1744416000|571923
SHA-256 digest
c3278af823048e30cf09d47ab0cb5477da82e36ee97fb336a3a4b19ff2cb45ac
PositionFieldValue
0VERSIONv1
1TYPESTRESS
2SCOPEMARKET
3INDEXMSSI
4VALUE64.32
5UNITINDEX
6COMPONENTSVOL:61.81:0.35,STBL:0.00:0.3,FR:38.57:0.35
7REGIMEREGIME:HIGH
8CONFIDENCECONFIDENCE:1.0000
9METHODMETHOD:v1
10TIMESTAMP1744416000
11NONCE571923

12 fields. Same structure as SENTIMENT. SCOPE is always MARKET (not per-pair). Regimes: CALM, ELEVATED, HIGH, EXTREME.

GAS — Single Chain

canonical string
v1|GAS|ethereum|14.523100|12.100000|0.456789|2450.00|4|median|1744416000
SHA-256 digest
04bb5d3a852712bedf66d1fceed3e9160130c388df50a3f162538b0d4eb51d3d
PositionFieldValue
0VERSIONv1
1TYPEGAS
2CHAINethereum
3GAS_GWEI14.523100 (6dp)
4BASE_FEE12.100000 (6dp)
5TX_COST_USD0.456789 (6dp)
6NATIVE_PRICE_USD2450.00 (2dp)
7SOURCE_COUNT4
8METHODmedian
9TIMESTAMP1744416000
No NONCE field

GAS canonicals do not include a nonce. Timestamp is the last field. Gas/fee values use 6 decimal places; native price uses 2.

GAS_INDEX — Cross-Chain Index

canonical string
v1|GAS_INDEX|6|arbitrum|arbitrum:0.001234,base:0.002100,optimism:0.003456,polygon:0.004200,bsc:0.012300,ethereum:0.456789|1744416000
SHA-256 digest
18fcfca3b12d7e1c74d1dcfaf2e039159f328dbc1f7fc7fbc7f6d94d16f5a4bd
PositionFieldValue
0VERSIONv1
1TYPEGAS_INDEX
2CHAIN_COUNT6
3CHEAPESTarbitrum
4CHAIN_SUMMARIESarbitrum:0.001234,base:0.002100,...
5TIMESTAMP1744416000

6 fields. No NONCE. Chain summaries are comma-separated chain:txCostUsd pairs sorted by cost ascending.

WEATHER — WRSI (Drought Index)

canonical string
v1|WEATHER|51.51,-0.13|WRSI|0.72|RAIN:45.2mm|ET0:62.8mm|30D|ADEQUATE|1744416000|291847
SHA-256 digest
8bdca45f119d2443a702b9965b44601d944eaccde309d4acd7953c7177ab6159
PositionFieldValue
0VERSIONv1
1TYPEWEATHER
2COORDS51.51,-0.13
3SUBTYPEWRSI
4VALUE0.72
5RAINRAIN:45.2mm
6ET0ET0:62.8mm
7WINDOW30D
8STATUSADEQUATE
9TIMESTAMP1744416000
10NONCE291847

11 fields. Status values: ADEQUATE, STRESSED, DROUGHT, SEVERE_DROUGHT. Trigger: WRSI < 0.50.

WEATHER — Rainfall

canonical string
v1|WEATHER|51.51,-0.13|RAINFALL|45.2mm|MAX:12.3mm|DRY:8d|30D|1744416000|382910
SHA-256 digest
ba17de905c7393c437370deb1b24ca99dd28e976fd2b3364bcd6c38fba4e5bc6

10 fields. Total rainfall with max daily and dry day count.

WEATHER — Temperature

canonical string
v1|WEATHER|51.51,-0.13|TEMPERATURE|TMAX:24.5C|TMIN:-2.1C|FROST:3d|HEAT:0d|30D|1744416000|571923
SHA-256 digest
9f8da3ca90bd1c99db7ebceb653263b5997d8e07728018d665c81ad5904d1629

11 fields. Frost trigger: TMIN < 0°C. Heat stress trigger: TMAX > 35°C.

WEATHER — Wind

canonical string
v1|WEATHER|51.51,-0.13|WIND|MAX:78.4kmh|MEAN:22.1kmh|STORM:0d|GALE:1d|14D|1744416000|402341
SHA-256 digest
97e9578affb6c465174ec2604c0f782e484a7968d8f88d659de6bb77756cfcab

11 fields. Storm trigger: > 117 km/h. Gale trigger: > 62 km/h.

Marine, COT, DLC

Marine and COT endpoints do not currently produce pipe-delimited canonical strings. DLC uses binary TLV encoding (Oracle Attestation v3) per the DLC specification — see the DLC Oracle guide for that format.

Verification Pseudocode

python
import hashlib

# 1. Take the canonical string from the response
canonical = response["canonical"]

# 2. UTF-8 encode and SHA-256 hash
digest = hashlib.sha256(canonical.encode("utf-8")).digest()
hex_digest = digest.hex()

# 3. Compare to expected test vector digest
assert hex_digest == "40ca32bf0d7f8b0fb43051b3ae7f8c7bcbe6532c00d56e6e8b48fab022291ad2"

# 4. Parse fields
fields = canonical.split("|")
type_id = fields[1]    # "PRICE"
price   = fields[3]    # "84231.50"
sources = fields[6].split(",")  # ["binance", ...]

# 5. Verify signature (Ed25519 over the digest, not raw canonical)
# See /docs/verification/ for full implementation
Signing uses SHA-256 prehash

Ed25519 signatures are computed over SHA-256(canonical), not the raw canonical bytes. This is non-standard — most Ed25519 libraries expect raw input. You must hash first, then pass the 32-byte digest to the verify function. See Signature Verification for copy-paste code.

Component Precision Reference

ComponentDecimal PlacesTypes
RV, IV, FR, SKEW, VOL, STBL2VOLATILITY, SENTIMENT, STRESS
PCR, TS3VOLATILITY, SENTIMENT
BASIS4SENTIMENT
Index VALUE2All index types
CONFIDENCE4All index types
Unavailable componentKEY:NA:weight

Field Count Summary

TypeFieldsHas REGIMEHas WINDOWHas NONCE
PRICE10NoNoYes
ECON13NoNoYes
VOLATILITY12NoYes (30D)Yes
SENTIMENT12YesNoYes
STRESS12YesNoYes
GAS10NoNoNo
GAS_INDEX6NoNoNo
WEATHER (WRSI)11NoYesYes
WEATHER (RAINFALL)10NoYesYes
WEATHER (TEMPERATURE)11NoYesYes
WEATHER (WIND)11NoYesYes