مستندات اوراکل
قیمتهای امضاشده فارکس و فلزات گرانبها که قراردادهای هوشمند شما روی زنجیره تأییدشان میکنند. نمای کلی: صفحه اوراکل · ماشینخوان: /v1/oracle/feeds، /v1/oracle/catalog.
1. چگونه کار میکند
- بکاند شما یک گزارش امضاشده درخواست میکند:
GET https://api.marketapi.app/v1/oracle/report?symbols=XAUUSD&chain_id=10(کلید API با دامنهread:oracle؛ هزینه برای هر گزارش امضاشده). - تراکنش شما گزارش و امضا را به قرارداد تأییدکننده میدهد که امضای EIP-712، انقضا، زنجیره و مدارشکن خود را بررسی میکند و سپس قیمت را ذخیره میکند.
- در همان تراکنش، قرارداد شما قیمت را با شرط تازگی میخواند. این الگوی کششی همیشه از قیمت فعلی استفاده میکند.
قیمتهایی که از طریق API درخواست میشوند گاهبهگاه بهطور خودکار روی زنجیره هم ارسال میشوند، اما هرگز بدون بررسی تازگی به قیمت ذخیرهشده تکیه نکنید.
2. شبکهها و قراردادها
| شبکه | شناسه زنجیره | قرارداد تأییدکننده |
|---|---|---|
| Optimism | 10 | 0xaeF7f701acFB42267015D3F593ce17CF536Afd6B · کاوشگر |
| Optimism Sepolia تستنت | 11155420 | 0xBBf36E7Cd75494f28E02C5698EaD35fF4960a943 · کاوشگر |
نشانی امضاکننده: 0x83fa2d8836525251FAd214A78A72038D0864f877. تستنتها برای آزمایش رایگان و بدون تضمین سرویس هستند.
3. فیدها
هر فید یک شناسه دائمی دارد: feedId = keccak256(symbol). قیمتها 8 رقم اعشار دارند.
| نماد | 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 |
4. گزارش امضاشده
دامنه EIP-712: نام MarketAPI Oracle، نسخه 2، شناسه زنجیره و نشانی تأییدکننده. نوع:
PriceReport(bytes32 feedId,int256 price,uint64 timestamp,uint64 validUntil,uint8 marketStatus,uint32 spreadBps)
- price: قیمت میانه با 8 رقم اعشار.
- timestamp: زمان قیمت (ثانیه UTC)؛ validUntil: گزارش پس از حدود یک دقیقه منقضی میشود.
- marketStatus: ۱ OPEN، ۲ CLOSED (آخرین قیمت رسمی، مثلاً در آخر هفته)، ۳ HALTED.
- spreadBps: اسپرد خرید و فروش بر حسب واحد پایه؛ با چند کارگزار، فاصله آنها از هم را هم نشان میدهد.
پاسخ API شامل report (کدگذاریشده ABI) و signature (۶۵ بایت) است: دقیقاً دو آرگومان submit.
5. توابع قرارداد
submit(PriceReport r, bytes sig) returns (bool): تأیید و ذخیره؛ اگر قیمتی برابر یا جدیدتر ذخیره شده باشد نادیده گرفته میشود.submitBatch(PriceReport[] rs, bytes[] sigs): چند فید در یک تراکنش؛ ورودیهای نامعتبر رد میشوند.getPrice(bytes32 feedId): آخرین قیمت ذخیرهشده و زمان آن؛ تا وقتی فید هنوز قیمتی ندارد revert میکند.getPriceNoOlderThan(bytes32 feedId, uint256 maxAge): revert میکند مگر بازار OPEN باشد و قیمت بهاندازه کافی تازه. برای اقدامات معاملاتی از این استفاده کنید.
هر فید یک مدارشکن دارد: جهشی بزرگتر از حد آن، فید را تا بازبینی متوقف میکند.
6. مثال Solidity (الگوی کششی)
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 GoldVault {
IMarketApiOracle immutable oracle;
bytes32 constant XAUUSD = keccak256("XAUUSD");
constructor(IMarketApiOracle o) { oracle = o; }
function settle(IMarketApiOracle.PriceReport calldata r, bytes calldata sig) external {
oracle.submit(r, sig);
(int256 price, ) = oracle.getPriceNoOlderThan(XAUUSD, 60); // reverts unless OPEN and at most 60 s old
// ... use price (8 decimals)
}
}7. مثال JavaScript (ethers v6)
const res = await fetch("https://api.marketapi.app/v1/oracle/report?symbols=XAUUSD&chain_id=10",
{ headers: { Authorization: `Bearer ${process.env.API_KEY}` } });
const { data, refused } = await res.json();
if (!data.length) throw new Error(refused[0]?.reason); // e.g. market closed or stale
const r = data[0];
const report = ethers.AbiCoder.defaultAbiCoder().decode(
["tuple(bytes32,int256,uint64,uint64,uint8,uint32)"], r.report)[0];
await vault.settle(report, r.signature); // your contract calls oracle.submit(...)8. ردها و خطاها
- ورودیهای
refusedنمادهایی را که امضا نشدهاند با دلیل فهرست میکنند، مثلاً اکنون قیمت قابل اعتمادی نیست (STALE) یا بازار بسته. هزینهای برایشان محاسبه نمیشود. oracle_unavailable(503): سرویس امضا کوتاهمدت در دسترس نیست؛ با تأخیر فزاینده دوباره تلاش کنید.- revertهای روی زنجیره:
InvalidSignature(امضاکننده، زنجیره یا قرارداد اشتباه)،ReportExpired،FutureTimestamp،InvalidPrice،InvalidStatus،NoPrice(فید هنوز قیمتی ندارد)،FeedTripped(مدارشکن)،MarketNotOpenوPriceTooOld(ازgetPriceNoOlderThan)،IsPaused.
9. بهترین شیوهها
- درست پیش از ارسال تراکنش گزارش را بگیرید؛ گزارشها پس از حدود یک دقیقه منقضی میشوند.
- همیشه با
getPriceNoOlderThanو حداکثر عمری متناسب با محصولتان بخوانید. - بازارهای CLOSED (آخر هفتهها، تعطیلات) را صریحاً مدیریت کنید، مثلاً تسویه در باز شدن بعدی.
- ابتدا روی تستنت آزمایش کنید، سپس فقط نشانی قرارداد و شناسه زنجیره را تغییر دهید.
- کلیدهای API را روی سرور خودتان نگه دارید، هرگز در صفحه وب.