Integration claims made verifiable: on-chain contract addresses, the live anchoring evidence, and the exact verification math for Flare FCC. Components not yet deployed are honestly marked PENDING and switch to LIVE the moment their address is configured.
Every settlement and proof contract with its network, address and explorer link - populated live from the operator chain settings.
| contract | role | network | address | status |
|---|---|---|---|---|
| WeatherOracleAnchor contracts/WeatherOracleAnchor.sol | Legacy first-generation anchors (until 2026-09-23) | BSC 56 | 0x0c5FaC0a9304D52Cc3628B8D279a59a8C7d480d7 ↗ | LEGACY |
| WeatherMarketFlare contracts/flare/WeatherMarketFlare.sol | FTSOv2-priced FLR payment | Flare 114 | 0x8D0f464ed5F332ac726e084C5ebC620Cf055d4Ff ↗ | TESTNET |
| WeatherFccConsumer contracts/flare/WeatherFccConsumer.sol | FCC TEE result consumer | Flare 114 | 0xef9374B90ecB8a70891a55F503441E8c4Ae346BD ↗ | TESTNET |
| SnapshotAnchor contracts/flare/SnapshotAnchor.sol | Every run's snapshot hash, written directly on Flare (v3) | Flare 14 | 0x2B59812947B48B5988FaA805a9514a5162415091 ↗ | MAINNET LIVE |
| XrplAnchorVerifier contracts/flare/XrplAnchorVerifier.sol | Proves the XRPL anchor on Flare via FDC | Flare 14 | 0x59cEB96Bc78B9f6c7a5EF48987Fe8aB6248CBE3A ↗ | MAINNET LIVE |
| DeterminationRegistry contracts/flare/DeterminationRegistry.sol | Publishes resolved verdicts for contracts to read | Flare 14 | 0x0c5FaC0a9304D52Cc3628B8D279a59a8C7d480d7 ↗ | MAINNET LIVE |
| XRP payment lib/xrpl/pay.ts | Subscription payment received here, in native XRP | XRPL mainnet | rMgtvhe5n8h1thkGsfz5q2F6WmssuxXuCn ↗ | MAINNET LIVE |
| Anchor sender contracts/flare/XrplAnchorVerifier.sol | Legacy (v2): only payments from here counted as memo anchors | XRPL mainnet | rarEpetXGmEzLgZ8vZQz3Ntk1DzcfRL9K3 ↗ | MAINNET LIVE |
| Legacy memo anchor lib/xrpl/anchor.ts | Destination of the v2 1-drop anchor payments (none sent since 2026-09-23) | XRPL mainnet | rhY5XG6acykEsWq5DD6et6i86T2MVYvpux ↗ | MAINNET LIVE |
Source files ship in this repository under contracts/. Addresses appear here automatically once deployed and saved in the admin chain settings - no rebuild.
The most recent index snapshot and its SHA-256. Anyone can re-download the canonical bytes, re-hash them, and compare against the anchors recorded on the ledgers listed above.
Since 2026-09-23 the anchor of record is one call on Flare: the publisher key writes SnapshotAnchor.anchor(sha256, date, runId), the contract stores the block number and timestamp, and it refuses to overwrite a hash that already exists - the first timestamp is the evidence. DeterminationRegistry reads isAnchored(sha256) to mark a verdict settlement-grade. What an anchor proves is that this hash was published by our key before any dispute existed; the Flare block timestamp now plays the role the XRPL ledger timestamp played in v2.
Before that, the same hash was written into a memo on a 1-drop XRPL payment between two accounts we control, and XrplAnchorVerifier proved it on Flare through an FDC XRPPayment attestation. Those 994 legacy anchors remain verifiable and the accounts stay published above; no new memo anchors are sent. The shape, for checking the old ones:
// what the XRP Ledger receives for one snapshot anchor
Payment
Destination <anchor account below>
Amount "1" // 1 drop of XRP - the memo is the point, not the value
DestinationTag 20260919 // the run's UTC date, YYYYMMDD
Memos[0].Memo
MemoType "wdm/index-anchor"
MemoData <snapshot SHA-256> // 32 bytes - fits one memo field exactly
// Why native XRP and not RLUSD, on an anchor that carries no value:
// Flare's FDC XRPPayment attestation covers native XRP only, and its response exposes
// firstMemoData and destinationTag. Keeping this shape means a Flare contract can later
// verify the same anchor trustlessly; an RLUSD anchor could not be attested at all.Payment is native XRP and is verified against the ledger: the amount actually delivered (in drops, not the amount sent) must cover the drops fixed in the quote, and a DestinationTag issued with the quote binds the payment to that order. The quote converts the USD price at the FTSOv2 XRP/USD rate on Flare when it is issued and is valid for ten minutes. XRPL has no smart contract to recompute the price, so that binding and the public ledger take the place of on-chain price enforcement - and because the payment is native XRP, the same FDC XRPPayment attestation that proves anchors can prove a payment to a Flare contract.
What is built: the consumer contract accepts a result only if the signature chain below recovers to the configured TEE address, and the enclave is a Go program whose build is byte-for-byte reproducible, so anyone can rebuild it and compare the code hash. What is not yet true: the enclave currently signs with a test key on the Coston2 testnet, not a production Confidential Space instance, so the chain proves the result came from whoever holds that key - not that it came from attested hardware. Treat this as a demonstrated mechanism, not an active guarantee:
// WeatherFccConsumer.sol - signature chain verified on every TEE result
resultHash = keccak256(abi.encodePacked(
keccak256(resultData), // hash of the raw data produced inside the enclave
actionId, // request identifier (issued by requestWeather)
keccak256(bytes(tag)), // action tag (e.g. "kweather-fetch")
status // execution status code
));
digest = keccak256(abi.encode("TEE_ACTION_RESULT", block.chainid, resultHash));
signer = ecrecover(EIP191(digest), v, r, s); // personal_sign prefix
require(signer == teeAddress); // accepted only if it recovers to the TEE keyThe full request → confidential fetch → signed relay loop passes end to end (fcc-extension/e2e.mjs), the Go enclave rebuilds to an identical hash from a cold cache and a different directory (fcc-extension/go/verify-reproducible.sh), and its output is pinned byte-identical to the reference implementation by a golden vector. Those parts are verifiable today. Production attestation waits on FCC reaching production on Flare - it is not available on mainnet yet, which is why this path stays on Coston2.
CONSENSUS proves how a number was derived and then publishes the number. A settlement contract wants the opposite: proof that the evaluation was correct, without the threshold it hangs on or the index at that hour being readable by every counterparty. BLIND_SETTLE seals the condition to the enclave key, evaluates inside the enclave, and signs only the outcome bit, a commitment to the condition, a commitment to the index, and a report sealed to the requester. What is transparent is the process - which code (reproducible hash), that this code produced it (TEE signature), what was evaluated against what (the two commitments). What is unseen is every number. The requester can open the commitments by revealing the salt; revealing is a choice, not the default.
// BlindSettlement.sol - what the chain receives for a blind settlement (uint32 cityId, uint64 evaluatedAt, bytes32 conditionCommitment, // keccak256(cityId, metric, op, thresholdE2, salt) uint8 outcome, // 0 not met · 1 met · 2 no verdict (< 3 sources) bool settleable, uint8 nSources, bytes32 indexCommitment, // keccak256(temp*100, humidity, wind*100, rain*100, indexSalt) bytes sealedReport) // wdm-seal-v1, opens only with the requester's key // no threshold · no index · no per-source reading - anywhere on chain
All verification is offline-capable: hash the downloaded bytes with any SHA-256 tool and compare with the on-chain values. Runnable references: app/scripts/agent-e2e.mjs (purchase), app/scripts/agent-percall-e2e.mjs (metering), contracts test suite (33 passing), fcc-extension/e2e.mjs (TEE loop).