QXMP Oracle Skill (RWA Proof-of-Reserve)
The QXMP Oracle is a custom oracle infrastructure (not Chainlink or RedStone) providing cryptographically verified real-world asset data on the QELT blockchain. It manages 13 tokenized mining projects worth $1.17 trillion USD in certified in-ground mining assets — all on-chain.
API Base URL: https://api.qxmp.ai/api/v1/rwa
Auth: None required — fully public API
CORS: Enabled — works from any browser
Update frequency: Oracle proofs nominally update ~once per 24 hours, but refreshes can lag — always verify latestProof.timestamp / isFresh
Safety
- Read-only API — no write operations available.
- Never fabricate asset valuations, proof timestamps, or freshness status.
- Always report
isFreshhonestly — a stale proof (isFresh: false) means data has not refreshed sincelatestProof.timestamp; useageHoursfor exact staleness (can be weeks). - Parse
valueUSDfields withparseFloat()— they are strings to preserve precision. - Respect rate limits: exponential backoff on
HTTP 429usingRetry-Afterheader. - Cache responses for 2–5 minutes; proofs are stable between daily updates.
- The
healthand/assets/{assetCode}endpoints may returnHTTP 504(gateway timeout, current as of 2026-08) — if so, use/assets(list) or/statsinstead. - Never guess asset codes: the format is not strict (e.g.
IRON-001has noQXMP:prefix); list assets via/assetsfirst.
Endpoints
Health Check
curl -fsSL "https://api.qxmp.ai/api/v1/rwa/health"
May intermittently return HTTP 504 — retry once, then fall back to /assets?page=1&limit=100 or /stats.
Get All Assets (primary endpoint)
curl -fsSL "https://api.qxmp.ai/api/v1/rwa/assets?page=1&limit=100"
Key fields per asset:
| Field | Type | Notes |
|-------|------|-------|
| assetCode | string | e.g. "QXMP:RHENO-JORC-ZA" |
| name | string | Human-readable project name |
| type | string | Gold, Diamond, Rare Earth Elements, etc. |
| jurisdiction | string | ZA, NA, MZ, LR, AU |
| reportingStandard | string | e.g. JORC 2012, NI 43-101, SAMREC Code |
| valueUSD | string | Parse with parseFloat() |
| latestProof.isFresh | boolean | true if proof < 24h old |
| latestProof.ageHours | string | Hours since last proof |
| latestProof.timestamp | string | ISO 8601 |
| latestProof.submitter | string | Signer address; may be empty "" |
Get Single Asset
curl -fsSL "https://api.qxmp.ai/api/v1/rwa/assets/QXMP:RHENO-JORC-ZA"
Returns full asset details including onChain data and proofHistory[].
Currently this endpoint is prone to HTTP 504 (as of 2026-08) — if it fails, fetch the full list and filter by assetCode instead:
curl -fsSL "https://api.qxmp.ai/api/v1/rwa/assets?page=1&limit=100" | jq '.data.assets[] | select(.assetCode == "QXMP:RHENO-JORC-ZA")'
Get Portfolio Statistics
curl -fsSL "https://api.qxmp.ai/api/v1/rwa/stats"
Returns totalAssets, totalValue, averageValue, currency, byType[], byJurisdiction[], timestamp.
Response Shape
{
"success": true,
"data": {
"assets": [
{
"assetCode": "QXMP:RHENO-JORC-ZA",
"assetCodeHash": "0x3b2b0ea0...",
"name": "Rhenosterspruit / Syferfontein Mining Project",
"type": "Rare Earth Elements",
"jurisdiction": "ZA",
"reportingStandard": "JORC 2012",
"valueUSD": "113989838841.85",
"status": "registered",
"latestProof": {
"valueUSD": "113989838841.85",
"timestamp": "2026-07-17T00:00:41.000Z",
"ageHours": "826.28",
"isFresh": false,
"submitter": ""
}
}
],
"summary": { "count": 13, "totalValue": "1166806475273.94", "currency": "USD" }
}
}
assetCodeHash and txHash are full 0x-prefixed hashes (truncated above for brevity). latestProof.submitter may be an empty string.
Procedure
Report Asset Portfolio
- Fetch:
GET /assets?page=1&limit=100 - Check
success: true - Parse each
valueUSDwithparseFloat() - Flag ✅ Fresh or ⚠️ Stale per
latestProof.isFresh - Report totals from
data.summary.totalValue
Verify a Specific Asset
- Fetch:
GET /assets/{assetCode}— if this returnsHTTP 504, fall back toGET /assets?page=1&limit=100and filter byassetCode - Report: name, type, jurisdiction, reporting standard, value, proof age, freshness
- If
isFresh: false, warn user the proof has not refreshed sincelatestProof.timestamp(useageHoursfor exact staleness)
Rate Limit Handling
# Check for 429 and respect Retry-After
response=$(curl -sI "https://api.qxmp.ai/api/v1/rwa/assets")
if echo "$response" | grep -q "HTTP/.*429"; then
retry=$(echo "$response" | grep -i "retry-after" | awk '{print $2}' | tr -d '\r')
echo "Rate limited. Waiting ${retry}s..."
sleep "$retry"
fi
Smart Contracts (On-Chain — Advanced)
For trustless verification without the REST API:
| Contract | Address | Role |
|----------|---------|------|
| OracleController | 0xB2a332dE80923134393306808Fc2CFF330de03bA | Signature verification |
| ProofOfReserveV3 | 0x6123287acBf0518E0bD7F79eAcAaFa953e10a768 | Proof storage + audit trail |
| DynamicRegistryV2 | 0xd00cD3a986746cf134756464Cb9Eaf024DF110fB | Asset metadata storage |
Asset codes: keccak256("QXMP:RHENO-JORC-ZA") — most follow QXMP:{PROJECT}-{STANDARD}-{COUNTRY} but exceptions exist (e.g. IRON-001); resolve codes via the REST API, never guess.
Values stored at 8 decimal precision: valueUSD * 10^8.
References
references/asset-types.md— asset types, jurisdictions, reporting standards, code format, and value precision.references/contracts.md— on-chain contracts, methods, and security model.
Asset types and jurisdictions are dynamic: always confirm against /stats (byType, byJurisdiction).
Common Errors
| Error | Cause | Fix |
|-------|-------|-----|
| success: false | API error | Check error field |
| HTTP 429 | Rate limited | Wait Retry-After seconds |
| Asset not found | Wrong code | List all via /assets first |
| isFresh: false | Proof not refreshed recently | Data valid; check ageHours — staleness can be weeks |
| HTTP 504 | Gateway timeout — /health and /assets/{assetCode} affected (2026-08) | Use /assets (list) or /stats; filter list by assetCode |
微信扫一扫