On-Chain-Preis-Oracle · Preis-Feeds für Real-World-Assets
Preis-Oracle für Smart Contracts: Devisen, Gold, Indizes und Aktien on-chain
Rufen Sie einen signierten Preisbericht von unserer API ab und übergeben Sie ihn an Ihren Vertrag. Unser Verifier-Vertrag prüft die Signatur on-chain, sodass Ihr Vertrag dem Kurs vertrauen kann, ohne dem Überbringer zu vertrauen.
So funktioniert es
- Abrufen eines signierten Berichts:
GET /oracle/reportmit Ihrem API-Schlüssel. - Übermitteln Sie ihn in Ihrer Transaktion: Unser Verifier-Vertrag prüft die Signatur mit
ecrecover. - Verwenden Sie den verifizierten Kurs; lehnen Sie ihn ab, wenn er für Ihren Anwendungsfall zu alt ist.
Berichte sind EIP-712-typisierte Daten PriceReport(bytes32 feedId,int256 price,uint64 timestamp,uint64 validUntil,uint8 marketStatus,uint32 spreadBps), an eine Chain und einen Verifier-Vertrag gebunden (keine Wiederverwendung anderswo) und nur bis validUntil akzeptiert, etwa eine Minute nach der Signatur (kein Horten günstiger Berichte). Kurse sind der Mittelwert aus Geld und Brief mit 8 Dezimalstellen; spreadBps ist die Geld-Brief-Spanne. Wenn Sie einen Bericht in Ihrer eigenen Transaktion übermitteln, zahlen Sie dieses Gas. Gefragte Feeds werden von unserem Relayer zudem von Zeit zu Zeit on-chain gespeichert (kostenlos lesbar), prüfen Sie aber immer das Alter eines gespeicherten Kurses.
Handelszeiten
Jeder Bericht nennt den Marktstatus: OPEN (ein Live-Kurs, höchstens 60 Sekunden alt), CLOSED (der offizielle letzte Kurs vor dem Schluss, für alle gleich, jederzeit signiert, solange der Markt geschlossen ist) oder HALTED (Handel ausgesetzt). getPriceNoOlderThan gibt nur OPEN-Kurse zurück, sodass ein Schlusskurs nie als Live-Kurs durchgehen kann. Vermögensgedeckte Token sollten Orders, die bei geschlossenem Markt erteilt wurden, zum nächsten OPEN-Kurs abrechnen (Forward Pricing, wie bei Fonds und ETFs).
Circuit Breaker
Jeder Feed kann einen maximal erlaubten Sprung haben. Eine größere Bewegung wird nicht gespeichert: Der Feed pausiert, bis wir ihn geprüft und wieder geöffnet haben, sodass ein falscher oder manipulierter Kurs nie Ihren Vertrag erreicht.
Feeds
| Symbol | feedId |
|---|---|
| AUDUSD | 0x5577fa17b1be8ae0f1517fe1864ea534d6992f3721000cdb6585b11e7046d5ec |
| EURGBP | 0xeaff3420d70d388655273db9b4f3000962445a6f0ea23ec1f04d843e4dbae4b0 |
| EURUSD | 0x0730076c3c0f5da594eb635c5d5a22116233bdb2a9c2977279cc348b8b8ce917 |
| GBPUSD | 0xd30842147b60fe333c2700bcae5eee6815b8529847955d19522858806bca8217 |
| IEF | 0x309dab183458dd939568dca0d68bea45d34aa25d31fa47fc5f12030e8f227f4e |
| OILCash# | 0xe21b90a237aa0663c02092eca221a0098c6c477054a61d05ecd3692f6631f6ff |
| SHY | 0x78f1083af8e72ddefc2e66fad95680c38a953b3136f413c61ab40f99b72991bc |
| SPY | 0xcea23e8f56b5ac447ac08d57e0808e35f468a65f29bb659b3d48934481e7c67a |
| TLT | 0x4abd434857e07567d49487ccf888348e55d5cfc15498c09a9dbcba2820e40ee4 |
| USDCAD | 0xa36f6cf3195abb4e93bf276660acee423f78878e6cfdbad0eab36e455afca97e |
| USDCHF | 0xd85af9ebd6fec6b317a7ac07f6d6455c4fc915cc8e1cfe19471faca002582907 |
| USDJPY | 0x3d6c40e9d821c10e442cb3fc6cb1c589ffd8b906e734a1ab3b3f7d213ac395d6 |
| USDSGD | 0x8a1375bd16e33aff9be7037f83e076defe9df6efea6d39a51d0b08f17ac9bc6d |
| XAGUSD | 0x67107df7f0e95594d9bf8ad8840bbb2ff95617123c227e10aab4d161dd6959b6 |
| XAUUSD | 0xe21c86d8b6a127bfef214d88fdb0c279e55d27dd8c443733e46c8d3de3c98cd6 |
Netzwerke
| Netzwerk | Chain-ID | Verifier-Vertrag |
|---|---|---|
| Optimism | 10 | 0xaeF7f701acFB42267015D3F593ce17CF536Afd6B |
| Optimism Sepolia Testnet | 11155420 | 0xBBf36E7Cd75494f28E02C5698EaD35fF4960a943 |
Signer-Adresse: 0x83fa2d8836525251FAd214A78A72038D0864f877. Maschinenlesbare Liste: /oracle/feeds.
Integrieren
1. Signierten Bericht abrufen
curl -H "Authorization: Bearer $API_KEY" \
"https://api.marketapi.app/v1/oracle/report?symbols=EURUSD&chain_id=10"
Gibt pro Symbol report (das ABI-codierte Tupel) und signature (65 Byte) zurück. Ihr Schlüssel braucht den Scope read:oracle.
2. In Ihrem Vertrag verifizieren
interface IMarketApiOracle {
struct PriceReport { bytes32 feedId; int256 price; uint64 timestamp; uint64 validUntil;
uint8 marketStatus; uint32 spreadBps; }
function submit(PriceReport calldata r, bytes calldata sig) external returns (bool); // verifies, stores if newer
function getPriceNoOlderThan(bytes32 feedId, uint256 maxAge)
external view returns (int256 price, uint64 timestamp); // OPEN and fresh only, else reverts
function getPrice(bytes32 feedId) external view
returns (int256 price, uint64 timestamp, uint8 marketStatus, uint32 spreadBps); // incl. CLOSED
}
contract MyVault {
IMarketApiOracle immutable oracle;
bytes32 constant EURUSD = keccak256("EURUSD");
constructor(IMarketApiOracle o) { oracle = o; }
function act(IMarketApiOracle.PriceReport calldata r, bytes calldata sig) external {
oracle.submit(r, sig); // reverts on a bad signature
(int256 price, ) = oracle.getPriceNoOlderThan(EURUSD, 60); // 8 decimals
// ... use price ...
}
}
Consumer im Chainlink-Stil können einen Feed über den MarketApiFeedAdapter lesen (latestRoundData(), AggregatorV3Interface).
Preise
5 Guthaben pro signiertem Bericht, bezahlt von Ihrem normalen API-Guthaben. Das Lesen bereits on-chain gespeicherter Kurse ist kostenlos.
Anwendungsfälle für unsere On-Chain-Preis-Feeds
- Tokenisierte Vermögenswerte und RWA: Bepreisen Sie tokenisierte Aktien, goldgedeckte Token und andere Real-World-Assets mit Kursdaten, die die Handelszeiten berücksichtigen.
- DeFi-Kredite und Sicherheiten: Bewerten Sie durch Devisen und Rohstoffe gedeckte Sicherheiten mit frischen, überprüfbaren Kursen und liquidationssicheren Aktualitätsprüfungen.
- Synthetische Vermögenswerte und On-Chain-FX: Rechnen Sie synthetische Devisen-, Index- und Rohstoffpositionen gegen signierte Referenzkurse ab.
- Stablecoins und Zahlungen: Rechnen Sie on-chain mit Live-Kursen für EUR/USD, GBP/USD und andere Devisen zwischen Währungen um.
Warum ein signiertes Pull-Oracle?
Push-Oracles aktualisieren nach Zeitplan, und jemand zahlt Gas für jedes Update. Mit einem Pull-Oracle ruft Ihr Vertrag genau dann einen frischen, kryptografisch signierten Kurs ab, wenn er ihn braucht: geringere Kosten, frischere Daten und dieselbe On-Chain-Verifizierung. Marktstatus, Geld-Brief-Spanne und Ablaufzeit sind Teil jedes signierten Berichts.
FAQ zum Preis-Oracle
Was ist ein Blockchain-Preis-Oracle?
Ein Preis-Oracle bringt Off-Chain-Marktpreise zu Smart Contracts. Unser Oracle signiert jeden Kurs mit einer EIP-712-Signatur; Ihr Vertrag verifiziert sie on-chain mit ecrecover, bevor er ihn verwendet, sodass der Kurs unterwegs nicht gefälscht werden kann.
Welche Vermögenswerte decken die Preis-Feeds ab?
Devisenpaare wie EUR/USD, Edelmetalle wie Gold (XAU/USD) und Silber, Aktienindizes und Einzelaktien, wie in der Feed-Liste auf dieser Seite veröffentlicht. Jeder Feed hat eine feste feedId (keccak256 des Symbols).
Eignet es sich für RWA und tokenisierte Vermögenswerte?
Ja. Berichte enthalten den Marktstatus (geöffnet, geschlossen, ausgesetzt), sodass tokenisierte Aktien, Rohstoffe und andere Real-World-Assets außerhalb der Handelszeiten Forward Pricing anwenden können, statt zu einem veralteten Kurs zu handeln.
Ist das Oracle Chainlink-kompatibel?
Jeder Feed kann über einen Adapter gelesen werden, der das Chainlink-AggregatorV3Interface (latestRoundData) implementiert, sodass bestehender DeFi-Code, der Preis-Feeds im Chainlink-Stil liest, mit minimalen Änderungen funktioniert.
Wie wird Manipulation verhindert?
Berichte laufen nach etwa einer Minute ab und müssen neuer sein als der gespeicherte Kurs, ein Circuit Breaker pro Feed pausiert einen Feed nach einem anomalen Sprung, und bei mehreren Brokern ist der Kurs der Median unabhängiger Quellen ohne Ausreißer.
Wer zahlt die Gasgebühren?
Es ist ein Pull-Oracle: Ihre Anwendung übermittelt den signierten Bericht in ihrer eigenen Transaktion und zahlt dieses Gas. Unser Relayer speichert gefragte Feeds außerdem von Zeit zu Zeit on-chain; das Lesen gespeicherter Kurse ist kostenlos, prüfen Sie aber vor der Verwendung ihr Alter.
Welche Blockchains werden unterstützt?
Jede EVM-Chain, auf der der Verifier-Vertrag bereitgestellt ist, zum Beispiel Ethereum, Base, Arbitrum, Optimism, BNB Smart Chain und Polygon sowie deren Testnets; die aktuelle Liste steht oben.
Empfohlen: das Pull-Muster (immer frische Kurse)
Verlassen Sie sich nicht auf den bereits on-chain gespeicherten Kurs. Rufen Sie einen frisch signierten Bericht ab und übermitteln Sie ihn in derselben Transaktion, die ihn verwendet: Ihr Vertrag sieht immer den aktuellen Kurs, und Sie zahlen nur für Ihre eigenen Updates.
// 1) off-chain: GET https://api.marketapi.app/v1/oracle/report?symbols=EURUSD&chain_id=CHAIN_ID (header: Authorization: Bearer KEY)
// 2) on-chain: verify, store and use the report atomically
interface IMarketApiOracle {
struct PriceReport { bytes32 feedId; int256 price; uint64 timestamp; uint64 validUntil; uint8 marketStatus; uint32 spreadBps; }
function submit(PriceReport calldata r, bytes calldata sig) external returns (bool);
function getPriceNoOlderThan(bytes32 feedId, uint256 maxAge) external view returns (int256 price, uint64 timestamp);
}
contract MyVault {
IMarketApiOracle immutable oracle;
bytes32 constant EURUSD = keccak256("EURUSD");
constructor(IMarketApiOracle o) { oracle = o; }
function settle(IMarketApiOracle.PriceReport calldata r, bytes calldata sig) external {
oracle.submit(r, sig); // ignored if an equal/newer price is stored
(int256 price, ) = oracle.getPriceNoOlderThan(EURUSD, 60); // reverts unless OPEN and fresh
// ... use price (8 decimals)
}
}
Die Felder report und signature des Berichts aus der API sind genau die beiden Argumente von submit. Berichte sind etwa eine Minute gültig, rufen Sie sie also direkt vor dem Senden der Transaktion ab.
Risikohinweis. Die Kurse sind indikative Marktdaten aus unserer Quelle, kein Handelsplatz. Smart Contracts, die auf Grundlage eines beliebigen Oracles Gelder bewegen, müssen die Aktualität prüfen, fehlende Updates behandeln und die Auswirkung eines falschen Kurses begrenzen. Lesen Sie die Bedingungen, bevor Sie sich in der Produktion auf das Oracle verlassen.