` containers of 1 CPU / 1.5 GiB (one per consumer, as
+ consumers run), not one 1 CPU / 1 GiB container; capture and loader ran as
+ `--rm` containers of the same image (`--network none` for capture). (2) The
+ host stop condition was measured, not automated: host idle 20-47 %
+ (`vmstat 5`) during the 3,000/s run, no production container started or
+ restarted today (`docker inspect` StartedAt/RestartCount), every kn2 run
+ <= 6 min. (3) One final-run attempt failed at setup (run dir not writable
+ by uid 10001) and spliced an error string into `docker run`, which asked
+ the registry for a non-existent image `while` (pull denied, nothing
+ pulled); the cycle now refuses to start gateways without a capture and a
+ valid topic id. Production blast radius unchanged: isolated network only.
+- 2026-09-24: **KN-2 slice 2 - K2.3 coordinator, K2.5 matrix/failover/capacity,
+ bounded memory: implemented, tested locally, isolated shadow evidence (not
+ live, not production).** Rows per guide 18.7:
+
+ | Work item | SHA | Command / cases / counts | Evidence | Failure -> root cause -> fix | Runtime mutations | Cleanup | Next |
+ |---|---|---|---|---|---|---|---|
+ | K2.3 D4 amendment: coalesced replay | slice-2 commit | `native_stream` t02 storm (1 reader, 3 ms/record) + committed_reads pooled reuse | gateway `replay_*` metrics in final runs | per-stream readers under a cold storm: 266 `RATE_LIMITED`, 1.09M records scanned for 5,946 replayed, RSS 268 MB -> one pass per partition serves every pending request (joiners fit while position <= after+1), a request that cannot keep up detaches after 200 ms and requeues with its own cursor, pooled range consumers, librdkafka prefetch 16 MiB live / 4 MiB replay | none | - | - |
+ | Shutdown + per-subscription report | slice-2 commit | t04 stopping replica | `evidence/stop/gateway-{a,b}.log` | client 10,452 vs gateway ~4.9k: gateway was PID 1 without a SIGTERM handler (`docker stop` waited 10 s, logs cut) -> SIGTERM/SIGINT end every stream `UNAVAILABLE GATEWAY_SHUTTING_DOWN` (2 s grace), `qdl_kn_subscription_closed` per stream | none | - | - |
+ | Send-path attribution | slice-2 commit | hub lag unit test; capacity reruns | `evidence/summary.json` `diagnostic` | "3.8 s p50 commit->client": (a) harness paired the k-th delivery of an event id with its k-th commit, wrong once a copy is rightly skipped -> pair by Kafka coordinate from delivery reports; (b) records queued during a cold replay were counted as live -> split `catchup` from the live path; (c) one Python process for 292 streams and one TLS connection per stream (client CPU cap, RSA-2048 handshake per stream) -> one client process and one transport per consumer, as consumers run; (d) warm-range records counted as dispatch lag -> only records produced after start. Gateway now reports `queue_wait_ms` / `handoff_wait_ms` | none | - | - |
+ | Memory bound (K2-T05/T08) | slice-2 commit | `memory.rs` 3 unit tests; binary in a 128 MiB container refuses start, 256 MiB passes | final runs `memory` in start line | ring 32 MiB x 6 partitions + 256 MiB queues + librdkafka exceeded the 256 MiB replica (OOM instead of typed backpressure) -> `QDL_KN_RING_BYTES_TOTAL` 64 MiB split per partition, `QDL_KN_QUEUE_BYTES_TOTAL` 64 MiB, kafka 32 MiB, reserve 64 MiB (measured ~60 MiB beyond the ring) = 224 MiB; start fails closed when bounds exceed cgroup `memory.max` | none | - | - |
+ | K2.5 matrix + K2-T04/T07 | slice-2 commit | `kn2_matrix_cycle.sh CLIENTS=split KILL=1 KILLMODE=stop|kill` | `evidence/stop`, `evidence/hardkill`, summary `5e87acb0...` (SHA256SUMS) | SDK `StreamEvent` requires logical offset > 0 but Kafka offset 0 is valid -> KN-4 SDK item; loader writes an offset-0 filler per partition | isolated only | removed | Astra |
+ | K2-T08 capacity | slice-2 commit | `CLIENTS=split KILL=0 RATE=3000 REPEAT=8` | `evidence/capacity` | - | isolated only | removed | Astra |
+
+ - Tests: Rust workspace fmt + clippy `-D warnings` clean, 246 passed /
+ 0 failed / 3 ignored; the ignored real-Kafka `committed_reads` 2/2 on a
+ disposable broker (`qdl_v2_kn2_it`, removed); `native_stream` 19 (five
+ consecutive runs stable), gateway unit 19; Python
+ `test_kn_native_slice_probe` + `test_kn_resource_sizing` +
+ `test_kn_v220_contracts` 57 OK. No shared Python module changed, so the
+ full Python suite was not rerun.
+ - Final isolated evidence, binary `63a56243...`, bundle `b4b34222...`
+ (`/home/bobby/.local/state/qdl-v2/kn2-20260924/evidence`, SHA256SUMS `1a4bbfbc...`; the harness
+ orchestration is kept under `evidence/orchestration` for focused reruns):
+ - Matrix, graceful stop of A at 45 s: 292/292 demanded (consumer, stream)
+ pairs over 190 physical keys and 6 consumers LIVE, 6/6 client verdicts
+ PASS; missing lossless / unsuperseded drops / duplicates / out of order /
+ unexpected / filtered delivered / token errors / cross-mix all 0;
+ failover 185/185 resumed, RTO p50 457 ms, max 559 ms; negatives 24/24;
+ Replay exact on 5 consumers, GetSnapshot/GetFeedStatus typed
+ `DATA_NOT_READY` on 6 (17/17); reconciliation client = gateway close
+ reports per replica: A 2,712 = 2,712, B 8,035 = 8,035.
+ - Matrix, SIGKILL of A: same exactness, failover 185/185, RTO p50 402 ms,
+ max 543 ms; B 8,018 = 8,018 (A has no reports after SIGKILL).
+ - Capacity (K2-T08), challenge 3,000 canonical events/s from real capture
+ for 59 s (175,840 committed + 35,137 aborted), 292 streams, warm ring
+ (production default): 6/6 PASS, 65,369 delivered = A's reports; live
+ path commit->client per client p50 7.5-10.5 ms, p95 20.5-30.7 ms, p99
+ 33.9-48.7 ms, max 82.9 ms (n 47,923); catch-up 10 records <= 246 ms.
+ Serving replica A: dispatch lag p50 <= 10, p95 <= 50, p99 <= 100 ms;
+ queue wait p99 <= 50 ms; handoff p99 <= 10 ms; CPU 0.13 core mean in
+ load windows, 0.28 core max 5-s window, 10.7 s total; RSS max 176 MiB
+ (limit 256), ring max 63 MiB (bound 64), overflow 0; replay: 185 ring
+ hits, then 12 coordinated reader passes (343,775 scanned) after the ring
+ aged out. Reader-only replica B: 0.034 core, RSS 103 MiB. A's 0.5 CPU cap
+ throttled 52 of 2,053 periods, all in stream-open/replay bursts; the
+ isolated broker (1 CPU) was the saturated component (352 of 2,420).
+ - Resources vs budget: stream gateway measured ~0.16 core for both
+ replicas at the 3,000/s challenge against the unverified 0.4 vCPU
+ allocation; memory bounded at 224 MiB of 256 MiB. **No extra RAM/CPU is
+ requested.** Not measured: live freshness (capture replay), the four
+ owner quantities end to end (needs live), the target client profile
+ through a real alpha, long soak.
+ - Superseded and reclaimed: the KN-2 slice-1 binaries (6a68c39b, 4cb57a9b,
+ b13d97ad) were replaced in place by `63a56243`; no kn2 container, network
+ or volume remains; no image was built.
+ - Cleanup: shadow cursor key, JWT config, test keys and profile deleted;
+ capture, commit logs and raw run dirs deleted (1,305 MiB scratch freed);
+ evidence 1.7 MiB kept. Kept to KN-2 Astra PASS / KN-5: binary and bundle.
+ `target/` 6.8 GB (to KN-5). Four anonymous dangling volumes from
+ 2026-09-21/23 predate KN-2 and are not ours to remove without an owner.
+
+
+**KN-2 receipt for Astra (guide 18.14), 2026-09-24.**
+
+```text
+Phase / status / source SHA / affected files and line counts:
+ KN-2 / IMPLEMENTED_PENDING_ASTRA_REVIEW / feat/consumer-endpoint-benchmark,
+ slice 1 997907c + slice 2 (this commit). rust/qdl-stream-gateway src:
+ service 1064, replay 522, reader 472, main 430, subscription 420, hub 418,
+ auth 799, requirement 304, bundle 287, tls 133, memory 123, authority 102,
+ readview 68; tests native_stream 1806, committed_reads 282;
+ qdl-contracts delivery.rs + cursor_v3 verify_scope; scripts/
+ kn_native_slice_probe.py 1298 (matrix mode) + tests 348.
+Approved scope and actual work items completed:
+ K2.1-K2.5 per guide 18.9 and decisions D1-D8, with the D4 amendment
+ (coalesced replay passes instead of one reader per request).
+Domain invariants and behavior changed/preserved:
+ Public RPC shape, statuses and control frames of the Python service kept;
+ delivery policy = domain policy + invariant 27 (BOOK never coalesced, BAR
+ in-progress only with the same open time and signature); no Kafka commit
+ by a gateway reader; cursor v3 unchanged (Replay uses verify_scope).
+Tests: command, cases, pass/fail/skip, isolated/real-provider, evidence hash/path:
+ Rust workspace 246/0/3 + committed_reads 2/2 on an isolated broker;
+ native_stream 19, gateway unit 19; Python KN 57 OK. Isolated shadow on
+ real canonical capture (not live): matrix stop / SIGKILL / 3,000/s
+ capacity, 6/6 PASS each, exact oracle, 0 defects, failover 185/185.
+ /home/bobby/.local/state/qdl-v2/kn2-20260924/evidence, SHA256SUMS 1a4bbfbc...,
+ summary.json 5e87acb0...
+New failures -> root cause -> fix -> regression evidence:
+ Journal slice 2 rows: storm refusals -> coordinator; missing SIGTERM ->
+ graceful shutdown + close reports; harness latency pairing, catch-up
+ mixing and per-stream transports -> coordinate pairing, split, shared
+ transport; memory bounds over the container -> total bounds + fail-closed
+ check (128 MiB refuses, 256 MiB starts).
+Runtime: exact mutations or NONE; active/config/rollback map:
+ Production NONE. Isolated qdl_v2_kn2_shadow / qdl_v2_kn2_it only, removed.
+ Running Stream, its groups, producers, topics, Redis and ACLs untouched.
+Resources: latency/capacity/memory/disk measured vs budget; untested limits:
+ 3,000/s challenge: live path p99 <= 49 ms per client; gateway ~0.16 core
+ for two replicas vs 0.4 allocation; memory bounded 224/256 MiB, RSS max
+ 176 MiB. Untested: live freshness and the four owner quantities end to end,
+ the target client profile via real alpha, soak, production broker.
+Cleanup: removed/retained artifacts, reason/expiry, disk/restart evidence:
+ Shadow keys/config/profile, capture and commit logs deleted; binary 63a56243
+ and bundle kept to KN-2 PASS / KN-5; evidence 1.7 MiB; no production restart.
+Remaining decision gates, not relabelled implementation gaps:
+ Owner: kn- DESCRIBE ACL for a live shadow on the production broker.
+ KN-4: market cache behind ReadView (snapshot/status), SDK logical offset 0.
+Astra requested review points and next allowed step:
+ hub register/dispatch barrier under the partition lock; coordinator
+ joiner/detach correctness; latest-state coalescing vs lossless; revocation
+ mid-stream; shutdown; memory plan; harness judge and oracle. Next: KN-3
+ after ASTRA_REVIEW_PASS or explicit owner sequencing.
+```
+
+
+#### KN-2 Astra Review R1 - Correctness Before Capacity Certification
+
+- 2026-09-24: **REVIEW_CHANGES_REQUIRED**, source `d8929d1` (slice 1
+ `997907c`, slice 2 `d8929d1`; base `6802b33`). Reviewed guide 18.3-18.9,
+ contracts, native service/hub/replay/subscription/authority/reader/memory,
+ tests and retained K2.5 evidence. Scope is review and plan journal only:
+ no product code patch, production ACL, rollout, resource-cap change or C2.
+ Source implementation delta: 25 files, +6,606/-367 including plan.
+- **Direction accepted:** shared committed reader per replica, indexed
+ fan-out, separate/coalesced range readers, immutable shared records,
+ typed read-view dependency, two-replica SDK transport proof and explicit
+ capture-vs-live attribution. No need to re-architect these components.
+ The five failures below are reproducible implementation gaps, not RAM
+ approval gates and not grounds to throw away valid earlier evidence.
+
+**Blocking findings and required focused tests**
+
+1. **F1 / P1 - Revocation during REPLAYING can be permanently missed.**
+ `rust/qdl-stream-gateway/src/service.rs:982` creates the authority watcher
+ only after replay and the LIVE control. A key removed while a slow replay
+ is running therefore becomes the watcher's already-seen generation; the
+ subscription continues delivering LIVE data for the revoked identity.
+ Reproduced with 30 replay records at 20 ms/record: revoke after REPLAYING;
+ the service still emits LIVE event offset 32. Replay RPC also has no
+ ongoing reauthorization (`service.rs:504`). Fix: bind authority generation
+ at admission, watch/recheck throughout ring replay, reader replay,
+ catch-up and handoff; close typed on revoked key/manifest/entitlement.
+ Test revocation before first record, mid-replay, before LIVE, during a
+ blocked send, and on Replay; additive rotation must keep authorized
+ readers alive. Do not rely on a later second reload to notice the first.
+2. **F2 / P1 - Corrupt matched replay records are silently skipped.**
+ `rust/qdl-stream-gateway/src/replay.rs:444` continues after protobuf
+ decode failure, unlike ring/live paths. The scan then completes and
+ `service.rs:945` advances the resume boundary beyond the missing fact.
+ Reproduced with one malformed committed TRADE between two valid facts:
+ only the later fact is emitted and the stream declares LIVE. Fix: fail
+ the affected requested product with a typed data-integrity error; never
+ silently acknowledge past it. Test corrupted first/middle/last records,
+ ring vs range parity, shared-pass isolation and replay retry. Preserve
+ unrelated products' valid progress without certifying the corrupt one.
+3. **F3 / P1 - Joiners can remain stranded after a reader-open failure.**
+ `replay.rs:295,317,359`: requests joining an active pass enter `joiners`;
+ if `source.open()` fails, the error path drains the current batch only.
+ The next `take_batch` sees empty `pending`, marks scanning false and
+ leaves the joiner with no worker/deadline processing. Reproduced with a
+ blocked open, a second request, then an injected open error: first request
+ fails typed; second remains pending after its 200 ms deadline and a 1 s
+ wait, `in_flight=1`. Fix: own/drain or requeue every request on every
+ exit, including retention/dependency/decode failure and cancellation.
+ Test a joiner at source-open, last-record and empty-pass boundaries;
+ all futures, permits, queues and subscription slots must return to baseline.
+4. **F4 / P1 - New replay coordinator bypasses the declared byte bound.**
+ `max_scanned_bytes` is enforced by the old `scan_range` at `replay.rs:141`,
+ but not by the active `ReplayCoordinator::pass` at line 359. Setting the
+ byte limit to 1 still delivers a larger record and completes replay.
+ Source inspection also finds pending/joiner admission and the per-request
+ 256-record channel outside the shared byte accounting; Replay RPC's
+ 32-record handoff and open requests have no explicit concurrent-request
+ admission matching Subscribe. The 224/256 MiB startup arithmetic is not
+ a proof of a bound for these paths. Fix the active coordinator's record/
+ byte/time accounting and bounded/fair request admission, include retained
+ decoded/channel/ring-reference memory, and ensure slow/cancelled Replay
+ clients release resources. Test large BOOK payloads, sparse keys, cold
+ reconnect storms, several consumers, deadline and slow-reader pressure;
+ measured higher caps are allowed, missing bounds are not. No production
+ OOM or successful memory-exhaustion attack was run or claimed here.
+5. **F5 / P1 - Coalescing across a returning state loses transitions.**
+ `subscription.rs:185-190` permits any later matching signature to replace
+ an older one, even across an intervening different state. With queue
+ depth 2 and QUOTE states `A1 -> B2 -> A3 -> B4`, it drops the first two
+ and returns offset 3, instead of preserving the transitions or emitting
+ typed backpressure. `scripts/kn_native_slice_probe.py:807` repeats the
+ same rule: judging only deliveries `[3,4]` returns zero defects. Fix both
+ implementation and independent oracle: coalesce only inside a contiguous
+ equivalent lifecycle segment, never across a quality/authority/session
+ boundary. Test `A-B-A`, `A-B-A-B`, repeated same-state bursts, BAR
+ in-progress/final/revised boundaries, BOOK/reset and negative cross-scope
+ cases. Do not make an oracle that merely copies the reducer's mistake.
+
+**Evidence limits to close or explicitly narrow, not new production incidents**
+
+- **SDK offset-zero compatibility:** `qdl_sdk/models.py:882` rejects
+ `logical_offset=0`, while `service.rs:620` exposes the Kafka offset directly.
+ The loader deliberately inserts a filler at offset zero
+ (`kn_native_slice_probe.py:592`) and the receipt assigns the SDK fix to
+ KN-4. Independent constructor probe confirms the rejection. Existing
+ nonzero-offset evidence remains valid; filler is not an offset-zero test.
+ Resolve and test initial snapshot boundary/resume/Replay semantics with
+ the real SDK before claiming full native public compatibility; do not
+ silently shift signed Kafka coordinates. This is distinct from KN-4's
+ explicitly permitted real-market-cache ReadView dependency.
+- **LIVE is not per-product event-delivery coverage:** hashes of all 88
+ retained evidence files match `SHA256SUMS` (`1a4bbfbc...ed72f`). Each final
+ run has 292 subscription rows, but zero-event rows are 51 (stop), 55
+ (hardkill), 41 (capacity). The intersection is 41 subscriptions with zero
+ events in all three runs: 14 BOOK_SNAPSHOT, 15 MARK_INDEX_PRICE, 6 TRADE,
+ 4 BOOK_DELTA, 2 BAR. Some are legitimately age-filtered or quiet, not
+ unexplained loss; do not falsify timestamps or weaken policy to fill them.
+ Report admitted/LIVE, event-positive, expected-filtered and no-sample
+ denominators separately. Close missing transport coverage with suitable
+ authentic capture and explicit snapshot/reset+delta cases; classify
+ undeployed/out-of-scope routes honestly. A capture with no expected events
+ proves idle admission, not positive delivery for that binding.
+
+**Independent verification and retained evidence**
+
+- Review artifacts outside Git:
+ `/home/bobby/.local/state/qdl-v2/kn2-astra-review-20260924/`.
+ `probes.rs` SHA `51b1e5aa...a0072d7`; `native_stream_review.rs` is a
+ mechanical copy of the existing fixture plus one include, mounted over
+ the test file only inside the disposable builder. No canonical Rust or
+ Python source was edited. Synthetic records exist only in the in-process
+ test log, never in a real broker.
+- Commands: `cargo test --offline --locked -p qdl-stream-gateway --test
+ native_stream -- --test-threads=2` with the overlay: original 19 PASS,
+ five new expected-safety assertions FAIL (five reproduced defects), zero
+ ignored. Final repeat took 3.87 s; `native-review.log` SHA
+ `e3b6598a...ef4beb0`. Restored the canonical test overlay and ran
+ `cargo test --offline --locked -p qdl-stream-gateway --lib --test
+ native_stream -- --test-threads=2`: 38 PASS, zero fail/ignored.
+- Python `python -B -m unittest -v tests.test_kn_native_slice_probe
+ tests.test_kn_resource_sizing tests.test_kn_v220_contracts`: 57 PASS,
+ zero fail/skip, 0.768 s (`python-review.log`, SHA `3737eb14...e34553`).
+ Independent oracle probe on the dropped `A1,B2` reports zero defects,
+ confirming the correlated-oracle gap. SDK offset-zero probe raises the
+ documented ValueError. Two initial builder launches failed before tests
+ due to mounting a registry volume as Cargo home; corrected by mounting
+ `qdl-cargo-home` at `/usr/local/cargo/registry`, offline; no install/pull.
+- Reused, not rerun: Opus's isolated Kafka/mTLS matrix, stop/SIGKILL failover
+ and 3,000 canonical events/s capture challenge. The reported 185/185
+ failovers and per-client commit-to-client p99 33.884-48.710 ms in the
+ capacity run match retained summaries. Serving RSS peak 184,799,232 bytes
+ (~176.2 MiB); this measures that workload, not a bound for untested slow
+ replay paths. These are replay-capture numbers, not live provider latency,
+ full consumer-call-to-usable latency or certification of 50 alpha clients.
+
+**Owner resources, next steps and cleanup**
+
+- Bobby reaffirmed: optimize first; if measured KN-2/KN-3 demand still needs
+ RAM/CPU, additional bounded resources are permitted. Do not turn the old
+ cap or KN-1's 71.8 MB modeled Redis margin into a fixed blocker. Record
+ actual hot/replay load, peak RSS/allocator/buffer cost, smallest cap delta,
+ rollback and old/new overlap; reclaim superseded services after accepted
+ cutover. More RAM cannot repair F1-F5 or substitute for byte accounting.
+- Opus's isolated run used more client CPU/RAM than the initial packet and
+ manually observed its stop condition; that deviation is already recorded
+ above and is not erased. Future runs record their actual bounded packet
+ first and automate the abort condition when practical. No retroactive
+ production authority or ACL approval is inferred.
+- **Next:** fix F1-F5 together inside KN-2, reuse these counterexamples as
+ durable regressions; resolve/declare the SDK and delivery evidence limits.
+ Run fast affected tests first, then only affected isolated SDK/replay/
+ failover/load cases with corrected oracle. No new phase, architecture,
+ blanket C2 rerun or production rollout. Astra re-reviews the narrow diff
+ before KN-3 entry; no ASTRA_REVIEW_PASS is issued in this receipt.
+- Canonical `/home/bobby/data_layer`, branch `feat/consumer-endpoint-benchmark`;
+ no new worktree. Review clients/builders used existing images, network
+ disabled, read-only source, bounded tmpfs and existing target cache. All
+ `kn2-astra-*` containers auto-removed (inventory zero); no image built,
+ production restart or broad prune. Small review sources/logs retained for
+ Opus reproduction; existing named builder/cache retained for KN-2 fixes,
+ not a new archive. No disk-reclamation claim. Production Query remains
+ `83fa1bc` / `sha256:dd065fdf...f693951`, Stream `ae2d62a` /
+ `sha256:37d7f518...b181f9`; all four healthy, restart 0, OOM false.
+ Runtime configuration, published release and rollback set unchanged.
+ Two unrelated pre-existing plan hunks preserved outside this commit.
+ No push, merge, release, TS/alpha/order action or production data mutation.
+
+
+- 2026-09-24: **KN-2 R1 fix - isolated rerun packet (recorded before the
+ runs).** Scope: only the evidence Astra R1 marks affected (replay, failover,
+ load, delivery coverage). Blast radius: isolated shadow; the running
+ Stream/Query, groups, producers, topics, Redis and ACLs untouched.
+ - Candidate: gateway binary built from the R1 fix source (sha256
+ `4f5bf1b0...`, replaces `63a56243...` in place), same runtime image
+ `qdl-v2-rust:2.0.26-62241bc`, same network/aliases/groups/identities as
+ the K2.5 packet above.
+ - Production reads, read-only: (1) capture = the newest contiguous window
+ per demanded physical key by primary key, extended until every demanded
+ product of the key has 20 records, capped at 4,000 rows per key; (2) a
+ near-live tail for 60 s: one indexed range query per 250 ms on the stable
+ spool (`committed_at_ns > ?`, `EXPLAIN QUERY PLAN` = index
+ `idx_qdl_spool_events_retention`; 1,088 rows / 2 s read in 4 ms),
+ republished into the isolated broker with authentic bytes and times.
+ - Runs, each <= 8 min: (a) matrix, graceful stop of A at 45 s, tail load;
+ (b) matrix, SIGKILL of A, capture load; (c) capacity 3,000 events/s,
+ `REPEAT=8`, one client process per consumer, no kill.
+ - Resources: gateways 2 x 0.5 CPU / 256 MiB; broker 1 CPU / 1 GiB; six
+ clients 1 CPU / 1.5 GiB (as run in K2.5); loader 1 CPU / 1 GiB; quota Redis
+ 0.1 CPU / 64 MiB.
+ - Stop conditions, now automated: host idle < 5 % for 60 s tears the run
+ down (`/proc/stat`, 5 s samples, recorded); every run ends with a
+ production restart check (StartedAt after run start = fail).
+ - Recorded incident (this session, before this packet): a read-only
+ diagnostic `count(*)` on the production spool filtered on the
+ unindexed `accepted_at_ns` scanned the table for 128 s. Production
+ stayed healthy (stable roles up, restart 0, checked after). From here
+ on, spool reads use the query plans above only.
+ - Superseded and reclaimed: binary `63a56243` (replaced); no container,
+ network or volume from earlier runs exists. Cleanup: as the K2.5 packet;
+ keep bounded results and hashes only.
+ - Amendment before the second pass of runs (same scope, stop conditions
+ and resources): the first pass on `4f5bf1b0` found that replay prefetch
+ charged to the shared live budget overflowed live lossless queues in the
+ opening storm (details in the R1 fix entry below); candidate replaced in
+ place by `50c18092...` (separate live/replay budgets); the three runs are
+ repeated on it; the first pass is kept as diagnostic evidence only.
+
+
+- 2026-09-24: **KN-2 R1 fixes F1-F5 - implemented, tested locally, isolated
+ shadow evidence (not live, not production).** Source on
+ `feat/consumer-endpoint-benchmark` after `e3b8325` (this commit). Rows per
+ guide 18.7:
+
+ | Work item | Fix (source) | Regression (counterexample kept) | Mutation check | Evidence |
+ |---|---|---|---|---|
+ | F1 revocation | `authority.rs`: generation stored with the authority, `snapshot()` read together; `service.rs` `Authorized`: bound at admission, checked before every send, raced against every wait (reader replay, catch-up, blocked handoff, LIVE); Replay RPC too (feed-scope entitlement) | `f1_*` x4: before the first record, during ring and reader replay (Astra probe), blocked send (<= 2 handed-off records then UNAUTHENTICATED), Replay page; additive rotation mid-replay keeps the stream exact | watcher-after-admission mutant: 3 of 4 fail | tests |
+ | F2 corruption | `replay.rs`: an undecodable record of a requested key ends every request whose range holds it `ReplayEnd::Corrupt` -> `DATA_LOSS DATA_INTEGRITY::`; ring and live paths same prefix | `f2_*` x2: first/middle/last on the reader path, ring parity, retry fails again, other key in the same pass exact | skip-mutant: 2 of 2 fail | tests |
+ | F3 stranded joiners | `take_batch` takes pending **and** joiners; one pass per reader permit (driver loop, permit returned each pass); pass admits joiners only for `max_duration`; `ReplayRequest` answers on drop | `f3_*` x2: open failure with a joiner (Astra probe), joiner at the last records, markers-only range; permits/requests/bytes back to baseline | joiner-drop mutant: 1 of 2 fail | tests |
+ | F4 bounds | per-request scanned records/bytes in the pass (`REPLAY_SCAN_LIMIT`/`REPLAY_BYTE_LIMIT` before emit); every held record charged **once** (`raw + 8 x payload`, measured decoded max 7.28x over 54,970 real records) from queue/channel/ring until tonic takes it; live and replay **separate** budgets; ring replay charged or falls back to the reader; Replay RPC admission per replica (32) and per consumer (`max_streams`); handoff 2; memory plan gains replay + transport terms, fail closed | `f4_*` x5: byte and record limits (Astra probe), large BOOK replays under a 3-record budget (peak <= bound, exact or typed), ring fallback, Replay admission + release, starved replay storm never overflows live | byte-limit mutant fails; shared-budget mutant fails the storm test | runs below |
+ | F5 coalescing | `subscription.rs`: drop only when the **next** queued record supersedes (contiguous run); oracle (`judge_subscription`) independently: legal drop only when the next deliverable record has the same key and signature | unit `f5_*` x5 (A-B-A-B, A-B-A, same-state runs, BAR in-progress/final/revised, BOOK and other product); Python `ContiguousOracleTests` x4 (dropped `A1,B2` is 2 defects) | any-later mutant: 3 of 5 fail | tests |
+ | Evidence limits | capture = newest contiguous window per key until each product has 20 records (snapshot + deltas + resets); near-live spool tail (indexed, read-only); per-wave cursors; coverage denominators | `CoverageTests`, `CaptureWindowTests`, `TailBatchTests` | - | runs below |
+
+ - Tests: Rust workspace fmt + clippy `-D warnings` clean, 264 passed /
+ 0 failed / 3 ignored (`--no-fail-fast`); real Kafka `committed_reads`
+ 2/2 on a disposable broker, ported from the removed `scan_range` to the
+ coordinator (one replay implementation). `native_stream` 32 (19 + 13),
+ stable over 33 consecutive runs (30 parallel, 3 single-threaded); gateway
+ unit 24 (+5); Python KN 65 OK (+8). Mutation checks: each fix reverted in
+ a scratch copy fails its regressions (counts in the table); the F1-F5
+ mutants ran on the intermediate source (before the live/replay budget
+ split), the shared-budget mutant on the final source.
+ - Test-harness fixes found on the way (not product defects): tests read
+ counters one by one while a coordinator driver re-takes its permit for a
+ final empty check; `baseline()` now compares one snapshot. Cargo reused
+ stale artifacts for mutants (tar keeps mtimes); mutants are touched.
+ - Isolated runs (packet above), binary `50c18092...` (rebuilds to the
+ same hash), `/home/bobby/.local/state/qdl-v2/kn2-20260924/evidence-r1fix`
+ (99 files, SHA256SUMS `7499374901cb...`, summary `1f269e70b144...`):
+ - Graceful stop + near-live tail: 6/6 clients PASS, 292/292 LIVE, 56,341
+ delivered, every defect counter 0, failover 185/185 (RTO p50 774, max
+ 973 ms), negatives 24/24, RPC checks 17/17, reconciliation A 41,129 =
+ 41,129, B 15,212 = 15,212, overflow 0.
+ - SIGKILL + capture load: 6/6 PASS, failover 185/185 (RTO p50 855, max
+ 901 ms), B 2,442 = 2,442.
+ - Capacity 3,000 events/s x 59 s: 6/6 PASS, 42,001 = 42,001, overflow 0;
+ live path per client p50 7-10 ms, p95 24-32 ms, p99 43-55 ms; replica A
+ RSS 127 MiB (limit 256), ring 47 MiB (bound 48), live queues <= 530 KiB,
+ 0.12 core mean busy (0.22 max 5 s); reader-only B 0.04 core, 81 MiB.
+ - Coverage (Astra limit): 286 of 292 subscriptions event-positive in at
+ least one run (was: 41 with none). Remaining 6: DNSE VN30 BAR 1m/TRADE
+ x4 `no_sample` (0 records in the V2 stable spool - source not flowing
+ into V2 stable) and reference-l2 BOOK_SNAPSHOT of two dated futures x2
+ `expected_filtered` (captured snapshots older than the consumer bound,
+ none in the 60 s tail). Per run: stop 156/132/4, hardkill 210/78/4,
+ capacity 238/50/4 (event-positive / expected-filtered / no-sample).
+ - Diagnostic passes kept in the summary: first pass on `4f5bf1b0` (one
+ shared budget) - 12 live lossless overflows in the opening storm ->
+ separate budgets + regression; tail run with run-start cursors - wave-2
+ ETH TRADE backlog 14,513 > 10,000 ended `CURSOR_EXPIRED` (correct typed
+ outcome; harness now picks cursors per wave); one capacity run during
+ concurrent builds on the host (latency not representative, rerun clean).
+ - Guards: host idle never < 5 % (min 6-8 %, median 37 %), 0 aborts;
+ production restart check 0 (one false positive was my own `--rm`
+ builder; the check now looks at compose-managed containers only; no
+ compose container started today).
+ - Cleanup: shadow cursor key, JWT config, test keys and profile deleted;
+ capture/commit logs and run dirs deleted (965 MiB scratch freed);
+ no kn2 container/network/volume. Kept to KN-2 PASS / KN-5: binary
+ `50c18092`, bundle, `evidence` (K2.5, unchanged) and `evidence-r1fix`.
+ `target/` 6.8 GB (to KN-5). Disk free 157 GB.
+
+
+**KN-2 R1 - points for Astra and the owner (decisions, not hidden gaps):**
+
+**Resolved by [Astra R2](#kn2-astra-review-r2).** The numbered proposals below
+are historical discussion, not instructions: notably genesis provisioning is
+not adopted, DNSE stays V1, and capacity is not permanently reduced to 384.
+
+1. **Offset 0 (Astra evidence limit).** Cursor v3 says `source_offset` = last
+ offset applied, replay strictly after, an unsigned integer: there is no
+ token for "nothing applied yet", so a product record at Kafka offset 0 can
+ be delivered to **no** cursor, and the SDK's `logical_offset > 0` check is
+ consistent with the frozen contract rather than wrong. Proposal: every
+ partition of a canonical partition-plan epoch starts with a non-product
+ genesis record at offset 0, written by the provisioning packet (KN-3 K3.1 /
+ KN-5); the gateway may then treat a product record at offset 0 as
+ `DATA_INTEGRITY`. The running canonical topic: retained ~8.09 GB at
+ 374 KB/s (KN-1 `sizing/kafka.json`) = about 6 h, topic in use since
+ August, so offset 0 records are aged out - an **inference**, the log-start
+ offsets were not read (needs the `kn-` DESCRIBE ACL). Alternatives: a
+ cursor v4 with an explicit "before first" (contract change) or SDK `>= 0`
+ alone (insufficient). Not claimed: full native public compatibility at a
+ partition's first record.
+2. **Memory defaults vs capacity.** To keep a provable bound in 256 MiB:
+ `max_subscriptions` 1,024 -> 384 and 32 Replay RPCs (transport term
+ 416 x 96 KiB), ring 64 -> 48 MiB, live 32 + replay 32 MiB; plan 247 MiB.
+ Demand today is 292 streams per replica after a failover (31 % headroom).
+ Keeping 1,024 streams needs ~320 MiB per replica (+64 MiB x 2): owner
+ approval if wanted; not requested.
+3. **Replay RPC admission is stricter than Python** (Python has none): per
+ consumer `max_streams`, 32 per replica, typed `RATE_LIMITED`. Confirm.
+4. **Decoded weight factor 8** (measured max 7.28): queues and replays are
+ charged ~9x the payload, so a slow consumer reaches typed backpressure
+ earlier than a raw-byte count would; measured queue peaks stay far below
+ the budgets (530 KiB of 32 MiB at 3,000 events/s).
+5. **DNSE VN30 in V2 stable**: 0 records in the spool for its demanded
+ products; out of KN-2 scope, owner to confirm whether it is expected.
+6. **Harness size** (Astra/guide 18.6): `kn_native_slice_probe.py` is 1,458
+ lines and the run orchestration lives in the evidence folder, not in
+ `scripts/` or CI. Proposal before KN-3: move the orchestration into
+ `scripts/`, reuse the guide's latency scripts for the four quantities,
+ add an isolated CI job. Needs an owner/Astra yes.
+7. **Recorded incident**: a 128 s unindexed read-only scan on the production
+ spool this session (packet above); production stayed healthy.
+
+**Astra re-review requested** on the narrow diff after `e3b8325`: the table
+above, the two budgets and the charge-once path, the coordinator driver
+(one pass per permit, joiners, starved backoff), the oracle rule, and the
+coverage classes. KN-3 only after ASTRA_REVIEW_PASS or explicit owner
+sequencing.
+
+
+#### KN-2 Astra R2 - Fix Verification And Entry Decisions
+
+- 2026-09-24: **ASTRA_REVIEW_PASS**, reviewed source `d646c99` plus the
+ source-only review closure recorded here, narrow follow-up to
+ [R1 fixes](#kn2-r1-fix-receipt) and [owner questions](#kn2-r1-discussion).
+ Owner explicitly keeps DNSE on V1 and permits measured resource increases
+ after optimization. No production change, ACL, topic provisioning, restart,
+ push/merge, full C2 or KN-3 implementation is part of this review.
+- Scope before edits: verify F1-F5, settle the six questions, pin offset-zero
+ snapshot handoff with a regression, document measured memory versus capacity
+ estimates, and reconcile tracker/spec/guide. Reuse existing isolated Kafka CI;
+ do not rewrite the capture harness or add another orchestration framework.
+- Checks already run independently: gateway Rust unit **24/24** and native
+ service **32/32**, Python KN suites **65/65**; retained R1-fix evidence
+ **99/99** file hashes match SHA256SUMS
+ `7499374901cb65e5a3e9d27545775e7f199d6f89cd42de2889b0b5da96572c3b`.
+ These are source/isolated evidence, not new live-provider certification.
+- Exit: all five findings reviewed closed; offset-zero regression passes;
+ no hidden before-first cursor or runtime provisioning assumption; exact
+ resource/coverage boundaries and KN-3 instructions recorded. Rollback of this
+ slice is source-only revert; deployed readers and all durable state stay intact.
+
+**Six decisions for Opus (supersede the R1 discussion proposals):**
+
+1. **No mandatory genesis record.** The public cursor is a snapshot handoff,
+ not a before-first archive iterator. Offset 0 is legal state: materialize
+ it, return it in a valid snapshot, sign offset 0, then replay strictly
+ after it. An empty/insufficient product view must return DATA_NOT_READY
+ with no fabricated cursor. A data record at 0 is not DATA_INTEGRITY.
+ Do not shift coordinates, change cursor version, guess that retention
+ removed offset 0, or add a provisioning dependency. Source-only KN-2
+ regression now covers empty view, real first fixture record at 0, snapshot,
+ replay 1 then live 2, page replay [1,2], both ring and separate reader,
+ and resource return to baseline. This is fixture acceptance, not a claim
+ the KN-3/4 persisted ReadView already exists. Those existing work items
+ must preserve this exact boundary.
+2. **Resources approved in principle, target preserved.** Current KN-2
+ evidence: 384 Subscribe + 32 Replay slots, 256 MiB, 247 MiB accounting
+ estimate, 292 admitted subscriptions and measured RSS about 127 MiB.
+ Keep that as the measured profile. Freeze a separate 1,024 + 32 planning
+ profile: 307 MiB estimated pools, **384 MiB cap**, 77 MiB headroom.
+ A 320 MiB cap fits arithmetic but leaves only 13 MiB, not a capacity
+ certificate. Budget JSON and Rust test now pin these numbers. No cap is
+ applied in this review; KN-3/5 measures the relevant packet, may use the
+ owner's resource direction after optimization, and accounts for old-plus-new
+ peak until obsolete services can safely be retired. Do not trim demand
+ just to retain the earlier 256 MiB assumption; 1,024 is not yet load-tested.
+3. **Bounded Replay accepted.** Separate per-consumer Replay counter capped
+ at manifest `max_streams`, replica cap 32; Subscribe retains its own
+ counter. Overload returns retryable RATE_LIMITED, no silent success or
+ record truncation. This intentional operational restriction relative to
+ unbounded Python preserves successful public RPC/cursor semantics.
+4. **Factor 8 accepted as an empirical allowance, not a theorem.** Measured
+ maximum decoded ratio was 7.28 over 54,970 records. Source/spec no longer
+ promise an arbitrary-payload heap bound or that OOM is impossible. Byte
+ credits, independent live/replay pools and typed overload remain enforced;
+ new payload/depth profiles must fit measured RSS/transport/reserve before
+ promotion. No decode allocator rewrite is introduced in this review.
+5. **DNSE/VN = V1_PRIMARY, outside KN V2 activation**, as the owner explicitly
+ confirms. Preserve the original 292 denominator; report 288 in-scope
+ crypto subscriptions, 286 event-positive across runs, two dated-future
+ BOOK_SNAPSHOT subscriptions expected-filtered (not fresh-data certification).
+ Four VN no-sample entries are declared exclusions, not fabricated passes.
+6. **Do not refactor the whole harness or add duplicate CI.** Reusable
+ capture/load/matrix/oracle is already in `scripts/kn_native_slice_probe.py`
+ and unit CI; `.github/workflows/ci.yml` already has
+ `kn-native-integration`, running the two real-Kafka ignored tests explicitly
+ and cleaning its broker. Historical host-specific launch scripts remain
+ hashed evidence, not a production API. Promote reusable orchestration into
+ `scripts/` when needed for the next approved packet, with isolated inputs
+ and no host secrets, using the existing job. Line count alone is not a
+ correctness gate or a reason to delay KN-3.
+
+**Review and verification:**
+- F1: atomic authority+generation admission and watch-before-check verified;
+ revocation is checked through replay, blocked send and LIVE, including Replay.
+- F2: corruption fails the affected requested key/range on reader/ring/live;
+ no skip-to-LIVE path. F3: joiners survive failed open and each pass returns
+ its permit; dropped requests receive a terminal result.
+- F4: per-request scan limits, replay admission and charge ownership reviewed;
+ replay no longer exhausts live queue credits. F5: only contiguous
+ same-lifecycle runs coalesce; A-B-A-B transitions remain visible or fail typed.
+- Independent final tests: `cargo test --offline --locked -p qdl-stream-gateway
+ --lib --test native_stream -- --test-threads=2`: **25 unit + 33 native = 58
+ passed, 0 failed, 0 ignored**. Two added regressions: offset-zero bootstrap
+ and 1,024-stream candidate budget. Existing real-Kafka/mTLS/capture results
+ are inherited from the hash-verified receipt, not rerun or relabelled live.
+- `cargo clippy --offline --locked -p qdl-stream-gateway --all-targets --
+ -D warnings`: **PASS**. Python `python -B -m unittest
+ tests.test_kn_native_slice_probe tests.test_kn_resource_sizing
+ tests.test_kn_v220_contracts`: **65 passed** after changes.
+- `cargo fmt --all -- --check`: **PASS**. Budget JSON parsing, both profile
+ arithmetic, unchanged inherited budget SHA and receipt/guide anchors: **PASS**.
+ `git diff --check` detects only the pre-existing unrelated whitespace at
+ old plan line 13067; that hunk is not part of this commit. Scoped staged
+ diff must pass without modifying the owner's unrelated edits.
+- Isolated capacity evidence remains 3,000 captured events/s, 59 seconds;
+ commit-to-client after LIVE p99 **42.7-55.3 ms** for clients with samples.
+ These are native stage measurements, not source-to-consumer live latency;
+ no-sample clients do not receive invented latency quantiles. Captured replay
+ and same-host failover are not independent-failure-domain HA certification.
+- Scope left intentionally for the existing guide: KN-3 durable materializer,
+ fenced cache/generation and recovery; KN-4 actual Query/warmup/SDK integration;
+ KN-5 full target-load/cutover/release. Production `kn-` ACL remains a live
+ measurement packet concern, not a reason to block KN-3 source work.
+
+**Runtime, source and cleanup receipt:**
+- Canonical `/home/bobby/data_layer`, `feat/consumer-endpoint-benchmark`; one
+ worktree only. No new branch/worktree, push, merge or deployment. Local
+ `main`/`dev` remain `e6955f3`; published stable baseline remains `v2.1.0`.
+- Query replicas remain `qdl-v2-python:2.1.1-83fa1bc`, digest
+ `sha256:dd065fdf8c439ce9034bca47817e1e88ce0a69bbdbd24a2d1f6b0d2f6f693951`;
+ Stream active/passive remain `qdl-v2-python:2.1.1-ae2d62a`, digest
+ `sha256:37d7f5182ea170f5cc35967aabba0d7f0c1b4b934c12aa25a51ac79664b181f9`.
+ All four healthy, restart 0, OOM false; mounts/config untouched, no new
+ config revision attested. Old readers/rollback artifacts preserved.
+- Tests reused existing builder/Python images, network disabled, --rm,
+ bounded CPU/RAM; no new image, network, volume or provider write. Disposable
+ review containers removed automatically; no broad prune. Shared active KN
+ compiler cache and explicitly retained candidate remain for KN-3/KN-5.
+ Inventory: 49 images / 21.55 GB, BuildKit 6.417 GB; disk free 157 GB.
+ This is an inventory, not a claim that shared historical images were cleaned.
+ Two unrelated pre-existing Unified Plan edit hunks remain unstaged/preserved.
+
+**Conclusion:** KN-2 review is closed at its declared scope. **Opus may enter
+KN-3 now**, following guide 18.10 and the same branch; do not begin KN-4/5,
+change production authority or certify a new release from this receipt alone.
+
+
+### KN-3 - Rust Materialization, BAR Migration And Bounded Recovery
+
+**Status:** ASTRA_REVIEW_PASS / CLOSED at isolated-flow scope (2026-09-25,
+source `f0380a4`, recorded from the owner's hand-off of the Astra conclusion)
+after R1 (slice 11), R2 (slice 12), R3 (slice 13, post-publish window) and R4
+(slice 14, never-ready product after unstage). The production state-topic /
+projector packet stays gated on owner decisions; readback cutover is KN-5.
+**Entry receipt:** [Astra R2 decisions and bootstrap/resource rules](#kn2-astra-review-r2).
+**Goal:** a native, durable-state-backed cache actually serving readers, with
+correct history, idempotent recovery and bounded memory/disk growth.
+**Guide index:** [18.10 work items and K3-T01..T08](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-guide-phase-3),
+[18.4 state/retention/fences](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-contracts-and-correctness),
+[18.6 sizing](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-resources-and-latency),
+[18.13 packets](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-rollout-and-cleanup).
+
+**To do:**
+- [x] K3.1 exact state-topic schema/partition routing/ACL and idempotent provision packet
+ (slice 2; production apply = owner gate: principal, segment settings).
+- [x] K3.2 Stage A transaction with original canonical provenance and durable offsets (slices 1, 5).
+- [x] K3.3 Stage B fenced CAS/atomic view/checkpoint and crash-safe recovery (slices 4, 7, 10).
+- [x] K3.4 separate bounded market cache; protect existing quota/admission Redis
+ (slice 4 + sizing receipt slice 10; production maxmemory = owner gate).
+- [x] K3.5 current BAR index, append-only revisions, retention floors/tombstones/cleaner (slices 6, 7).
+- [x] K3.6 read-only legacy export/migration/tie-out; BAR-edge readback backend change (slices 8, 10).
+- [x] K3.7 staging rebuild/tail/ready-generation protocol and measured RTO (slices 4, 7, 10).
+**Completed:** slices 1-10 (`0b6cea6`..`bc397e7`), decisions D1-D17 below.
+**Verification:** K3-T01..T08 run - unit/integration on isolated Kafka/Redis
+(projector 40 ignored tests green 3 rounds, workspace 293/0) and the isolated
+full flow on real data (slice 10): parity, recovery RTO, expiry/cleaner,
+resources. Tested locally + isolated; not production-applied.
+**Exit gate:** no history loss or invented cursor; correct durable/cache state,
+implemented bounded retention, measured rebuild/capacity; Astra reviewed sink
+fencing and provenance. Kafka EOS alone is not external-sink acceptance.
+**Technical debt / decisions:** no unfinished migration/recovery/retention allowed.
+Topic/ACL/cache runtime scope must be concretized; no permission to alter canonical
+offsets or flush/delete shared state is implied by the plan.
+**Runtime / rollback:** candidate topics/cache/projector/readback only under packet;
+stop candidate path and restore readback config, keep old history/source intact.
+**Cleanup:** test prefix/topic/volume exact scope; no FLUSHDB shared; no removal
+of the sole old-history copy. Record before/after disk and retained rollback.
+**Astra review:** R1 REVIEW_CHANGES_REQUIRED (F1-F4) -> slice 11; R2
+REVIEW_CHANGES_REQUIRED (two residuals) -> slice 12; R3 REVIEW_CHANGES_REQUIRED
+(post-publish cleanup) -> slice 13; R4 REVIEW_CHANGES_REQUIRED (never-ready
+product after unstage) -> slice 14; **ASTRA_REVIEW_PASS at `f0380a4`
+(2026-09-25)** ([R4](#kn3-astra-review-r4)).
+**Next permitted step:** KN-4 (in progress); KN-3 production packet only with
+explicit owner approval.
+
+#### KN-3 Execution Journal
+- 2026-09-23: owner-approved plan recorded; implementation/tests/runtime NONE.
+- Append tested-slice receipts and Astra findings/resolutions here.
+- 2026-09-24: **Owner start and parallel assignment.** Bobby started KN-3 after
+ the KN-2 R2 PASS and asked for more agents in parallel. Per guide 18.10 and
+ the program rule (no concurrent edits to shared files), work is split by
+ **disjoint new files**; helper agents never commit, Claude integrates,
+ re-tests and commits each slice. No extra git worktree; each helper builds
+ with its own cargo target directory in the session scratchpad (removed at
+ slice end). Assignment: (a) state codecs (`rust/qdl-contracts/src/
+ state_codec.rs`, `qdl/projection/kn_state_codec.py`, golden
+ `contracts/golden/kn_v220/state_codec.json` + generator, tests); (b) K3.1
+ provision packet (`scripts/kn_state_topics_packet.py` + tests); (c) Claude:
+ projector crate `rust/qdl-projector` (Stage A, Stage B, Lua, retention,
+ rebuild) and all shared-file edits (plan, contracts doc, workspace
+ manifests, compose/CI); (d) later: migration exporter and BAR-edge readback
+ adapter after the code survey. Wait-dependent work is listed in the report.
+- 2026-09-24: **KN-3 design decisions D1-D5 (recorded before code).**
+ - D1 One new crate `rust/qdl-projector` (lib + one binary) holds Stage A and
+ Stage B as bounded task pools in one role (guide 18.3); partition
+ ownership by consumer group, no global lock. It uses rdkafka directly like
+ the stream gateway; `qdl-kafka`'s bridge is not widened (its output set is
+ locked to canonical/quarantine for the running core).
+ - D2 State-topic record = a versioned binary frame, not a new proto message
+ (proto generation uses `buf` remote plugins = sending contract source to
+ an external service; not approved): `QKS1` magic, kind byte (LATEST,
+ BAR_REVISION, RETENTION_FLOOR, LEGACY_BAR), big-endian u32 header length,
+ canonical strict JSON header (sorted keys, no whitespace, exact field set
+ per kind, JSON integers only, u64 never a float), then the canonical
+ EventEnvelope bytes **unchanged** (no timestamp or field rewrite). The
+ header carries LPK, source coordinate `{topic_id, partition, offset}`,
+ materializer epoch, content SHA-256 and event id; BAR adds open time (ms),
+ revision and finality; LEGACY_BAR carries `provenance=legacy_import` and the
+ legacy lineage instead of a source coordinate (never an invented offset).
+ - D3 Keys and routing. `md.latest.v2` key = LPK. `md.bars.v2` key =
+ `||p` for the one in-progress row of an open, and
+ `||f|` for each final or
+ revised fact (budget "binding|open_time_ms|revision" with the binding
+ expressed as the LPK and the content hash added): an in-progress update can
+ never compact away a final, and two equal-revision finals with different
+ content both survive compaction so CONFLICT stays provable after a rebuild.
+ `|floor` carries the durable retention floor. Both topics are
+ partitioned by **the LPK only** with the Java-compatible murmur2 hash
+ (explicit partition on produce), so every record of one product is in one
+ partition in order.
+ - D4 Cache values reuse the frozen KN-1 encodings: a BAR current-index row is
+ the contract section 4 LPK row (48-byte trailer + canonical envelope
+ without uid/venue/market/interval); a latest value is the same trailer +
+ the canonical bytes. Coordinates and generation live in separate hash
+ fields as decimal strings (no double). Rust and Python codecs share one
+ golden built from real canonical records.
+ - D5 K3.1 packet follows `scripts/phase103_apply_shared_primary_broker_scope.py`:
+ offline review by default, `--apply --confirm `, exact topic
+ names (never positional indices; the phaseb bootstrap list has an index
+ drift), exact describe verification of `cleanup.policy`,
+ `delete.retention.ms`, `min.compaction.lag.ms`, RF and min ISR. The
+ projector principal is a parameter: a least-privilege principal needs a new
+ certificate and the stable CA key is deleted by design, so production
+ principal choice (new CA/mesh rotation before 2026-11-20 vs reusing
+ `phase8-consumer`) is an **owner decision at the production packet**; the
+ isolated broker runs do not depend on it.
+- 2026-09-24: **KN-3 slice 1 - K3.2 stage A transactional engine: implemented,
+ tested locally + isolated real Kafka.** New crate `rust/qdl-projector`
+ (`stage_a.rs`, `kafka_pipe.rs`): one step polls a bounded batch of committed
+ canonical records, transforms the whole batch **before** opening the
+ transaction (an integrity stop leaves nothing half-published), publishes
+ the state records and `send_offsets_to_transaction` (consumer group
+ metadata, so a stale member is fenced) and commits; an abortable error
+ aborts and rewinds to the committed offsets; a transform integrity error
+ stops the engine with partition/offset (never skipped); a fatal error
+ (fenced transactional id) stops it. Consumer `read_committed`, no
+ auto-commit, earliest on the group's first start, cooperative-sticky;
+ producer idempotent, `acks=all`, zstd, fixed transactional id per replica.
+ Product classification (the `Transform`) comes after the code survey.
+
+ | Work item | Command / cases | Result | Failure -> fix | Runtime | Cleanup |
+ |---|---|---|---|---|---|
+ | K3.2 engine, K3-T01 | `cargo test -p qdl-projector` (in-memory `read_committed` pipe): commit, abort+retry once, failed commit, crash before commit, integrity stop, fatal stop, bounded batches | 6/6 | - | none | - |
+ | K3-T01 real Kafka | `cargo test -p qdl-projector --test stage_a_kafka -- --ignored` on a disposable broker: exact outputs + committed offsets (40 inputs, 7-record batches), crash inside a transaction then restart (orphan invisible, exact once), zombie with the same transactional id fenced (fatal) while the replacement publishes exactly once, two members rebalancing (60 inputs, exact once) | 4/4, three consecutive runs | first run: the tests polled once while the consumer was still joining its group (empty batch; an empty transaction commits locally, so the zombie was not fenced) -> poll until records arrive | isolated `kn3-it-net`, removed | 0 containers |
+ | Workspace | fmt, clippy `-D warnings`, `cargo test --workspace --no-fail-fast` on the exact staged content (index exported, helper files excluded) | 272 passed / 0 failed / 7 ignored (the Kafka tests) | - | none | - |
+
+ CI: the existing `kn-native-integration` job also runs `stage_a_kafka`
+ (Astra decision 6: reuse the job, no duplicate). Helper slices (codecs,
+ K3.1 packet) are in progress on their own files and not in this commit.
+- 2026-09-24: **KN-3 slice 2 - K3.1 state topic and ACL packet: implemented,
+ tested locally + isolated broker (production NOT applied).** Helper-built,
+ Claude-reviewed and re-run: `scripts/kn_state_topics_packet.py` +
+ `tests/test_kn_state_topics_packet.py` (decision D5).
+ - Topic specs are read from the budget JSON (its SHA-256 is in the plan);
+ only `md.latest.v2` / `md.bars.v2` may be provisioned; `md.canonical.v2`
+ only READ/DESCRIBE. Exact ACL set for the projector principal (13
+ entries): canonical READ+DESCRIBE, both stage groups READ (literal), both
+ state topics WRITE+DESCRIBE+READ, transactional id PREFIXED
+ `kn-projector-v3-` WRITE+DESCRIBE, cluster IDEMPOTENT_WRITE; no ALL /
+ ALTER / DELETE / CREATE / DENY / wildcard; prefixed only for the
+ transactional id.
+ - Modes: `review` (offline, exit 10, prints plan, commands and the sealed
+ token `APPLY_QDL_KN3_STATE_TOPICS_<16 hex>` over plan + exact commands),
+ `apply --confirm TOKEN` (only missing `--create --if-not-exists` and
+ `--add`, never alter/remove; a topic with another config or an extra ACL
+ of the principal on a planned resource is HARD_STOP before any change),
+ `verify` (read-only: partitions, RF, replicas, every config and no extra
+ override, missing/extra ACLs incl. `User:*` and covering prefixes).
+ Production runner = a `--rm` container of the compose `stable_admin` image
+ digest on `stable_internal` with the cert dir read-only (never executed;
+ whether the Kafka CLI needs a writable log dir in a read-only container is
+ **unverified** until the production packet). Isolated runner refuses any
+ container of the production compose project; the replication override
+ (`RF,MIN_ISR`) exists only in isolated mode and is recorded in the plan.
+ - Tests: 25 unit (fake broker replaying real Kafka 4.2 output) + 1
+ integration on a disposable broker: wrong token refused with 0 commands,
+ first apply PASS 9 mutations, re-apply PASS 0 mutations, verify 13/13
+ ACLs, extra ALTER ACL -> verify FAIL and apply HARD_STOP 0 mutations,
+ 3-partition plan on an existing topic -> HARD_STOP. Re-run by Claude on a
+ fresh broker: 25/25 OK (164 s); 0 `kn3-pkt` containers/networks left.
+ - Production review (offline) token for principal `User:kn-projector`:
+ `APPLY_QDL_KN3_STATE_TOPICS_b087c3fd45325fe9` (changes with the principal).
+ **Owner gate:** the principal (new CA/mesh rotation before 2026-11-20 vs
+ reuse `phase8-consumer`); the packet then runs as a separate approved
+ production step.
+- 2026-09-24: **KN-3 slice 3 - state codecs (D2-D4): implemented, tested
+ locally, cross-checked on real records.** Helper-built, Claude-reviewed and
+ re-run: `rust/qdl-contracts/src/state_codec.rs` (+ `pub mod` in `lib.rs`),
+ `qdl/projection/kn_state_codec.py`, `scripts/kn_state_codec_golden.py`,
+ golden `contracts/golden/kn_v220/state_codec.json` (148,943 B),
+ `tests/test_kn_state_codec.py`.
+ - BAR cache row = KN-1 `lpk_row` byte for byte (84/84 real bars with the
+ KN-1 trailer values); latest value = trailer + canonical bytes; state frame
+ `QKS1` with LATEST / BAR_REVISION / RETENTION_FLOOR / LEGACY_BAR; keys
+ (``, `||p`, `||f|`, `|floor`; a
+ legacy fact has the same key as the canonical fact); partition =
+ Java-compatible murmur2 of the LPK.
+ - Shared reason codes in both languages (first failure wins, same order):
+ TRUNCATED, MAGIC, KIND, HEADER_SIZE, HEADER_JSON, HEADER_FIELDS, FIELD,
+ NON_CANONICAL, BODY, CONTENT_HASH, ENVELOPE, NOT_BAR, PRODUCT_MISMATCH,
+ OPEN_TIME, HEADER_MISMATCH, TRAILER, ENVELOPE_NOT_CANONICAL, PARTITIONS.
+ - Decisions taken in the slice (accepted): one `FIELD` reason with the
+ field path in `detail` (serde_json cannot tell a >u64 integer from a
+ float); Python JSON parsing aligned to serde_json 1.0.145 (pinned by
+ vectors: `-0`, >u64, overflow, depth 127/128, surrogates, BOM, NaN);
+ unknown protobuf fields dropped in Python like prost, and `encode_bar_row`
+ refuses canonical bytes that would not re-serialize exactly
+ (`ENVELOPE_NOT_CANONICAL`); a stored row that still carries uid/venue/
+ market/interval is refused; LATEST frames check uid/venue/market/feed/
+ qualifier against the envelope; header strings use a no-escape charset,
+ header <= 4096 B; bar open time must be a whole millisecond >= 0; a
+ retention floor needs a BAR product and an empty body. Golden provenance:
+ canonical bytes and legacy lineage are real, Kafka coordinates/epochs are
+ generator-assigned (marked), 26 records (24 real, 2 synthetic), 62 invalid
+ frames, 8 invalid rows, 4 invalid values, 24 refused encodes.
+ - Tests (re-run by Claude): Rust `qdl-contracts` 29/29 (7 new), clippy
+ `-D warnings` clean, fmt OK; Python `test_kn_state_codec` +
+ `test_kn_v220_contracts` 31/31; full-sample cross check over all 114 real
+ records (Python export -> Rust re-encode/decode -> Python verify): 114
+ latest values, 84 BAR rows, 282 frames, **0 mismatches**; golden
+ regenerated byte-identical.
+ - **murmur2 verified against real Kafka** (the helper's reference vectors
+ were recalled, not run): 46 keys (the real LPKs, 1-5 byte tails, unicode,
+ 300 chars) produced with the Kafka 4.2 console producer to a 6-partition
+ topic on a disposable broker; Kafka's chosen partition = ours for
+ **46/46**, all six partitions used. Broker removed, 0 left.
+- 2026-09-24: **KN-3 design decisions D6-D12 - stage B, market cache,
+ expiry and rebuild (recorded before code).**
+ - D6 **Market cache process**: one new Redis role, same image digest as
+ `stable_redis`, config from the budget (`maxmemory` 1,288,490,188 B,
+ `noeviction`, `hash-max-listpack-entries 128`, `hash-max-listpack-value
+ 2048`, `save ""`, `appendonly no`), container cap 1,536 MiB. Rebuildable
+ from the state topics; the control/quota Redis is never used for data.
+ All keys under one prefix `kn3::`; no cluster, no hash tags.
+ - D7 **Key layout** (generation `g`, product `lpk`, decimal strings for
+ every u64; no Lua arithmetic on offsets):
+ `ptr:` hash `{ready, fence, staging}` (contract section 5);
+ `gen` counter (INCR allocates generations);
+ `l::` hash `{v, t, p, o}` = latest value + source coordinate;
+ `bm::` hash `{floor, first, last, last_final, rows, conflicts}`;
+ `b:::` hash `{: row}` with `bucket = open_ms div
+ (116 x shortest duration of the interval)` so a bucket never holds more
+ than 116 opens (listpack), also for calendar intervals;
+ `rk::` hash `{: "f|,..."}` = only the fact
+ keys that are **not** the current row (superseded revisions, refused
+ conflicts), so expiry can tombstone every fact of an open (the current
+ row's key is derived from the row itself; the in-progress key always
+ `||p`); `cx::` list of the last 100 conflict records;
+ `own::` owner fence; `ckpt::` hash
+ `{next, fence, at_ms}`.
+ - D8 **Apply protocol** (K3.3, K3-T02). Stage B consumes both state topics
+ `read_committed` in group `kn-projector-v3-b` (partition ownership). On
+ assignment it INCRs `own::` (its owner fence) and seeks to
+ `ckpt.next` (Kafka group offsets are informational only). Per batch Rust
+ decodes each frame strictly, pre-reads the product pointer and the current
+ entry, decides with `state_contract` (latest apply; BAR revision rules,
+ CONFLICT never last-write-wins) and sends one Lua call that, atomically:
+ refuses the whole batch if `own` != its fence (zombie, typed, counted);
+ refuses an op whose pointer `(ready, staging, fence)` or current entry
+ (latest: offset/partition/topic id; BAR: the 48-byte trailer) changed
+ since the pre-read (CAS miss -> Rust re-reads and re-decides); writes the
+ payload, `bm`, `rk` and conflict record; and sets `ckpt.next` - payload,
+ index, meta and checkpoint are never visible half-applied. A crash after
+ the Lua call and before anything else is harmless (the checkpoint moved
+ with the data); a crash before it re-applies the batch (DUPLICATE/STALE).
+ - D9 **Cold build and readiness** (K3.7, K3-T05/T06). A partition whose
+ products have no pointer, or whose checkpoint is missing, older than the
+ rebuild horizon (tombstone lifetime 7 d minus 1 d margin) or below the
+ partition's earliest offset, is built into a fresh generation from the
+ partition start: products get `staging = G`; at the boundary (the end
+ offset read at assignment, position past control records) every staged
+ product is published `ready = G, fence + 1` by CAS and the superseded
+ generation's keys are reclaimed. Only products with a ready pointer read
+ READY; a missing product is NOT_READY_NO_GENERATION, never a default. A
+ cache overlay after a longer outage is never allowed (missed deletes).
+ - D10 **Per-product rebuild** (contract section 5): allocate `G`, set
+ `ptr.staging = G` (live stage B then dual-writes the ready and staging
+ generation - the rules are order-independent, so the two converge); a
+ bounded reader replays the product's records from its partition start into
+ `G` up to the live checkpoint captured when staging began; verify
+ (rows/first/last/last_final and conflicts equal to the facts replayed)
+ then CAS-publish `ready = G, fence + 1`, clear `staging`, reclaim the old
+ generation; one product in staging at a time (budget peak rule).
+ - D11 **Expiry** (K3.5) is a bounded task inside the projector role, not a
+ service: per BAR product, when `rows` exceeds the retained cap (demanded
+ rows + 2,064 headroom; products without BAR demand are not materialized)
+ by more than one bucket, it computes the new floor (the open time of the
+ cap-th newest row), and publishes in one transaction a RETENTION_FLOOR
+ frame and tombstones for every fact key of each open below the floor
+ (current row, `rk` extras, in-progress key). Stage B applies the floor by
+ deleting rows below it (whole buckets `DEL`, the boundary bucket `HDEL`),
+ and refuses later facts below the floor (typed `STALE_BELOW_FLOOR`,
+ counted; the expiry task tombstones them again). Floors only rise.
+ - D12 **Failure boundaries**: a frame that does not decode stops stage B for
+ that partition with its offset (never skipped); Redis unavailable or
+ `OOM` (noeviction) stops applying with typed memory pressure and the
+ checkpoint stays behind (nothing silently dropped, promotion blocked); the
+ control/quota Redis is never touched.
+- 2026-09-24: **KN-3 slice 4 - K3.3/K3.4 stage B and market cache: implemented,
+ tested locally + isolated Kafka and Redis.** `rust/qdl-projector/src/`
+ `apply.lua`, `cache.rs`, `stage_b.rs`, `kafka_state.rs`; the canonical
+ interval owner moved to `qdl-contracts::interval` (the gateway re-exports it)
+ so the projector does not duplicate it.
+ - Implemented as D6-D12, with these findings made during the slice:
+ (1) the script checks every expectation against the state **before** the
+ batch, so a pointer change cannot share a batch with the data ops that
+ depend on it -> three atomic steps (stage, data, publish/unpublish); (2) a
+ partition is prepared **at assignment** and sought to its checkpoint (or
+ start), and records fetched before the seek are dropped - preparing on the
+ first record could keep records from the old group offset (a gap in build
+ mode) and never prepared an empty partition; (3) a finished build always
+ writes its checkpoint, also with no ops, so a restart tails instead of
+ building again; (4) counters of a CAS-missed attempt are discarded.
+ - D13 **Legacy rows** (K3.6 imports) carry the trailer offset `2^63-1`
+ (`MAX_OFFSET`, no real offset reaches it) = "no canonical coordinate";
+ only the final/revision/hash rules decide for them.
+ - Tests (Claude-run; `QDL_KN_TEST_*` point at disposable containers):
+
+ | Case | Suite | Result |
+ |---|---|---|
+ | bucket bound (<= 116 opens, any grid offset), op serialization | `qdl-projector` unit | 8/8 (with stage A) |
+ | zombie applies nothing; one stale expectation -> whole batch refused, checkpoint unchanged; pointer change -> miss; u64 above 2^53 exact (offset, CAS); floor removes 250 of 300 rows, refuses a later fact, never lowers; stage/publish/reclaim swap (old generation 0 keys left, writer with the old pointer refused) | `cache_redis` | 5/5 |
+ | `maxmemory` + noeviction: typed `MemoryPressure`, nothing applied, checkpoint behind (dedicated Redis: the limit is server-wide) | `cache_redis_memory` | 1/1 |
+ | cold build publishes, absent product NOT_READY; restart tails (no rebuild) and the old owner is a zombie; beyond the horizon a fresh generation, a product whose state is gone unpublished, old keys reclaimed; replay after a crash changes nothing; BAR rules (in-progress->final, late in-progress stale, revision applied, lower stale, equal-different CONFLICT kept first, duplicate), superseded fact keys kept for expiry; BOOK snapshot not erased by delta/reset; floor + late fact below it | `stage_b_redis` | 7/7 |
+ | real Kafka + Redis: committed frames READY, an aborted newer frame never applied, a second group member takes over and applies the newest frame, each partition built once, the new member never rebuilds | `stage_b_kafka` | 1/1 |
+ | the whole ignored set (stage A Kafka 4 + the above) | `cargo test -p qdl-projector -- --ignored` | green 3 rounds in a row |
+
+ - CI: the existing `kn-native-integration` job now also starts two Redis
+ containers of the stable Redis digest in the broker's network namespace
+ and runs every ignored `qdl-projector` test.
+ - Not yet: stage A product classification (awaits the projector/Query
+ survey), expiry task (D11), per-product rebuild (D10), migration and BAR
+ readback (K3.6), isolated full-flow run with real data (K3-T08).
+- 2026-09-24: **KN-3 design decisions D14-D16 (recorded before code), from
+ the read-only projector/Query and BAR-edge surveys.** Survey facts (file:line
+ checked): the running projector has no product classification - one latest
+ key per `(oneof, venue, market, uid)` with no interval or source, so BAR
+ intervals of one instrument overwrite each other
+ (`qdl/projection/stable.py:316-323`); every canonical record must match a
+ catalog binding or the projector generation stops
+ (`qdl/runtime/stable_projector.py:340-347`, `stable_catalog.py:454-461`),
+ so FEED_STATE/QUALITY_EVENT are not on the topic today; the physical key is
+ `uid/feed/source_id` with snapshot+delta sharing `book`
+ (`stable_catalog.py:172-188`); 216 bindings -> 198 physical keys (BAR 144,
+ BOOK_DELTA 18, BOOK_SNAPSHOT 18, QUOTE 12, TRADE 14, MARK_INDEX_PRICE 10);
+ Query reads only the SQLite spool (`qdl/runtime/stable_source.py:958-967`)
+ and needs the full envelope; spool BAR retention is a **count** cap of
+ 12,064 rows per partition key (10,000 public + 2,064,
+ `qdl/runtime/stable_capacity.py:8-27`, age trim disabled `stable.py:555`);
+ the BAR edge reads back through one method
+ `_durable_final_bar_opens(binding, opens) -> opens`
+ (`qdl/runtime/stable_bar_edge.py:969-1050`) keyed by the cache generation
+ `cache_id` (`:922-967`); no stable producer emits REVISED/CANCELLED or
+ `supersedes_event_id` (`rust/qdl-core/src/canonical.rs:420-422,493-495,
+ 655-657`).
+ - D14 **Stage A product classification.** The one product-identity owner is
+ the gateway bundle compiled by `scripts/kn_gateway_bundle.py` from the
+ Python catalog (`LogicalProductKey.for_product`), so Stream and projector
+ cannot disagree on an LPK. Its Rust loader moves from the gateway to
+ `qdl_contracts::gateway_bundle` (the gateway re-exports it, as with the
+ interval owner). A record maps by `(physical key = Kafka key, payload
+ feed)` to exactly one binding; snapshot and delta of one book are two
+ products, MARK_INDEX_PRICE is one product and its envelope (both component
+ clocks) is carried unchanged (K3-T03). BAR -> `BAR_REVISION` on
+ `md.bars.v2`, everything else -> `LATEST` on `md.latest.v2`; source
+ coordinate = (canonical topic id from config, partition, offset);
+ materializer epoch from config. A record with no binding, a different
+ identity than its binding, or a payload that does not decode stops stage A
+ with its offset (parity with today's fail-closed projector; no silent
+ skip). No demand filter: every catalog binding is materialized (parity;
+ this amends D11's "products without BAR demand are not materialized").
+ The bundle is refused at load when a sampled feed (OPEN_INTEREST,
+ LONG_SHORT_RATIO, TAKER_FLOW, BASIS) carries an interval: the frozen KN-1
+ product check qualifies only BAR by interval, so such a product cannot be
+ verified (none is in the catalog today; **KN-1 contract gap for Astra**).
+ - D15 **Retained cap** per BAR product = max(10,000 public window, largest
+ `max_warmup_rows` of a manifest requiring it) + 2,064 headroom = 12,064
+ for the current manifests (largest 10,000): the same count the spool keeps
+ today, so migration and expiry never lose coverage.
+ - D16 **K3.6 migration and readback (Python, existing `qdl-v2-python`
+ image: confluent_kafka 2.15, redis 5.3.1).** (a) Export is read-only from
+ the canonical cache SQLite (`?mode=ro`, `query_only`), per BAR physical key
+ through the primary key `(stream, partition_key, logical_offset)` only
+ (EXPLAIN QUERY PLAN checked, never `accepted_at_ns`). Each row becomes a
+ `LEGACY_BAR` frame with lineage (spool stream, partition key, logical
+ offset) and the fact key of its content; frames are published to
+ `md.bars.v2` in bounded transactions. `logical_offset` is lineage only,
+ never a canonical offset (append order, not market time). Rerun is
+ idempotent: keys are content-addressed, stage B treats an equal fact as a
+ duplicate and a lower revision as stale, so an import never overwrites a
+ newer correction; the receipt records per binding count/first/last open
+ and a SHA-256 over (open, revision, content hash), plus the replay cutoff
+ actually captured (canonical earliest offsets per partition at export).
+ (b) BAR-edge readback adapter implements the same contract as
+ `_durable_final_bar_opens` against the market cache (READY generation of
+ the LPK, bucket `HMGET` of the asked opens, trailer + envelope decode,
+ FINAL/REVISED only, fail closed on identity mismatch), and its generation
+ identity (LPK + ready generation) replaces `cache_id` for the edge's
+ rebase logic. Selected by configuration; the SQLite path stays the default
+ until cutover (KN-5).
+- 2026-09-24: **KN-3 slice 5 - K3.2 stage A product classification (D14/D15):
+ implemented, tested locally on real records.** `rust/qdl-projector/src/
+ products.rs` (`ProductMap::from_bundle`, `ProductTransform` implementing the
+ stage A `Transform`, `retained_caps`); the bundle loader moved to
+ `rust/qdl-contracts/src/gateway_bundle.rs` (the gateway's `bundle.rs`
+ re-exports it, no behavior change); `tests/test_kn_products.py`.
+ | Check | Command | Result |
+ |---|---|---|
+ | book snapshot+delta on one physical key = two latest products; BAR -> bars topic with fact key, envelope unchanged; MARK_INDEX one latest product; unbound feed / foreign key / other instrument / non-envelope / empty payload -> integrity stop; sampled feed with interval, product-key drift, duplicate (key, feed) -> bundle refused; caps 12,064 / 27,064 / no demand 12,064; the 24 real golden records -> golden keys, partitions (6) and the golden LATEST/BAR_REVISION frames byte for byte | `cargo test -p qdl-projector --lib` | 15/15 (6 stage A, 2 cache, 7 products) |
+ | real catalog -> bundle: (physical key, feed) unique, load checks pass for all 216 bindings, every real golden record finds its binding with the same LPK | `python -B -m unittest tests.test_kn_products tests.test_kn_gateway_bundle` (image `qdl-v2-python:2.1.1-83fa1bc`) | 6/6 |
+ | real bundle (216 bindings, sha256 `e8aa9c95...36fb`) + the 114-record read-only canonical sample (BAR 84, book delta 6, snapshot 6, mark/index 6, quote 6, trade 6): every record classified, frame decodes, canonical bytes unchanged, 144 BAR caps all 12,064 | one-off scratch run (inputs are not in Git) | 114/114 |
+ | gateway after the move; contracts | `cargo test -p qdl-stream-gateway -p qdl-contracts`, clippy `-D warnings` | green |
+- 2026-09-24: **KN-3 slice 6 - K3.5 BAR expiry (D11): implemented, tested
+ locally + isolated Kafka and Redis.** Helper-built, Claude-reviewed and
+ re-run: `rust/qdl-projector/src/expiry.rs` (`plan_expiry`,
+ `continue_expiry`, `publish_expiry`, `ExpirySink`, `ExpiryTask`),
+ `tests/expiry_redis.rs`, `tests/expiry_kafka.rs`.
+ - Implementation decisions: typed `ExpiryError` (an undecodable row or
+ `rk` suffix is an `Integrity` stop, D12); target floor = open of the
+ cap-th newest row (pipelined `HKEYS` walking buckets down, 16 per round
+ trip, never SCAN/KEYS); a bounded step's floor is the first open **not**
+ collected, so every step is exact and on the grid; the slack gate
+ (`rows <= cap + 116`) applies to a new plan only - `continue_expiry` walks
+ toward an already decided target; the task does not re-plan a product
+ until stage B applied its last published floor (`pending`), and drops
+ progress when the ready generation changes; caps are validated (BAR,
+ fixed interval, > 0) and visited round robin, every product examined
+ counting toward the per-tick bound.
+ - **D11 amendment (gap found by the helper):** a fact that reaches stage B
+ below the floor (`STALE_BELOW_FLOOR`) is not recorded anywhere, and a fact
+ applied between the plan's read and the floor frame loses its row with the
+ `F` op - both would leave fact keys in the compacted topic forever. They
+ are removed by the bounded **bars-topic cleaner** (K3.5 "bounded
+ cleaner"): a periodic sweep of each bars partition (assign mode,
+ `read_committed`, earliest -> end snapshot) that tombstones every fact key
+ below its product's floor whose last record is not a tombstone, in
+ bounded transactions (id prefix `kn-projector-v3-cleaner-`). The topic is
+ the truth, no Lua bookkeeping; memory is bounded by below-floor keys.
+ Next helper slice.
+ | Check | Command | Result |
+ |---|---|---|
+ | task refuses non-BAR / zero caps; round robin bounded per tick | `cargo test -p qdl-projector --lib` | 17/17 |
+ | 301 rows incl. in-progress-only, in-progress->final, revised, conflict and stale-revision extras: plan at cap 100 = floor 201 min, 404 keys = every written fact key below the floor + `p` keys, no duplicate; after stage B rows 100, `rk` only the kept open, late fact below floor refused, next plan none; slack 216 rows none / 217 rows floor at open 117; lower floor refused, log unchanged; bounded steps (60) -> 60/120/180/201 min, union = unbounded plan, second tick `pending`; 3 products (over, under, no pointer) 2 per tick; undecodable row -> Integrity, nothing planned | `expiry_redis` | 5/5 |
+ | real Kafka: 250 bars built by stage B, plan published via `BaseProducer`: exactly 300 tombstones then the floor frame on the product partition, stage B -> 100 rows; injected send failure aborted, fenced producer refused, only the newer committed publish visible | `expiry_kafka` | 2/2 |
+ | whole ignored projector set (stage A Kafka 4, cache 5+1, stage B 7+1, expiry 5+2), fmt, clippy `-D warnings` | staged content, disposable `kn3-lead-*` Kafka + 2 Redis | green 3 rounds in a row |
+ - Not covered yet: non-1m/calendar intervals and the `ThreadedProducer`
+ sink run (assigned with the cleaner slice); wiring into the projector role
+ loop (binary not built yet).
+- 2026-09-24: **KN-3 design decision D17 (corrects D10, recorded before
+ code).** D10's dual write ("rules are order-independent") is wrong: the
+ BAR rule keeps the **first** of two equal-revision facts (CONFLICT), so a
+ staging generation that receives new live records before the replayed old
+ ones would keep the later fact while the ready generation keeps the earlier
+ one - the two generations diverge. Corrected protocol: live stage B writes
+ only the **ready** generation of a product (staging only for a product not
+ yet ready); the per-product rebuild runs **inside the partition owner**,
+ interleaved with its batches on the same thread: allocate `G`, stage it
+ (a stale staging generation is reclaimed), and a second reader (assign
+ mode, outside the group, `read_committed`) replays the partition from its
+ earliest offset in log order, applying only that product's records into `G`
+ with the owner fence (the partition checkpoint is left where the live path
+ put it). When the reader's position reaches the live checkpoint, `G` holds
+ exactly the records `ready` applied, in the same order; BAR row counts are
+ verified against the bucket contents, then `ready = G, fence + 1` is
+ CAS-published and the old generation reclaimed in the same step - no live
+ record can interleave. One rebuild at a time (queue); losing the partition
+ abandons it and reclaims `G`; a product that is not READY is refused (a
+ cold build covers it).
+- 2026-09-24: **KN-3 slice 7 - per-product rebuild (D17), latest tombstone
+ ordering fix, bars-topic cleaner (K3.5/K3.7): implemented, tested locally +
+ isolated Kafka and Redis.** Claude: `stage_b.rs` (rebuild queue, replay,
+ verify, publish/abandon; `PartitionReader`), `cache.rs` (`targets()` = ready
+ or first staging; `bar_row_count`), `kafka_state.rs` (one
+ `KafkaPartitionReader` for rebuild and cleaner). Helper-built,
+ Claude-reviewed and re-run: `cleaner.rs` (`sweep_partition`,
+ `parse_bars_key`, `CleanerKafkaSettings`), `tests/cleaner_kafka.rs`, and
+ expiry coverage (1d/1w grid, `1M` refused, `ThreadedProducer` sink).
+ - **Defect found and fixed (live path, not only rebuild):** a latest
+ tombstone was queued after the batch's writes, so `set, delete, set` of
+ one product inside one batch ended deleted. The tombstone now collapses
+ in log order within the entry's group (write, then delete, then write
+ keeps the last write; a trailing delete deletes). Regression test added.
+ - Cleaner decisions (helper, reviewed): two read passes over one captured
+ `[earliest, end)` (memory = floors + below-floor keys; pass 2 skipped
+ without floors); a pass that does not reach the end within its deadline
+ (an open transaction holds the stable offset) is `Incomplete` and
+ publishes nothing; a floor tombstone means "no floor" (that product is not
+ touched); tombstones go out in key order, so a capped sweep continues
+ without repeats; a failed chunk is aborted and stops the sweep (earlier
+ chunks are idempotent). Reader ids: the cleaner uses its transactional
+ id as client/group id; a reader only `assign()`s at explicit offsets and
+ never commits, so it never joins or fetches a group - whether the
+ production ACL needs any group grant for that is **unverified** until the
+ production packet.
+ | Check | Command | Result |
+ |---|---|---|
+ | key parsing (valid + 9 invalid shapes), cleaner id under `kn-projector-v3-`, expiry task bounds, stage A, products, cache | `cargo test -p qdl-projector --lib` | 19/19 |
+ | D17: damaged ready row repaired; live new open and a live conflicting fact arriving during the replay -> the first fact kept, both later facts recorded as conflicts; `ready = G, fence + 1`, old generation reclaimed, other products untouched, tailing continues; latest rebuild across a delete; refused requests (no holder, no reader); revocation abandons and reclaims `G`, ready untouched; tombstone order in one batch | `stage_b_redis` | 11/11 |
+ | real Kafka: rebuild through the second reader with live commits during the replay and an aborted conflicting fact -> 121 rows, first fact kept, aborted never applied | `stage_b_kafka` | 2/2 |
+ | real Kafka: orphans from the plan->floor race and from a late fact below the floor tombstoned exactly (2 of 22 below-floor keys), second sweep 0, other partition/above-floor keys untouched; bad floor/key -> Integrity, 0 published; cap 2 -> (2,2,3),(2,2,1),(1,1,0),(0,0,0); aborted sweep invisible | `cleaner_kafka` | 4/4 |
+ | 1d (16:00 UTC grid) and 1w (Monday) bars expire on the venue grid, bucket bound kept, `1M` refused; `ThreadedProducer` publish read back | `expiry_redis`, `expiry_kafka` | 6/6, 2/2 |
+ | whole ignored projector set + fmt + clippy `-D warnings` | staged content, disposable `kn3-lead-*` Kafka + 2 Redis | green 3 rounds in a row |
+- 2026-09-24: **KN-3 slice 8 - K3.6 legacy BAR import and BAR-edge readback
+ (D16): implemented, tested locally + isolated Kafka and Redis (production
+ import NOT run).** Helper-built, Claude-reviewed and re-run:
+ `scripts/kn_bar_legacy_import.py`, `qdl/runtime/kn_bar_readback.py`,
+ `tests/test_kn_bar_legacy_import.py`, `tests/test_kn_bar_readback.py`;
+ `qdl/runtime/stable_bar_edge.py` selects the backend
+ (`QDL_STABLE_BAR_READBACK=sqlite|kn3`, default `sqlite`: the SQLite path's
+ code and behavior unchanged).
+ - Decisions: a product that is not READY (no pointer, or staging only)
+ makes the readback raise `KnBarReadbackNotReady`, never an empty set (an
+ empty set would re-publish history; parity with the SQLite path raising
+ on an unreadable cache, the edge loop backs off); identity per product
+ `kn3::@`, edge-wide = first 32 hex of SHA-256 over the
+ sorted identities of its BAR bindings (one pipeline) - checkpoint v4 and
+ the rebase logic unchanged, so a cold build or a per-product rebuild
+ rebases the whole edge (a bounded provider re-bootstrap that fills only
+ missing opens; per-binding rebase left for KN-5 if measured necessary);
+ import transactional id `kn-projector-v3-legacy-import-<16 hex>` over
+ environment, topic, partitions, epoch, catalog revision and spool
+ `cache_id` (bootstrap excluded, so a rerun fences a crashed run); the
+ `--confirm` token `IMPORT_QDL_KN3_LEGACY_BARS_<16>` is sealed over the
+ plan; spool pages forced through the primary key (`INDEXED BY` the `pk`
+ autoindex, EXPLAIN QUERY PLAN `SEARCH ... (stream=? AND partition_key=?
+ AND logical_offset>? AND logical_offset)`, no scan/sort/
+ `accepted_at_ns`); refusals (payload hash, not an envelope, identity,
+ event id, codec refusal) name binding + logical offset, and bindings
+ committed before a refusal stay (rerun idempotent); `--isolated` refuses
+ TLS, `kafka1..3` and the production project, the bars topic never equals
+ the canonical topic, topics are never created. The receipt has no
+ timestamps (deterministic export): per binding rows/finals/in-progress,
+ first/last open, spool first/cutoff offset, state partition,
+ `facts_sha256` over sorted `open|revision|content_sha256`, key-set
+ count+hash; canonical earliest/latest offsets per partition captured
+ before publishing (import mode only).
+ | Check | Command | Result |
+ |---|---|---|
+ | import: 144 BAR bindings exported from a fixture spool of the 15 real golden BARs (47 rows), LEGACY_BAR frames with original event id/hash and spool lineage, deterministic receipt (page 1 vs 1000), read-only spool (DELETE fails, file hash unchanged), plan assertion, refusals, LPK = gateway bundle, real 114-record sample 84/84 BARs; Kafka: 30 transactions / 47 frames read back committed, facts hash = receipt, cutoff = watermarks, rerun identical keys and bytes. readback: FINAL/REVISED only, one HMGET per asked bucket, legacy and canonical rows, not-ready raises, identity mismatch fails closed, generation change during read raises, SQLite vs market cache parity through the real edge, real Redis 130/142 covered | `python -B -m unittest tests.test_kn_bar_legacy_import tests.test_kn_bar_readback` with isolated Kafka/Redis + sample | 23/23, 3 rounds |
+ | existing BAR edge suites (10 modules) + `test_kn_products`, `test_kn_state_codec`, `test_kn_gateway_bundle` | same image, no services | 212 OK (1 skipped: optional sample input) |
+ - Open: readback against rows written by the Rust stage B (not by the
+ Python fixture) and the import applied by stage B - both in the K3-T08
+ full-flow run.
+- 2026-09-24: **D15 amendment (defect in D15 found against the budget).**
+ The KN-1 reviewed budget sizes the market cache with "demanded rows + 2,064
+ headroom per product" (`config/v2/kn-v220-candidate-budget.json`
+ `market_cache.sizing`, 141 demanded products, 1,691,524 rows at cap);
+ D15's `max(10,000, demand) + 2,064` gave undemanded products 12,064 rows
+ and exceeded that sizing. Corrected: cap = largest `max_warmup_rows` of a
+ manifest requiring the product (0 without demand) + 2,064. Real bundle
+ (`e8aa9c95...36fb`): 140 products 12,064, 1 product 4,064 (demand 2,000),
+ 3 undemanded 2,064 = 1,699,216 rows (+7,692 vs the budget figure, the
+ undemanded ones being materialized for parity with the running projector,
+ about 5 MB at 707 B/row). Unit test updated (2,000/10,000 -> 12,064;
+ 25,000 -> 27,064; none -> 2,064).
+- 2026-09-24: **KN-3 slice 9 - `qdl-projector` binary (D1): implemented,
+ smoke-run in the runtime image; runtime evidence = the K3-T08 packet
+ below.** `rust/qdl-projector/src/main.rs` (`qdl-projector run`, environment
+ only): threads for stage A (group `kn-projector-v3-a`, transactional id
+ `kn-projector-v3-a-`), stage B (group `kn-projector-v3-b`, rebuild
+ reader `kn-projector-v3-rebuild-`, rebuild requests from the cache
+ set `kn3::rebuild` taken only for products this replica owns), expiry
+ (`kn-projector-v3-expiry-`, only BAR products of the bars
+ partitions this replica owns, caps per D15) and the cleaner (same
+ partitions, default every 6 h); status JSON file + one stdout line per
+ interval. State-topic partition counts are read from the broker. An
+ integrity stop or fatal Kafka error exits 2 (fail closed, restart resumes at
+ the same committed offset and stops again - never skips); cache memory
+ pressure backs off with the checkpoint behind (D12).
+ `QDL_KN_BAR_CAP_CLAMP` lowers caps for isolated evidence runs only; a
+ production packet never sets it. Release binary 6,395,224 B, SHA-256
+ `507d2b64...1650` (before this journal edit; rebuilt for the run), runs in
+ the existing `qdl-v2-rust:2.0.26-62241bc` (no image built).
+- 2026-09-24: **K3-T08 / K3-T07 / K3.7 isolated full-flow runtime packet
+ (recorded before running).** Scope: disposable services only; production
+ is read, never written.
+ - Reads of production: the canonical cache spool through the volume
+ `qdl_v2_stable_candidate_stable_state` mounted **read-only** at `/state`
+ (`mode=ro`, `query_only`, primary-key index only) by
+ `kn_native_slice_probe.py capture` (demanded keys, real committed records,
+ bytes unmodified) and `kn_bar_legacy_import.py import --isolated`; nothing
+ else of the running stack is touched (no exec, no restart, no Kafka or
+ Redis access).
+ - Services (prefix `kn3-flow-`, `--rm`, internal network `kn3-flow-net`):
+ Kafka `apache/kafka@sha256:9516fb76...` KRaft single node 1 CPU / 1.5 GiB,
+ topics `md.canonical.v2` (6 partitions, delete), `md.latest.v2` and
+ `md.bars.v2` (6 partitions, compact, `delete.retention.ms` 604800000, bars
+ `min.compaction.lag.ms` 3600000; RF 1 isolated); market cache
+ `redis@sha256:dfa18828...` with the D6 config (`maxmemory` 1288490188,
+ noeviction, listpack 128/2048, no persistence), 0.5 CPU / 1,536 MiB;
+ projector replicas `kn3-flow-proj-a/-b`: `qdl-v2-rust:2.0.26-62241bc` +
+ the release binary and the compiled bundle mounted read-only, 0.5 CPU /
+ 256 MiB each; loaders/checkers in `qdl-v2-python:2.1.1-83fa1bc` (repo
+ read-only). Peak ~3.5 GiB RAM / ~3 CPU for the window (host 14 GiB
+ available); nothing persists after cleanup.
+ - Steps: (1) capture demanded keys and load the history into the isolated
+ canonical topic; (2) legacy import of every BAR binding into the isolated
+ `md.bars.v2`; (3) start both replicas (cold build) - stage A lag,
+ throughput, state-topic bytes, cache memory, build time; (4) live phase at
+ the 3,000/s challenge with aborted copies of every 5th batch; (5) parity:
+ `kn3_flow_check.py bars` (spool vs cache, readback on Rust-written rows),
+ `latest` (Kafka oracle vs cache), `ready`; (6) expiry + cleaner under
+ `QDL_KN_BAR_CAP_CLAMP=4000` - convergence time, tombstones, cleaner sweep,
+ memory/disk slope, `bars --floor-aware` parity; (7) recovery: SIGKILL of
+ replica A (takeover by B, no rebuild), market cache restart empty (cold
+ rebuild from the state topics -> all products READY = measured RTO),
+ one per-product rebuild request.
+ - Rollback: stop and remove the `kn3-flow-*` containers; production state
+ unchanged by construction. Cleanup: containers, network, anonymous
+ volumes 0; capture and import receipts hashed into the evidence dir
+ `/home/bobby/.local/state/qdl-v2/kn3-20260924/evidence`, raw capture
+ deleted; results appended here.
+- 2026-09-24: **KN-3 slice 10 - K3-T08 / K3-T07 / K3.7 isolated full-flow run
+ on real data: executed per the packet above; three defects found by the run
+ and fixed; findings that need owner decisions.** Evidence
+ `/home/bobby/.local/state/qdl-v2/kn3-20260924/evidence` (`SHA256SUMS`
+ `605476a2...0513`); binary rebuilt from this commit's source for each fix
+ (last `bf689be9...1f97`); production containers identical before/after;
+ production touched only by read-only spool reads.
+ - Data: real canonical capture 184,945 records / 190 demanded keys (247 MB,
+ `98b11223...3ec4`, 44 s, spool `mode=ro`); history 110,986 loaded
+ without filler (new `kn_native_slice_probe.py load --no-filler`: offset 0
+ is data after KN-2 R2; the filler record stopped stage A with
+ `PRODUCT_NOT_IN_BUNDLE`, i.e. fail closed as designed); legacy import of
+ all 144 BAR bindings, 140 with rows, 938,061 frames in 426 s, receipt
+ `14314c13...59f4` (PASS).
+ - Cold build (2 replicas, empty cache): stage A 110,986 records in ~30 s;
+ stage B 951,061 BAR applies + 73,815 duplicates recognised; 206 products
+ READY in 162 s. The 10 NOT_READY products have 0 source records (4 DNSE on
+ V1 by owner decision, 6 spot BTCUSDT without data) - typed NOT_READY, no
+ default. Live challenge 3,000/s for 60 s: 180,087 committed + 35,645
+ aborted; stage A received exactly 291,073 = history + live committed;
+ stage A lag 6 after 15 s; 0 conflicts / stale / zombies / CAS retries.
+ - Parity (K3-T07, new `scripts/kn3_flow_check.py`, helper-built,
+ Claude-reviewed and run): `latest` 66/66 equal to the Kafka oracle (also
+ after the full rebuild, 303,083 canonical records); `bars` with
+ `--import-receipt`: 937,255/937,255 spool finals covered and **byte-equal**
+ (SHA-256 of the canonical envelope), 0 missing, 0 differs, readback over
+ Rust-written rows equal for every product (806 rows trimmed and 1,000
+ appended by the live spool since the import, accounted separately);
+ after expiry `bars --floor-aware`: 417,605/417,605 equal, 519,439 below
+ the floor, 0 missing/differs. `ready`: 206 READY, 10 ABSENT (no source).
+ - Recovery (K3.7): SIGKILL of replica A -> B owned all 12 partitions after
+ 51.7 s (Kafka session timeout 45 s dominates), no rebuild, lag 6;
+ cold start on an empty cache with group offsets at the partition ends ->
+ 206 READY in 179 s; cache wiped while running -> both replicas
+ reconnected and rebuilt, 206 READY in 146.8 s (first products 7 s);
+ per-product rebuild via `SADD kn3::rebuild` -> published in 19.5 s
+ (5 s request poll included, 4,000 rows) by the owning replica only; a
+ request for a product nobody holds stays pending (not dropped).
+ - Expiry/cleaner (K3.5) under `QDL_KN_BAR_CAP_CLAMP=4000`: every product at
+ cap in 121 s; 938,061 -> 417,861 rows, cache 763 -> 341 MB; 520,456 opens
+ expired, 580 floors, 1,040,912 tombstones; cleaner 10 sweeps, 0 orphans
+ (none created in this run). Latest reads while expiring 188,585 more opens
+ (clamp 2,000): p50 0.434 / p95 0.631 / p99 1.097 / max 7.744 ms vs idle
+ p50 0.432 / p99 1.217 ms, 0 errors; Redis SLOWLOG 0 commands > 5 ms.
+ - Resources (whole run, `docker stats` 5 s): projector max 173 MiB of 256,
+ CPU p95 0.34-0.39 (0.5 cap, saturated only during cold build: cold build
+ is CPU-bound); market cache max 685 MiB; broker max 737 MiB. At 3,000/s
+ the two replicas together used ~0.38 CPU (budget 0.3 unverified); state
+ topic bytes: bars 1.31 GB after import + duplicates, 1.41 GB after
+ expiry tombstones, **546 MB after compaction once segments rolled**.
+ - **Defects found and fixed (each with a regression test):**
+ (1) an owner that stopped in the middle of a cold build left staged, never
+ published products while its checkpoint looked fresh -> the next owner
+ tailed and those products stayed NOT_READY; now a registry product with
+ staging and no ready forces a rebuild (`stage_b_redis`
+ `an_interrupted_cold_build_is_built_again_by_the_next_owner`).
+ (2) cache outage: one sync Redis connection never reconnected, and an
+ idle owner never noticed a wiped cache (0 READY for > 10 min); now
+ `Cache::reconnect` + `StageB::recover_cache` on a Redis error, 10 s I/O
+ timeouts, a periodic owner-fence probe (5 s) that rebuilds a partition
+ whose owner key vanished, and a partition fenced by a newer owner is left
+ alone for 60 s instead of being taken back (no ping-pong)
+ (3 `stage_b_redis` tests). (3) a cold build seeked to the partition start
+ raced librdkafka's asynchronous committed-offset fetch; the committed
+ offset (the partition end, from informational commits) won and the build
+ "finished" without reading (49 products never READY); the stage B source
+ now uses the group consumer only for ownership (partitions paused) and an
+ assign-mode data consumer started at explicit offsets,
+ `auto.offset.reset=error` (`stage_b_kafka`
+ `a_wiped_cache_is_built_from_the_start_even_with_group_offsets_at_the_end`
+ passes; it could not force the race timing - the flow rerun of the exact
+ failing condition is the proof: 206/206 READY).
+ - **Findings needing owner decisions before the production packet:**
+ (a) **market-cache memory**: real rows cost 824 B/row (Binance 836, OKX
+ 786; all listpack; value mean 690-708 B) vs the budget's 707 B/row (OKX
+ DOGE 1m only); at the D15 cap (1,699,216 rows) that is ~1.40 GB >
+ `maxmemory` 1.288 GB. One-variable sweep on 280,762 real rows
+ (`bucket-size-sweep.txt`): 116 -> 816.9, 112 -> 743.1, 108 -> 759.0,
+ 104 -> 788.2, 88 -> 745.5 B/row (allocator size classes; 112 leaves ~1%
+ margin before the next class). Even at 112, the cap needs ~1.26 GB of
+ rows alone. Options: bucket 112 + `maxmemory` ~1.5 GB (container 1.75
+ GiB), or lower headroom - **owner decision (RAM)**; no setting changed.
+ (b) **state-topic segments**: the active segment is never compacted; with
+ the default `segment.ms` 7 d / `segment.bytes` 1 GiB each partition can
+ hold up to 1 GiB of superseded facts and tombstones. Proposed for the K3.1
+ packet/budget: `segment.ms` 3,600,000 (= `min.compaction.lag.ms`) and
+ `segment.bytes` 134,217,728 for `md.bars.v2`/`md.latest.v2` - budget
+ change for owner/Astra; the packet is unchanged. (c) failover time is the
+ group session timeout (45 s default); lowering it is a later one-variable
+ tuning. (d) cleaner cost: ~560 MB read per replica sweep at this data size
+ (2 passes) - fine at the 6 h default.
+ - Cleanup: 0 `kn3-*` containers/networks; 17 empty anonymous volumes left
+ by `docker rm -f` of this session's disposable containers removed by
+ name (named volumes untouched); raw capture deleted after hashing; kept:
+ evidence 896 KB + run dir (binary, bundle, check receipts) to the KN-3
+ review.
+
+
+**KN-3 receipt for Astra (guide 18.14), 2026-09-24.**
+
+```text
+Phase / status / source SHA / affected files and line counts:
+ KN-3 / IMPLEMENTED_PENDING_ASTRA_REVIEW / feat/consumer-endpoint-benchmark,
+ slices 0b6cea6 916883c 65443fa e3d3746 a413c41 1abf811 ed0275f 0fa25bd
+ 1f9e220 bc397e7 (+ this journal commit); 45 files +19,041/-344 incl. plan.
+ rust/qdl-projector src: stage_b 1367, expiry 823, cache 810, products 613,
+ main 609, cleaner 447, stage_a 429, kafka_state 317, apply.lua 252,
+ kafka_pipe 229; tests stage_b_redis 1011, expiry_redis 828, cleaner_kafka
+ 605, stage_b_kafka 465, cache_redis 428, expiry_kafka 394, stage_a_kafka
+ 374, cache_redis_memory 107. qdl-contracts state_codec 1513, gateway_bundle
+ 288 (moved), interval 60 (moved). Python: kn_state_codec 611,
+ kn_bar_readback 278, stable_bar_edge (+53/-8, default path unchanged);
+ scripts kn_state_topics_packet 756, kn_state_codec_golden 691,
+ kn_bar_legacy_import 621, kn3_flow_check 756, kn_native_slice_probe
+ (--no-filler); tests 2,394 lines in 6 files; golden state_codec.json.
+Approved scope and actual work items completed:
+ K3.1-K3.7 per guide 18.10 with decisions D1-D17; D10 superseded by D17
+ (no dual write), D11 amended (bars-topic cleaner), D15 amended (budget cap
+ rule). Production packet (topics/ACL/market cache/projector role) not run.
+Domain invariants and behavior changed/preserved:
+ Canonical bytes carried unchanged (no timestamp rewrite); source and
+ changelog coordinates separate; BAR CONFLICT keeps the first fact (never
+ last-write-wins); offsets only move with applied data (stage A: Kafka
+ transaction with offsets; stage B: Lua script with checkpoint); a record
+ that cannot be interpreted stops the stage (never skipped); missing
+ products are typed NOT_READY; legacy rows carry lineage, never a canonical
+ offset; the running projector/Query/edge and control Redis untouched.
+Tests: command, cases, pass/fail/skip, isolated/real-provider, evidence hash/path:
+ cargo test --workspace 293/0 (43 ignored); qdl-projector --ignored 40/40
+ x3 rounds on disposable Kafka + 2 Redis; Python KN suites 110 OK (3
+ optional-input skips); full flow on a real canonical capture + legacy
+ import (not live): BAR parity 937,255/937,255 byte-equal, latest 66/66,
+ floor-aware 417,605/417,605; evidence
+ /home/bobby/.local/state/qdl-v2/kn3-20260924/evidence SHA256SUMS 605476a2...
+New failures -> root cause -> fix -> regression evidence:
+ D10 dual write diverges under keep-first CONFLICT -> D17 replay in the
+ owner; latest tombstone applied after the batch's writes -> log-order
+ collapse; interrupted cold build left staged products NOT_READY -> staged-
+ only product forces rebuild; no Redis reconnect / idle owner blind to a
+ wiped cache -> reconnect, owner-fence probe, fenced backoff; seek raced the
+ committed-offset fetch -> explicit-offset data consumer; D15 above the
+ budget -> budget rule; KN-2 filler at offset 0 -> --no-filler. Tests named
+ in the slice receipts.
+Runtime: exact mutations or NONE; active/config/rollback map:
+ Production NONE (read-only spool reads only). Isolated kn3-flow-* /
+ kn3-lead-* / helper containers only, all removed.
+Resources: latency/capacity/memory/disk measured vs budget; untested limits:
+ cold build 206 products in 162-179 s at 0.5 CPU per replica (CPU-bound);
+ 3,000/s challenge ~0.38 CPU for two replicas (budget 0.3 unverified);
+ projector RSS max 173 MiB; latest reads p99 1.1 ms during expiry, SLOWLOG
+ 0 > 5 ms; cache 824 B/row real vs 707 budget -> cap does not fit 1.288 GB;
+ bars topic compacts 1.41 GB -> 546 MB once segments roll. Untested: live
+ production traffic, soak, production broker ACLs/TLS, failover tuning.
+Cleanup: removed/retained artifacts, reason/expiry, disk/restart evidence:
+ containers/networks 0, 17 empty anonymous volumes removed, capture deleted
+ after hashing; kept evidence 896 KB + run dir to KN-3 review; target/ build
+ cache kept (KN-5). Free disk 150 GB. No production restart.
+Remaining decision gates, not relabelled implementation gaps:
+ Owner: (1) projector principal (new CA / mesh rotation before 2026-11-20 vs
+ phase8-consumer); (2) market-cache memory at cap (bucket 112 + maxmemory
+ ~1.5 GB vs lower headroom); (3) state-topic segment.ms/segment.bytes in the
+ budget/packet; then the production packet (topics, ACL, market cache,
+ projector role, legacy import --confirm) as its own approved step.
+ KN-4: Query/ReadView on the market cache; KN-5: readback cutover.
+Astra requested review points and next allowed step:
+ apply.lua CAS/fence/checkpoint atomicity; D17 rebuild interleaving; stage B
+ source (paused group + explicit-offset data consumer); expiry/cleaner key
+ completeness; legacy import provenance and receipt; parity checker
+ judgement; sizing finding. Next: KN-4 after KN-2/KN-3 reviewed exits.
+```
+
+
+#### KN-3 Astra Review R1 - Recovery Branches Before PASS
+
+- 2026-09-24: **REVIEW_CHANGES_REQUIRED** at `c65d72e` (source flow review,
+ 37/37 evidence hashes verified, no fault injection by the reviewer).
+ Direction accepted (two-stage Rust projector, Kafka as durable state,
+ separate market cache, canonical bytes/lineage/revision rules kept); the
+ gaps are specific failure branches, not a rewrite. Fixes stay inside KN-3.
+ - **R1-F1 [P1] memory pressure skips an unapplied batch.** Stage B has
+ already taken the batch from Kafka; on `MemoryPressure` the loop slept and
+ read on, so a later batch could move the checkpoint past unapplied
+ records, and a build could be declared finished from the consumer
+ position. Regression: OOM between two batches, memory freed, continue
+ without restart - no lost record, checkpoint never ahead of the data, no
+ early READY (normal and build mode).
+ - **R1-F2 [P1] BAR rows and a retention floor in one batch leave buckets.**
+ The buckets to delete came from the cache before the batch while the
+ batch's rows are written before the floor; buckets created by the same
+ batch below the floor were not deleted and `first` jumped to the floor, so
+ reclaim could never find them. Regression: one batch with many buckets and
+ a floor (fresh and existing generation), rows, physical keys, late repair.
+ - **R1-F3 [P1] generation leak on recovery.** A new staging generation
+ replaced an interrupted one without reclaiming it; publish and reclaim
+ were two steps, so a crash between them lost the generation to reclaim.
+ Regression: crash at both windows, restart repeatedly - READY correct,
+ key count/RAM not accumulating; resumable retirement, no new service.
+ - **R1-F4 [P1, contract section 5] full rebuild memory.** The stale-
+ checkpoint branch built a whole partition beside the old generations
+ (peak up to two caches); the contract wants product swaps, one product in
+ staging at a time, peak = steady + two largest products. Regression:
+ cache near full, checkpoint expired, old copy present - measure the peak,
+ reclaim before the next staging.
+ - Owner decisions relayed in the review: (1) Kafka identity - a dedicated
+ projector principal, not the shared `phase8-consumer`; the transition
+ adds a new client CA to the truststore beside the old one and issues the
+ projector certificate (broker config and rollout to be verified in the
+ production packet; not packet-ready here). (2) RAM - bucket 112 and a
+ higher cap after the recovery fixes: candidate `maxmemory`
+ 1,500,000,000 B, container 1.75 GiB, confirmed only by a full-cap
+ measurement (staging, metadata, RSS); bucket 112 changed together in the
+ Rust writer, Python readback, checker, budget and tests. (3) Segments -
+ `segment.ms` 3,600,000 and `segment.bytes` 134,217,728 on the two state
+ topics only (budget, packet allowlist, verifier, tests); cleaner lag and
+ disk still measured. CPU: 0.38 measured at the 3,000/s challenge, so the
+ 0.3 allocation is no longer treated as met - the budget is updated to the
+ measurement.
+- 2026-09-24: **Design decisions D18-D21 for R1 (recorded before code).**
+ - D18 (F1) An apply failure of a batch (cache error, memory pressure, CAS
+ exhaustion) seeks every partition of that batch back to its applied
+ checkpoint before the error is returned, so the same records are read
+ again; a build finishes only from positions of applied data. A rebuild
+ replay that fails is abandoned (staging retired) and stays queued.
+ - D19 (F2) Floor operations are built after all rows of the batch: the
+ bucket range starts at the lowest open the batch itself writes for that
+ product/generation when it is below the cached `first`.
+ - D20 (F3) Retirement is recorded atomically: the Lua stage / publish /
+ unpublish ops add every superseded generation of the product to the set
+ `kn3::retire` (`|`) in the same script; the owner
+ reclaims and removes the member afterwards, and every replica resumes
+ pending members (bounded per step; a member that is a live ready/staging
+ generation is dropped without reclaim).
+ - D21 (F4) A partition is built as a whole only when none of its products
+ has a ready generation (empty cache: peak = the new data). Otherwise - a
+ checkpoint beyond the horizon or below the earliest offset, a missing
+ checkpoint with ready products, or products left staged by an
+ interrupted build - the partition tails from `max(checkpoint, earliest)`
+ and every such product is rebuilt with the D17 replay, one product in
+ staging per replica (two replicas = two largest products), the next
+ staging only after the previous generation is reclaimed. The obligations
+ are kept in the rebuild request set (`kn3::rebuild`) and removed
+ only when the product is published, so a restart resumes them; a product
+ without a ready generation that is queued is not written by the live
+ path (the replay builds it, no dual write).
+- 2026-09-24: **R1 isolated flow runtime packet (recorded before running).**
+ Same scope, services and production read-only boundary as the K3-T08
+ packet above, with: market cache candidate `maxmemory` 1,500,000,000 B in a
+ 1.75 GiB container (bucket 112 build), state topics with `segment.ms`
+ 3,600,000 / `segment.bytes` 134,217,728, the R1 projector binary. Steps: (1)
+ capture + history load (`--no-filler`) and legacy import as before; (2)
+ **synthetic fill to the D15 cap** - for every BAR product below its cap,
+ copies of its own imported rows re-timed to earlier opens (same bytes except
+ times/event id, `LEGACY_BAR` lineage stream `kn3-synthetic-fill`), so the
+ cache holds 1,699,216 rows of real row sizes (labelled synthetic in every
+ receipt; never parity evidence); (3) cold build at full cap - time, Redis
+ `used_memory`, container RSS, CPU; (4) 3,000/s challenge - CPU per replica;
+ (5) **warm rebuild at full cap**: every checkpoint made older than the
+ horizon, both replicas restarted - rolling per-product rebuild duration,
+ peak `used_memory` and RSS vs steady + two largest products, no memory
+ pressure, products READY throughout; SIGKILL of one replica during it and
+ resume; (6) parity (`ready`, `latest`, `bars --import-receipt`) and key /
+ generation accounting (no generation other than ready); (7) bars-topic
+ bytes and cleaner lag with the segment settings. Cleanup as before
+ (`docker stop` so anonymous volumes go; exact `kn3-flow-*` scope).
+- 2026-09-24: **KN-3 slice 11 - Astra R1 F1-F4 fixed (D18-D21), bucket 112,
+ segment settings, measured sizing: implemented, tested locally + isolated
+ Kafka/Redis + isolated full flow at cap.**
+ - Source: `rust/qdl-projector/src/stage_b.rs` (D18 rewind, D19 floor ops
+ after rows, D20 retirement processing, D21 rolling per-product rebuild,
+ obligations, key filter before decode, zero-record product unpublished),
+ `apply.lua` (S/P/U ops retire the superseded generation in the same
+ script), `cache.rs` (`BUCKET_OPENS` 112, retire / rebuild-request /
+ lazyfree helpers), `main.rs` (request taking moved into stage B; probe
+ cadence = `QDL_KN_REBUILD_POLL_S`; status fields). Tests: new
+ `tests/common/mod.rs` (shared log/source/reader fixtures; the in-memory
+ log now keeps the high watermark across compaction, as Kafka does),
+ `tests/stage_b_memory.rs`, `tests/recovery_kafka.rs`, R1 cases in
+ `tests/stage_b_redis.rs`, horizon test rewritten for D21, expiry slack
+ test on `BUCKET_OPENS`. Helper-built, Claude-reviewed and re-run:
+ `config/v2/kn-v220-candidate-budget.json` (segments, bucket 112 real-mix
+ sweep, CPU `projector_total` 0.4 measured / 0.5 per replica, sum 4.7 <=
+ 5.0), `scripts/kn_state_topics_packet.py` + tests (segment settings
+ created, required and verified; config allowlist; old-config topic =
+ verify FAIL / apply HARD_STOP), `qdl/runtime/kn_bar_readback.py` +
+ tests (112; readback constant tied to `cache.rs`), `tests/
+ test_kn3_flow_check.py`, `tests/test_kn_v220_budget.py`. Claude:
+ budget `sizing_measured_kn3_r1` (below) + its test.
+ - Regressions (each **fails on the old source `c65d72e`** - run on a
+ separate target directory - and passes now):
+ | Finding | Test | Old source | Now |
+ |---|---|---|---|
+ | F1 tailing | `stage_b_memory::r1_f1_memory_pressure_between_batches_loses_nothing_while_tailing` (OOM between batches, freed, same stage continues: rows = checkpoint at every refusal, then 1,550/1,550) | checkpoint ran to the end with rows missing | pass |
+ | F1 build | `stage_b_memory::r1_f1_memory_pressure_during_a_cold_build_never_publishes_early` | product READY before its rows were applied | pass |
+ | F2 | `stage_b_redis::r1_f2_a_floor_in_the_batch_of_its_rows_leaves_no_bucket_below_it` (fresh and existing generation, one batch: rows 20, no bucket below the boundary, meta rows = bucket rows, `rk` above the floor, late repair not kept, reclaim leaves no key) | 252 rows kept | pass |
+ | F3 | `stage_b_redis::r1_f3_interrupted_builds_and_swaps_leave_no_generation_behind` (5 interrupted builds, then a replaced staging + a publish without reclaim, resumed by the next owner) | generations {1,3,5,7,9} leaked | pass |
+ | F4 | `stage_b_memory::r1_f4_a_rolling_rebuild_of_a_near_full_cache_stays_within_two_products` (cap = steady + 2 products; 6 products x 2,000 rows) | several products staged at once | pass: peak = steady + 1.16 products |
+ | combined | `recovery_kafka::r1_memory_pressure_crashes_and_a_rolling_rebuild_converge_to_the_log` (real Kafka: OOM while tailing + crash, horizon rolling rebuild + crash, third owner resumes; all rows, one generation per product, no retirement/request left) | - | pass |
+ - Test totals (working tree): workspace 293 passed / 0 failed / 49
+ ignored; all ignored `qdl-projector` tests 46/46 on disposable Kafka + 2
+ Redis; KN Python suites 121 OK offline (6 service cases skipped offline,
+ run with services by the helper: 47 OK x 2 rounds, packet broker
+ integration 28 OK x 2 rounds). Staged content (exact commit tree):
+ fmt + clippy `-D warnings` clean; workspace 293/0/49; ignored
+ `qdl-projector` 46/46 x 3 rounds (disposable Kafka + 2 Redis); KN Python
+ suites with Kafka/Redis 2 rounds OK (1 skip: the packet's authorizer-
+ broker integration, run by the helper as above); BAR-edge suites (8
+ modules) OK.
+ - **R1 isolated flow (packet above), evidence
+ `/home/bobby/.local/state/qdl-v2/kn3-20260924-r1/evidence` `SHA256SUMS`
+ `c8f2fde4...d88b`**, binary `3b3c2d35...cbaf`, production read only via the
+ read-only spool (container set identical before/after):
+ - Data: capture 185,653 real records / 190 keys; history 111,409;
+ legacy import 938,667 rows (receipt `ee774852...147d`, PASS); synthetic
+ fill 599,143 rows -> 1,537,810 BAR rows (90.5 % of the 1,699,216-row
+ cap; long intervals stop at 1970).
+ - Cold build at that size, bucket 112, `maxmemory` 1.5e9 / 1.75 GiB:
+ 206 products READY in 244 s; `used_memory` 1,162,574,104 B (756.0
+ B/row all structures), RSS 1,154 MB, fragmentation 0.98; one replica
+ CPU-bound at 0.5, the cache at 0.436 of its 0.5.
+ - 3,000/s challenge: 180,061 committed + 35,969 aborted; stage A lag 6;
+ projectors 0.347 vCPU together (0.130 + 0.217).
+ - **Warm rebuild at cap** (every checkpoint beyond the horizon, both
+ replicas restarted, replica b SIGKILLed at 90 s and restarted): 206
+ products rebuilt one per replica in 2,747 s; READY never below 206;
+ at most 2 products staged; peak `used_memory` 1,183,558,488 B = steady
+ + 20,991,944 B (about two largest products); final = steady; retire set
+ max 0 pending at every sample, 0 abandoned. The duration is dominated
+ by one partition replay per product (about 256 k frames at 0.5 vCPU) -
+ a multi-product replay pass within the same memory bound is the known
+ optimisation, not needed for correctness.
+ - Parity after the rebuild: `latest` 66/66; `bars --import-receipt`
+ 937,432/937,432 byte-equal (1,235 trimmed / 1,541 appended by the live
+ spool since the import); `ready` 206 READY, 10 ABSENT (no source);
+ 14,094 data keys, all in the ready generation of their product.
+ - Segments: rolled 128 MB segments were cleaned in 0.4-2.4 s per pass
+ (0 % reduction there: all keys distinct); `md.bars.v2` 1.50 GB.
+ - Sizing adopted into the budget (`market_cache.sizing_measured_kn3_r1`),
+ **extrapolated** to the full cap from the 90.5 % measurement (R2
+ wording): steady at cap 1,284,607,296 B, peak 1,305,599,240 B, `maxmemory`
+ 1,500,000,000 B (headroom 194 MB), container 1,879,048,192 B (1.75
+ GiB). The KN-1 cap (1,288,490,188 B) would hold steady by < 4 MB and not
+ a rebuild. Budget SHA-256 `b192a98b...940a`; production review token
+ (offline, `User:kn-projector`) `APPLY_QDL_KN3_STATE_TOPICS_7fb233698c952c01`.
+ - Cleanup: 0 `kn3-*` containers/networks, no anonymous volume left;
+ capture deleted after hashing; evidence 8.1 MB kept to review.
+ - Owner decisions recorded, still gates of the production packet (not
+ KN-3 implementation gaps): dedicated projector principal via an added
+ client CA in the truststore (broker config and rollout to verify);
+ `maxmemory` 1.5e9 / 1.75 GiB; segment settings (packet ready).
+- 2026-09-24: **R1 resolution and re-review request (Claude -> Astra).**
+ | Item | Resolution | Evidence |
+ |---|---|---|
+ | F1 memory pressure skips a batch | D18: failed batch sought back to its checkpoint; failed replay abandoned and re-queued; build never finishes past unapplied data | two `stage_b_memory` F1 tests; combined `recovery_kafka` |
+ | F2 floor + rows in one batch | D19: floor bucket range includes the batch's own lowest write | `stage_b_redis` F2 test (fresh + existing generation) |
+ | F3 generation leak | D20: retirement written by the same Lua script as the swap; resumed by any replica; staging replacement retired | `stage_b_redis` F3 test; flow: 14,094 keys all in ready generations, retire set 0 |
+ | F4 full-rebuild memory | D21: rolling per-product swaps (one staging per replica, next after reclaim); whole-partition build only with no served product | `stage_b_memory` F4 (peak steady + 1.16 products); flow at cap: peak steady + 21 MB, READY 206 throughout |
+ | RAM decision | bucket 112 in writer/readback/checker/budget/tests; `maxmemory` 1.5e9 / 1.75 GiB, measured at 1,537,810 rows (90.5 % of the cap), full-cap figures extrapolated (R2 wording) | `sizing_measured_kn3_r1` |
+ | Segment decision | 1 h / 128 MiB on both state topics in budget, packet allowlist, verifier, tests | packet tests incl. real broker drift case |
+ | CPU | 0.3 no longer claimed; 0.4 total measured / 0.5 per replica, sum 4.7 <= 5.0 | budget `projector_measured`, flow 0.347 |
+ Not claimed: production apply of anything; live freshness or consumer
+ endpoint latency (KN-4/KN-5); the dedicated principal's broker rollout.
+ **Request:** Astra re-review of slice 11 for **ASTRA_REVIEW_PASS on KN-3**
+ and, on PASS, KN-4 entry per the tracker ("KN-4 only after KN-2 and KN-3
+ reviewed exits"; KN-2 already PASS).
+
+
+#### KN-3 Astra Review R2 - Two Residual Branches
+
+- 2026-09-25: **REVIEW_CHANGES_REQUIRED** at `8c50cfa` (source review; not
+ fault-injected by the reviewer). Most of R1 accepted; KN-4 not yet.
+ - **R2-F1 [P1] errors before apply can still lose a batch.** Both Kafka
+ readers returned `Err` in the middle of a poll loop and dropped the
+ records already collected (their position had moved past them), and
+ `StageB::step` could leave at `assigned()` / `prepare()` / the seek of a
+ new partition before the D18 rewind, so the next cycle read on and a
+ checkpoint could pass records never applied. Regressions: an error after
+ some records were polled, an assignment/prepare error while partitions
+ are running, the same on the rebuild reader; retry without restart
+ recovers every record.
+ - **R2-F2 [P2] a late-repair combination still leaves a bucket.** The
+ minimum over the whole batch was taken first and only then dropped when
+ below the old floor, losing a valid open before the cached `first`.
+ Counterexample (bar indexes): cached first 224, floor 50; batch BAR 0,
+ BAR 60, floor 300 - BAR 0 refused, BAR 60 written into bucket 0 and never
+ deleted. Fix: filter the opens valid for the floor, then take the minimum.
+ - Evidence wording: the sizing run measured 1,537,810 rows (90.5 % of the
+ cap); peak 1,183,558,488 B is measured, the full-cap steady/peak are
+ extrapolated - "confirmed by the full-cap measurement" is corrected. The
+ 2,747 s warm rebuild kept READY; consumer latency during it is KN-4.
+ - Scope: fix the two residuals, before/after regressions and a small
+ integration recovery; no C2, no rerun of the 45-minute rebuild.
+- 2026-09-25: **Design decision D22 (recorded before code).** (a) The
+ readers' poll loop (`collect`) returns the records already collected when
+ an error arrives after them - librdkafka errors are events and do not move
+ the position - and only an error before any record is returned as `Err`
+ (the next poll surfaces a persistent one again). (b) `StageB::step` rewinds
+ every partition present in a polled batch on **any** error between the
+ poll and the end of apply (assignment, prepare, seek, decode, apply). (c)
+ Every error after the rebuild reader was polled (decode, position, apply)
+ abandons the replay, reclaims its staging and re-queues the product, so a
+ replay never publishes a generation with records it skipped. (d) D19 keeps
+ the set of opens each batch writes per (generation, product) and takes the
+ lowest open at or above the pre-batch floor.
+- 2026-09-25: **R2 small integration recovery packet (recorded before
+ running).** Isolated only (`kn3-flow-*`, `--rm`, internal network, same
+ images; production read only through the read-only spool capture): a
+ 300-per-key real capture loaded as history; two projector replicas (R2
+ binary); a live phase at 300/s during which the broker is paused twice
+ for 15 s (real librdkafka transport errors in the middle of polls and
+ transactions) and one replica is SIGKILLed; restart of any replica that
+ exits. Checks: `ready`, `latest` (Kafka oracle), and a scratch BAR oracle
+ (every committed BAR fact of `md.bars.v2` present in the cache: rows and
+ opens per product). Cleanup with `docker stop` (anonymous volumes go),
+ capture deleted after hashing.
+- 2026-09-25: **KN-3 slice 12 - R2-F1/R2-F2 fixed (D22): implemented, tested
+ locally + isolated Kafka/Redis + small isolated integration recovery.**
+ - Source: `rust/qdl-projector/src/kafka_state.rs` (`collect`: both
+ readers keep the records polled before an error), `stage_b.rs`
+ (`step` = poll + `apply_polled`, rewind of every polled partition on any
+ error from assignment to apply; `advance_rebuild` wraps `replay_step`:
+ any error after the reader poll abandons, reclaims and re-queues; D19 set
+ of written opens, lowest at or above the pre-batch floor). Tests:
+ `tests/common/mod.rs` (shared `Faults`: injected assignment/watermarks
+ errors on the source, position and poll-after-move errors on the rebuild
+ reader), four `r2_*` cases in `tests/stage_b_redis.rs`, `collect` unit
+ test in `kafka_state.rs`.
+ - Regressions, before (`8c50cfa`, separate target directory) / after:
+ | Case | `8c50cfa` | now |
+ |---|---|---|
+ | `r2_f1_an_assignment_error_after_the_poll_loses_no_record` | 53/60 rows (7 polled records lost) | 60/60 |
+ | `r2_f1_a_prepare_error_for_a_new_partition_keeps_the_running_batch` | 53/60 | 60/60, the new partition prepared on retry |
+ | `r2_f1_a_replay_error_after_the_reader_moved_never_publishes_a_gap` (position error; poll error after moving) | generation published with 53/60 rows | 60/60, torn replay abandoned and redone |
+ | `r2_f2_a_late_repair_below_the_old_floor_does_not_hide_a_valid_older_row` (cached first 224, floor 50; batch BAR 0, BAR 60, floor 300) | BAR 60 left in bucket 0 | 100 rows (300..399), no bucket below the boundary, reclaim leaves no key |
+ | `kafka_state::tests::an_error_after_records_keeps_them_and_an_error_first_is_returned` | (the old loop had no seam: `Err` dropped the collected records) | pass |
+ - Small integration recovery (packet above), evidence
+ `/home/bobby/.local/state/qdl-v2/kn3-20260925-r2/evidence` `SHA256SUMS`
+ `dba9871f...2077`, binary `27d4060c...b820`: real capture 70,627 records
+ / 190 keys, history 42,387; two replicas. Round 1: broker paused 15 s
+ twice and replica b SIGKILLed during a 300/s phase; the harness loader
+ died at the first pause (its own fatal transaction error) and replica a
+ exited once and was restarted (reason not captured - logs of `--rm`
+ containers); after catch-up `latest` 66/66, BAR oracle 37,293 opens / 140
+ products 0 missing, `ready` 206 (10 ABSENT without source). Round 2 with
+ projector logs kept and the loader restarted after each fault (63,042
+ committed + 15,249 aborted): pauses and a SIGKILL of replica a, no replica
+ exit, no error line in the projector logs (librdkafka reconnected within
+ its timeouts, so the mid-poll error branch is proven by the fault-injected
+ tests above, not by the pause); `latest` 66/66 over 118,372 canonical
+ records, BAR oracle 40,500 opens 0 missing, stage A lag 6. Cleanup: 0
+ `kn3-*` containers/networks/anonymous volumes; production containers
+ identical; capture deleted after hashing.
+ - Staged content (exact commit tree): fmt + clippy `-D warnings` clean;
+ workspace 294 passed / 0 failed / 53 ignored; ignored `qdl-projector`
+ 50/50 x 3 rounds on disposable Kafka + 2 Redis; KN Python suites with
+ Kafka/Redis OK (1 skip: the packet's authorizer-broker integration, whose
+ code is unchanged in this slice).
+ - Evidence wording corrected (R2): budget `sizing_measured_kn3_r1` states
+ measured (1,537,810 rows, peak 1,183,558,488 B) vs extrapolated (full-cap
+ steady/peak); the R1 receipt rows are marked the same way. Budget
+ SHA-256 `6521a39d...c423`; offline production review token
+ `APPLY_QDL_KN3_STATE_TOPICS_302b5149ac922607`. Warm-rebuild consumer
+ latency is a KN-4 measurement, not claimed.
+- 2026-09-25: **R2 resolution and re-review request (Claude -> Astra).**
+ R2-F1 and R2-F2 fixed as D22 with before/after regressions and the small
+ integration recovery above; no C2, no rerun of the 45-minute rebuild.
+ **Request:** re-review of slice 12 for **ASTRA_REVIEW_PASS on KN-3** and,
+ on PASS, KN-4 entry.
+
+
+#### KN-3 Astra Review R3 - Post-Publish Cleanup Window
+
+- 2026-09-25: **REVIEW_CHANGES_REQUIRED** at `1ef875a` (source review, 22/22
+ new artifacts hash-verified, offline suite re-run 34 pass / 1 skip; not
+ fault-injected by the reviewer). R2-F1/R2-F2 confirmed fixed; sizing
+ wording accepted.
+ - **R3-F1 [P1] cleanup can delete a generation that was just published.**
+ After the publish CAS succeeds, an error in the reclaim of the old
+ generation or in the pointer re-read made the D22 wrapper treat the whole
+ replay step as failed and call `abandon_rebuild`, which reclaimed
+ `active.generation` without checking whether it had become READY -
+ leaving a READY pointer to deleted data. Required: distinguish not
+ published / published / CAS outcome unknown; discard staging only after
+ confirming it is unpublished, under a fence check; after a publish,
+ cleanup failures recover through the existing retirement, never by
+ deleting the READY generation; when the CAS outcome is unknown, re-read
+ before deciding. Regressions: error before the CAS, error after the CAS
+ before cleanup, CAS reply lost although the server committed - pointer,
+ payload, checkpoint and retry consistent. No new phase, C2 or 45-minute
+ rebuild.
+- 2026-09-25: **Design decision D23 (recorded before code).** Ending a
+ rebuild re-reads the product pointer and decides from it: `ready = G` ->
+ the swap happened (the old generation is already in the retirement set,
+ written by the publish script) -> the rebuild completes, `G` is never
+ reclaimed; `staging = G` -> not published -> a new Lua op `X` (unstage:
+ CAS on ready/staging/fence under the owner fence) clears the staging
+ pointer and retires `G` in the same script, then the retirement is
+ reclaimed; the replay is re-queued; neither -> the generation is not ours
+ any more, nothing is reclaimed; pointer unreadable -> nothing is decided,
+ the rebuild state is kept and the next step re-reads (a cache reconnect
+ drops the in-memory rebuild without reclaiming). Every path that ended a
+ rebuild (errors, "pointer changed", partition lost/building, verification
+ failure) goes through this decision. Cache faults for the regressions come
+ from a `fault-injection` cargo feature enabled only for the crate's own
+ tests (self dev-dependency).
+- 2026-09-25: **KN-3 slice 13 - R3-F1 fixed (D23): implemented, tested
+ locally + isolated Redis/Kafka.**
+ - Source: `apply.lua` op `X` (unstage: CAS on the pointer under the owner
+ fence, clears `staging`, retires it in the same script, never touches
+ `ready`); `cache.rs` `Op::Unstage`, fault hooks behind the
+ `fault-injection` feature (`src/fault.rs`: fail before a publish, lose a
+ publish reply after the server committed, fail a reclaim, fail pointer
+ reads - also armed exactly at a lost reply); `stage_b.rs`
+ `end_rebuild` replaces `abandon_rebuild` on every path (error, pointer
+ changed, partition lost/building, no reader, verification failure,
+ zombie): fresh pointer read -> `ready = G` completes (no reclaim of `G`,
+ the old generation goes through the retirement set), `staging = G` ->
+ unstage (owned) or direct reclaim (not owned: only this stopped rebuild
+ could ever publish `G`), otherwise nothing; an unreadable pointer or a
+ failed unstage keeps the rebuild in an `ending` state that the next step
+ retries - the replay never continues after it; `start_rebuild` keeps a
+ request queued until decided and puts a new staging under the rebuild
+ state before its setup, so a setup error also ends through D23.
+ `Cargo.toml`: the feature + a self dev-dependency enabling it for tests;
+ `Cargo.lock` gains only that edge. Release build: the normal dependency
+ graph has no `fault-injection` and the binary contains no injection text.
+ - Regressions (`tests/stage_b_redis.rs`, every step checks that the READY
+ generation still holds its 60 rows; the end state checks pointer,
+ payload of every open, meta vs bucket rows, checkpoint 60, keys only in
+ the ready generation, retirement and request sets empty):
+ | Case | `1ef875a` + the same hooks | now |
+ |---|---|---|
+ | `r3_an_error_before_the_publish_cas_discards_the_staging_and_retries` | pass (guard: this branch was not broken) | pass: 1 discarded, replay redone, 1 completed |
+ | `r3_an_error_after_the_publish_cas_never_deletes_the_ready_generation` (reclaim of the old generation fails after the swap) | READY generation 3 lost its data (0/60 rows) | pass: 1 started / 1 completed / 0 discarded |
+ | `r3_a_lost_publish_reply_is_resolved_by_reading_the_pointer_back` (server committed, reply lost; and the same with the pointer unreadable right after) | READY generation 3 lost its data (0/60 rows) | pass for both variants |
+ (control: the hooks alone ported onto `1ef875a` by a scratch script,
+ separate target directory.)
+ - The existing suite adapted: `losing_the_partition_...` passes unchanged
+ (the unowned branch reclaims the confirmed-unpublished staging).
+ - Staged content (exact commit tree): fmt, clippy `-D warnings` for all
+ targets and for lib + bin without the feature; workspace 294 passed / 0
+ failed / 56 ignored; ignored `qdl-projector` 53/53 x 3 rounds on
+ disposable Kafka + 2 Redis; KN Python suites with Kafka/Redis OK (1 skip:
+ packet authorizer-broker integration, unchanged). Disposable services
+ stopped: 0 `kn3-*` containers/networks. No C2, no flow rerun (none
+ required for this window).
+- 2026-09-25: **R3 resolution and re-review request (Claude -> Astra).**
+ R3-F1 fixed as D23 with the three regressions above (before/after on
+ `1ef875a`). **Request:** re-review of slice 13 for **ASTRA_REVIEW_PASS on
+ KN-3** and, on PASS, KN-4 entry.
+
+
+#### KN-3 Astra Review R4 - Never-Ready Product After Unstage
+
+- 2026-09-25: **REVIEW_CHANGES_REQUIRED** at `b6874e8` (source review;
+ offline 34 pass / 1 skip re-run by the reviewer). The post-publish window
+ (R3) is closed: published / unpublished / unknown outcomes are
+ distinguished, a lost CAS reply or an unreadable pointer no longer deletes
+ a READY generation.
+ - **R4-F1 [P1] a product that was never READY can stay stuck after an
+ unstage.** Partition with product A READY and B staging-only (an earlier
+ run stopped); the recovery rebuild of B fails before its publish; the
+ new unstage correctly clears B's staging and re-queues it; the retry in
+ `start_rebuild` finds neither ready nor staging and refuses ("no
+ generation (a cold build covers it)") - but the partition is in normal
+ mode and no cold build comes, so without new records B stays NOT_READY
+ although Kafka holds its data. The R3 regressions all started from a
+ READY product. Required: a product of an owned partition with a valid
+ registry entry / rebuild obligation may be staged with both pointers
+ empty; regression A READY + B staging-only -> error before publish ->
+ retry without new records or restart -> B READY with all its data,
+ request/retirement sets clean; keep the three R3 regressions.
+- 2026-09-25: **Design decision D24 (recorded before code).** `start_rebuild`
+ refuses only a product that no owned partition's registry holds. A
+ registry entry is removed only by an unpublish (the product's state is
+ gone), so any product still in the registry of a partition this instance
+ owns may be staged even with an empty pointer - the replay then builds it
+ from the log (zero records -> unpublish, as before). The live path keeps
+ skipping such a product while its obligation is pending (no dual write).
+- 2026-09-25: **KN-3 slice 14 - R4-F1 fixed (D24): implemented, tested
+ locally + isolated Redis/Kafka.**
+ - Source: `stage_b.rs` - `start_rebuild` no longer refuses an empty
+ pointer (only a product absent from every owned registry is refused);
+ the first-seen path of `stage_missing` does not stage a product whose
+ rebuild obligation is pending, so no second staging races the rebuild.
+ - Regression `r4_a_never_ready_product_is_rebuilt_after_its_staging_was_unstaged`
+ (`tests/stage_b_redis.rs`): A READY (50 rows), B staging-only from a
+ stopped run (40 rows in the log), recovery rebuild of B fails before the
+ publish (injected), unstage, retry with no new record and no restart ->
+ B READY with 40/40 rows and every open readable, meta = bucket rows,
+ B's keys only in its ready generation, A untouched, checkpoint 90,
+ retirement and request sets empty; 1 abandoned / 2 started / 1 completed
+ / 0 refused. On `b6874e8` (same hooks, separate target directory): B
+ never READY (the retry refused). The three R3 regressions pass on both.
+ - Staged content (exact commit tree): fmt; clippy `-D warnings` for all
+ targets and for lib + bin without the test feature; workspace 294 / 0 /
+ 57 ignored; ignored `qdl-projector` 54/54 x 3 rounds on disposable Kafka
+ + 2 Redis; KN Python suites with Kafka/Redis OK (1 skip: packet
+ authorizer-broker integration, unchanged). Disposable services stopped:
+ 0 `kn3-*` containers/networks. No C2, no long rebuild rerun.
+- 2026-09-25: **R4 resolution and re-review request (Claude -> Astra).**
+ R4-F1 fixed as D24 with the before/after regression above; R3 regressions
+ kept. **Request:** re-review of slice 14 for **ASTRA_REVIEW_PASS on KN-3**
+ and, on PASS, KN-4 entry.
+- 2026-09-25: **ASTRA_REVIEW_PASS recorded at `f0380a4`** (owner hand-off of the
+ Astra conclusion: "KN-3 da ASTRA_REVIEW_PASS tai f0380a4"). KN-3 CLOSED at
+ isolated-flow scope; R4 is no longer a KN-4 blocker. KN-4 slice 1 (`2c85adf`,
+ additive projector ops W/K) is reviewed with KN-4, not as a KN-3 change.
+
+
+### KN-4 - Query, SDK And Full Read-Plane Compatibility
+
+**Status:** IMPLEMENTED_PENDING_ASTRA_REVIEW (2026-09-26; receipt
+`~/.local/state/qdl-v2/kn4-20260925/evidence/kn4-closure-receipt-v2.json`,
+three items left open for the review). KN-3 PASS recorded (`f0380a4`). Slices
+1-34 and the alpha adapter fix (`execution_alpha` `f266097`) implemented and
+tested; D35-D47 and the 2026-09-26 Astra review items are in the journal.
+**Goal:** actual SDK/consumer reads use the new backend correctly across the
+declared endpoint surface; hot latency survives heavy warmup and recovery.
+**Guide index:** [18.11 work items and K4-T01..T08](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-guide-phase-4),
+[18.4 consistency](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-contracts-and-correctness),
+[18.5 cursor](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-cursor-security),
+[18.6 benchmark](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-resources-and-latency),
+[18.7 evidence reuse](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-testing-and-review).
+
+**To do:**
+- [ ] K4.1 actual cache Query backend with read-time auth/quality/eligibility.
+- [ ] K4.2 immutable rendering optimization and bounded hot/cold worker lifecycle.
+- [ ] K4.3 warmup/history/batch/consistent cursor handoff, preserve declared maxlen.
+- [ ] K4.4 full existing REST/gRPC/reference/diagnostic/OpenAPI/SDK compatibility.
+- [ ] K4.5 real no-order SDK consumers on paired shadow targets, fallback/return/BLOCKED.
+- [ ] K4.6 both-replica fast matrix, targeted protocols and shadow stages 20/35.
+**Completed:** none in this documentation update.
+
+#### KN-5 Tested-Slice Journal
+- 2026-09-26: **K5.1 inputs read; owner decision D48 (daily universe).**
+ Handoff `86e15e8`/`2da88a9`/`c22f4d3` (DL) and `4a820bf` (alpha) read. The
+ only real multi-symbol demand is `deep_momentum` (317 Binance USD-M symbols,
+ 1d, lookback 480-600) while the catalog held 22 instruments; public
+ `exchangeInfo`: 317/317 have >= 480 daily rows, 1 has 2,500, 0 have 5,000,
+ 10 are SETTLING. Owner D48: at most 300 bases by market cap listed on both
+ Binance and OKX, bad symbols removed, every change logged from the first
+ signed set, 1d only, batch reads, backtest follows the same rules, bounded
+ effort. Guide: [D48](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-d48-daily-universe).
+- 2026-09-26: **Handoff sync, K5.1 slice 1** | this commit | Two tests failed
+ on `c22f4d3` itself (also on a clean `HEAD` archive): `test_phase111` still
+ expected OKX SWAP long/short to be unsupported (now a real capability) - the
+ unsupported case moved to Binance Spot long/short with the committed capture
+ row; `kn-v220-candidate-budget.json` inherited the pre-`86e15e8` hash of
+ `v211-target-acceptance-budget.json` (quiet exemption removed) - re-pinned.
+ 19 OK | `tested locally`.
+- 2026-09-26: **D48 universe admitted in source, K5.1 slice 2** | this commit
+ | `scripts/kn_universe_top300.py` (selection, hysteresis 330, change log,
+ `members_as_of`, `--sync`); revision 1 signed **255** members (265 bases
+ listed on both venues; USDC, 5 without market cap, 4 < 30 days excluded).
+ Sync added 250 BAR 1d rows per alpha consumer (demand rev 7) and the
+ verbatim provider rows of 250 new symbols per venue to the captures (old
+ rows byte-identical, provenance `appended_captures`). Compilers: C3.5 expands
+ only execution symbols and admits only demand-declared new instruments;
+ the catalog builder keeps bar-only symbols on the REST final lane (one poll
+ per daily boundary; OKX execution symbols stay native); phase533 renders
+ universe BAR rows; the reference compiler counts TRADE instruments only; the
+ manifest bound 256 -> 1024. Result: catalog rev 10 (716 bindings, 320 BAR per
+ venue), acquisition 18, scope 9, release routing 25, primary routing 7,
+ alpha manifests Binance rev 14 (375) / OKX rev 13 (360) - consumer JWT
+ manifest revisions must move in the same rollout. Pinned-count tests now
+ derive the universe share from the demand (`tests/universe_support.py`);
+ full suite **2,309 OK, 38 skipped** (41 min, one run after the fixes;
+ targeted reruns before it). Budget: `universe_d48` block - 497,453 rows now
+ (~376 MB at 756 B/row), +182,500 rows/year, 6.03 M rows (4.56 GB) at the D15
+ cap: retention for universe products and maxmemory are an owner decision
+ before load. Streams: none needed (daily batch warmup); the 60-stream quota
+ stays for execution feeds. Candidate runtime (outside Git):
+ `~/.local/state/qdl-v2/kn5-20260926/bundle/runtime` via
+ `refresh_stable_runtime_bundle.py` (placeholder stable.env/identities, no
+ secret; authority `03126d6477ac...`) | `tested locally`; no runtime change.
+**Verification:** K4-T01..T08 not run; full endpoint inventory includes strict
+batch 1/8/16/32/50, 2.5k/5k/10k history where declared, source/session quality,
+book sequence, immutable-vs-dynamic response fields and hot/cold concurrency.
+**Exit gate:** all affected read routes and SDK protocols pass actual boundary
+tests; shadow 20/35 and budget pass; no dropped public RPC or stale cached verdict;
+Astra reviewed. This is not yet 50+TS production capacity certification.
+**Technical debt / decisions:** no in-scope public-read defect can be deferred;
+unsupported/deferred product capabilities remain explicitly unchanged.
+**Runtime / rollback:** shadow Query/read clients only; stop them and retain old
+targets. No strategy/order/sizing mutation, no execution activation.
+**Cleanup:** remove alpha/TS-shaped read clients and exact test resources, not
+production containers; no silently running Compose test overnight.
+**Astra review:** NOT REQUESTED; inspect actual HTTP/gRPC/SDK evidence, dynamic
+freshness/security, replica consistency, warmup/cursor and load methodology.
+**Next permitted step:** KN-5 after reviewed exit and a concrete runtime packet.
+
+#### KN-4 Execution Journal
+- 2026-09-23: owner-approved plan recorded; implementation/tests/runtime NONE.
+- Append tested-slice receipts and Astra findings/resolutions here.
+- 2026-09-25: **Owner start (explicit sequencing).** Bobby asked Claude to
+ execute KN-4 in full per this tracker and guide 18.11 (with 18.3-18.7,
+ 18.13, 18.14). Entry state: KN-2 ASTRA_REVIEW_PASS; KN-3
+ IMPLEMENTED_PENDING_ASTRA_REVIEW at `f0380a4` (R4 re-review requested, no
+ PASS yet). Guide 18.7(8) lets the owner change sequencing explicitly; KN-4
+ builds on `f0380a4`, and any further KN-3 finding is fixed and tested in
+ KN-3 scope first. KN-4
+ itself cannot be closed before the KN-3 PASS. Work starts with a read-only
+ survey (Query backend interface and the 11 public HTTP operations + 4 gRPC
+ RPCs of the KN-1 inventory `baseline.json` `891e8733...`, the Stream read
+ view, SDK/TS/alpha read adapters and the existing load/latency harness).
+- 2026-09-25: **Survey result and design decisions D25-D34 (recorded before
+ code).** Facts (file:line at `f0380a4`):
+ - Query backend protocol `MarketDataQueryBackend` (`qdl/query/results.py:202`)
+ + optional `warmup_is_local`/`history_many`/`open_gaps_bounded`/
+ `warmup_stats` (`qdl/query/service.py:827,840,1807,1100`); the only
+ implementation is `StableSpoolQueryBackend` (`qdl/runtime/stable_source.py:201`),
+ built unconditionally by `build_stable_query_stack` (:1646). No Query code
+ reads Redis; no env selects a backend; cursors are v2 spool tokens
+ (`StableConsumerCursorIssuer._issue` :1577); `qdl/replay/cursor_v3.py` is
+ wired only to tests, the probe and the Rust gateway.
+ - Cache facts: latest `l:` holds the canonical `t/p/o` (`apply.lua:196`);
+ BAR rows carry only the trailer offset, legacy rows `MAX_OFFSET`, and no
+ product-level canonical partition exists; `ckpt:` is keyed by the state
+ topic. The canonical producer partitions by librdkafka's default
+ partitioner over `partition_key` (`rust/qdl-kafka/src/lib.rs:581`), so a
+ product's canonical partition is not derivable from the LPK murmur2 rule.
+ - The Rust gateway trusts `claims.source_partition` and only checks the hub
+ knows it (`qdl-stream-gateway/src/service.rs:406`); replay is bounded by
+ 2,000,000 scanned records / 1 GiB / 30 s (`main.rs:174-177`), so a cursor
+ far behind the partition head ends `CURSOR_EXPIRED:REPLAY_SCAN_LIMIT` and
+ the SDK re-snapshots (`qdl_sdk/client.py:317`): a stale boundary would loop.
+ - The SDK starts each session at `warmup.watermark_offset` and rejects any
+ event `<=` it (`qdl_sdk/client.py:355`); `StreamEvent` rejects offset 0
+ (`qdl_sdk/models.py:882`, KN-2 carry-over).
+ - Python GetSnapshot = `service.warmup` (quality-enforced) + `bind_history` +
+ stored events (`stable_source.py:1617`); GetFeedStatus = `service.status`
+ (`qdl/stream/grpc_service.py:461-521`). Alpha MARK/INDEX reads the spool
+ in-process (`qdl/reference/local_mark_index.py:66`); execution MARK/INDEX
+ calls the Python stream's private endpoint
+ (`qdl/runtime/execution_mark_index.py:578`), which the Rust gateway does
+ not serve.
+ Decisions:
+ - **D25 Backend.** `KnMarketCacheQueryBackend` subclasses
+ `StableSpoolQueryBackend`: selection, quality (`_quality` ->
+ `evaluate_binding_quality`), gap, lineage, item projection and
+ `history_many` batching stay the one Python owner; only the record source
+ changes (cache rows instead of spool tails). Selected by
+ `QDL_STABLE_QUERY_BACKEND=spool|kn3` (default `spool`: production
+ unchanged). No Kafka reader in Python. The cache holds one row per open
+ (KN-3 revision rule), so a revised BAR no longer appears twice (the spool
+ returned both, `tests/test_phaseb_stable_edge.py:900`); parity tests
+ compare at the same applied boundary, not byte-identical responses.
+ - **D26 Read consistency.** Per product: one short read-only Lua call reads
+ pointer (ready, fence), the product's source coordinate and the source
+ watermark (D27), and either the latest entry or the BAR meta; BAR rows
+ follow in pipelined `HGETALL`s of only the buckets the window needs (at
+ most 64 per round trip, never SCAN/KEYS), then the pointer and watermark
+ are re-read. A pointer change retries (bounded: 3 attempts inside the
+ request deadline, contract section 5 bound <= 120 s), then fails typed
+ retryable; two generations are never merged.
+ - **D27 Cursor boundary.** `source_offset` = the highest canonical offset
+ `X` such that every fact of the product at `<= X` is in the view read.
+ Stage B raises, in the same atomic apply script as each live batch, a
+ checkpoint field per `(canonical topic id, canonical partition)` to the
+ batch's highest source offset (state partition `q` receives a product's
+ frames in canonical order, so `W_q(p)` bounds every product of `q` on
+ `p`). Latest: `max(W_q(p) read first, l:o)`; BAR: `W_q(p)` read before
+ the rows, `p` from a new product-level source key written by BAR
+ revision frames. If `W` moved during a BAR read the rows may hold facts
+ after `X` (the stream re-delivers them: duplicates, never a gap); the
+ read retries first. Every item and the history carry `X` as
+ `watermark_offset` (the SDK handoff start); `snapshot_id` hashes
+ `(lpk, topic, partition, X)`; the cache generation never enters it. A BAR
+ product with no canonical fact yet (legacy rows only) has no provable
+ boundary: typed `DATA_NOT_READY:SOURCE_BOUNDARY_UNKNOWN`, counted in the
+ shadow. **Measurement gate:** `W_q(p)` age is measured on real traffic;
+ if a quiet `(q, p)` pair would push a cursor toward the replay scan
+ limit, a Stage-A-committed-offset watermark is added before K4.6. This
+ is an additive projector change (new op/fields, KN-3 semantics unchanged)
+ committed as its own KN-4 slice on top of `f0380a4` and named to Astra;
+ it does not alter the KN-3 tree under review.
+ - **D28 Cursor v3 issuer.** Query issues v3 with the Stream's exact key set
+ and expectation (`QDL_KN_CURSOR_KEYS_FILE`, active key, topic id, plan
+ epoch, route generation, environment - the gateway's own env names); the
+ backend hands the coordinate to the issuer through an internal
+ placeholder that never leaves the process (refused if unsigned). A
+ coordinate whose topic id differs from the configured one is typed
+ `DATA_NOT_READY`, never signed. Pass-through keeps
+ `PASS_THROUGH_NO_REPLAY`.
+ - **D29 Stream ReadView.** GetSnapshot/GetFeedStatus keep one semantic
+ owner: after the gateway's own auth/access checks the Rust `ReadView`
+ calls the paired Query's private HMAC endpoint (mTLS, stream identity,
+ `include_in_schema=False`, the `/internal/v2/...` precedent) which runs
+ the unchanged Python oracle path over the cache backend and returns the
+ proto response; the v3 cursor is signed by Query. A Query failure is typed
+ retryable on those two RPCs only; Subscribe/Replay do not depend on it.
+ - **D30 Render (K4.2).** Decoded, projected rows are immutable per
+ `(lpk, open/offset, trailer hash)`: a bounded LRU keeps the projected
+ payload; quality, freshness, eligibility, cursor and envelope are rebuilt
+ per request (no cached verdict). Before/after CPU on 2.5k/5k/10k warmups;
+ the KN-1 Query-lane 429 (`13b3594`) is root-caused in this item.
+ - **D31 MARK/INDEX.** Alpha reads offer the cache's `l:` MARK_INDEX record
+ to the unchanged verified view (the spool-refreshing reader's cache twin);
+ the execution path's source (quiet-session component evidence) is decided
+ with evidence in K4.4, not assumed.
+ - **D32 Diagnostics.** Gaps: per BAR product within the existing work/result
+ budgets, reading only that product's buckets (typed `PARTIAL_RESULT` on
+ budget). Readiness `query_cache`: cache reachability + per-product READY
+ coverage of the bundle, never a global flag.
+ - **D33 SDK.** `StreamEvent` accepts offset 0; continuity stays strictly
+ increasing after the handoff watermark. SDK version bumped, not
+ published; TS/alpha pins are not edited (shadow clients use the source).
+ - **D34 Shadow (K4.5/K4.6).** Isolated network, disposable broker/projector/
+ market cache/Stream pair/Query pair/quota Redis, `--rm` clients, KN-2
+ orchestration pattern. Stages 20/35 judge freshness, so the shadow needs
+ live canonical input; the input path (read-only mirror of production
+ canonical vs capture) is a runtime packet journaled and put to the owner
+ before it runs.
+- 2026-09-25: **K4 slice 1 (D27 projector part)** | this commit |
+ `cargo fmt --check`, `clippy -D warnings`, `cargo test -p qdl-projector`
+ (20 unit incl. op widths W=4/K=4) and `--features fault-injection --
+ --ignored --test-threads=1`: 55 passed / 0 failed (cache_redis 5,
+ cache_redis_memory 1, cleaner_kafka 4, expiry_kafka 2, expiry_redis 6,
+ recovery_kafka 1, stage_a_kafka 4, stage_b_kafka 3, stage_b_memory 3,
+ stage_b_redis 26 incl. new `k4_the_live_batch_raises_source_watermarks_and_records_bar_product_sources`)
+ on disposable `kn3-lead-*` Kafka/Redis | new `apply.lua` ops `W`
+ (raise-only `ckpt` field `s||`) and `K`
+ (`src:` {t, p}), both without pointer expectation; `stage_b.rs`
+ `source_ops` adds them to the **live** batch only (rebuild replay stays
+ below the live checkpoint and never moves them; a zombie batch applies
+ nothing); a floor or legacy frame carries no coordinate | memory: at most
+ one tiny hash per BAR product + one field per (state, canonical)
+ partition pair | runtime NONE | services stopped after the run | next:
+ K4.1 Python backend and v3 issuer.
+- 2026-09-25: **K4 slice 2 (K4.1 backend, D25/D26/D27/D28/D31/D32)** |
+ this commit | `tests.test_kn_query_backend` 15/15 on a disposable Redis
+ (real Lua scripts): BAR history item-for-item equal to the spool backend
+ on the same records (payload, quality, source, contract, lifecycle,
+ coverage, `data_as_of`) with every item at the view boundary; time range;
+ last-N walk past missing opens and never below the floor; legacy rows ->
+ boundary = watermark; latest `max(o, W)` incl. offset 0; typed outcomes
+ (no pointer -> DATA_NOT_READY, legacy-only -> `SOURCE_BOUNDARY_UNKNOWN`,
+ other topic -> `SOURCE_TOPIC_GENERATION`, corrupt row -> INTERNAL_ERROR
+ non-retryable, generation churn -> retried then DEPENDENCY_UNAVAILABLE);
+ read-only (`DUMP` of every key equal before/after); per-item batch; gap
+ diagnostic; issuer claims verified with the Stream's expectation; HTTP
+ warmup/snapshot through `create_v2_app` + JWT: signed v3 cursor at the
+ boundary, digest of the REST requirement matches, no placeholder in the
+ body. Regression: 275 tests of `test_pass_through_wiring`,
+ `test_phase533_query_readiness`, `test_runtime_readiness_recovery`,
+ `test_phaseb_stable_edge`, `test_dlv2_r1_delivery_lock`,
+ `test_kn_bar_readback`, `test_routed_query_backend`,
+ `test_phase10_universal_warmup`, `test_query_cold_work`,
+ `test_phase113_reference_v2` OK (1 pre-existing skip) | new
+ `qdl/runtime/kn_market_cache.py` (reader), `qdl/runtime/kn_query_backend.py`
+ (backend, issuer, settings), `CacheRefreshingMarkIndexView`
+ (`qdl/reference/local_mark_index.py`), `build_stable_query_stack` accepts a
+ backend/issuer/alpha-reader triple, `create_stable_query_app` selects
+ `QDL_STABLE_QUERY_BACKEND=spool|kn3` (default spool, unchanged), readiness
+ `query_cache` = cache reachability + READY coverage | observed failure:
+ the first wiring refused `handoff=None`, which `test_pass_through_wiring`
+ (and so the old contract) allows -> only the spool is required | runtime
+ NONE | next: K4.2 render/lanes, then the Stream ReadView (D29).
+- 2026-09-25: **K4 slice 3 (K4.2 lanes, bounded cold work, row derivations)**
+ | this commit | three findings, each with a before/after control on the
+ exported previous tree:
+ - **Query-lane 429 (the KN-1 gate owned by KN-4).** Root cause: the hot
+ snapshot lane admits at most 4 in-flight requests per identity per
+ replica (`13b3594`); the 5th concurrent read of one identity is
+ refused although the lane frees a moment later, and one alpha identity
+ fronts every session of its runtime (manifest `max_streams` 60) that
+ reads at the same bar close. Reproduced: concurrency 4/8/16 -> 100 x
+ 200, 20 -> 1 x 429 `read lane consumer is at its finite pending bound`.
+ Fix (one variable): per-identity pending 4 -> 32, lane pending 16 -> 64,
+ bytes 512 KiB -> 1 MiB (64 x 16 KiB); active per identity stays 1, TS
+ reserves unchanged. `Phase5ApiReplicaLoadTests` before FAIL, after 3/3
+ OK; `test_normal_identity_stays_bounded_while_ts_burst_is_queued` now
+ proves a 32-burst queues, runs one at a time, the 33rd is refused and TS
+ is still admitted. Stages 20/35 (K4.6) measure the latency cost.
+ - **Cancelled requests freed their permit while the worker ran (K4-T06).**
+ `_QueryWorkPools._run` awaited `run_in_executor`: a cancelled/timed-out
+ request released its lane (and the render its local lease) at once
+ while the thread kept materializing, so the next large batch ran beside
+ it. New `cold_work.await_in_thread`: the caller is held until the thread
+ returns (also across a second cancel) and cold work stops at its next
+ `cold_yield` (`ColdWorkCancelled`, a BaseException so per-item handlers
+ cannot swallow it). Pools and `_warmup_json_off_loop` use it. Three new
+ tests: before 3 FAIL, after OK (worker stops < 0.5 s after the cancel;
+ the next batch starts only after it stopped).
+ - **D30 render (measured, `--cpus 1`, synthetic rows from one golden
+ bar).** Per 10k-row warmup: service 3.55 s + render 2.6-3.1 s CPU.
+ Backend row-derivation cache (content key binding + canonical SHA-256:
+ envelope, lineage verdict, static item fields; quality/cursor/watermark
+ rebuilt per request) -> warm service 1.69 s (10k), 0.45 s (2.5k);
+ 2.8 KB/row by tracemalloc, default 20,000 rows (`QDL_KN_ROW_CACHE_ENTRIES`,
+ ~56 MB). Two render ideas were measured and **dropped**: caching
+ validated Pydantic views (11.4 KB/row, -1.35 s/10k: too much RAM for a
+ 1 GiB replica) and skipping the DecimalValue validator (slower: 10-11 vs
+ 8-8.5 us/decimal, the Rust validator wins). Render stays the chunked
+ off-loop path; no verdict is cached (a later clock changes quality,
+ payload identical; byte-identical render with and without the cache).
+ Tests: 307 of the Query suites (`test_query_cold_work`,
+ `test_kn_query_backend` 16, `test_read_plane_phase2_capacity`,
+ `test_phase10_universal_warmup`, `test_fund_phase5_load/_api/_e2e`,
+ `test_phase533_query_readiness`, `test_phaseb_stable_edge`,
+ `test_pass_through_wiring`, `test_routed_query_backend`,
+ `test_phase104_reference_batch`, `test_phase113_reference_v2`,
+ `test_dlv2_r131_warmup_is_a_lookback_cap`) OK, 1 pre-existing skip |
+ runtime NONE | next: Stream ReadView (D29), execution MARK/INDEX (D31).
+- 2026-09-25: **K4 slice 4 (D29 Stream read view, D31 execution MARK/INDEX)**
+ | this commit |
+ - D29: new `qdl/runtime/kn_read_view.py` - `POST /internal/v2/kn/read-view`
+ (not in the public schema), HMAC `X-QDL-Stable-Signature` like the
+ existing private edges, installed only with the kn3 backend and
+ `QDL_KN_READ_VIEW_SECRET_FILE`. SNAPSHOT runs `requirement_from_proto`,
+ the service's own `_warmup_from_history` enforcement and the v3 issuer on
+ ONE product view (`history_with_envelopes`; the spool oracle read the
+ window twice); STATUS runs `status_async` on the hot lane; one in-flight
+ history snapshot per replica. Rust: `query_view.rs` `QueryReadView`
+ (workspace `reqwest` with a preconfigured rustls client identity, no new
+ crate in the lock; `Cargo.lock` +1 line), rotating failover over
+ `QDL_KN_READ_VIEW_URLS`; the `ReadView` trait now also receives the exact
+ proto requirement and `ReadViewError` carries its gRPC status (409 ->
+ FAILED_PRECONDITION `{code}:{detail}`, RATE_LIMITED -> RESOURCE_EXHAUSTED,
+ 400 -> INVALID_ARGUMENT, unreachable -> UNAVAILABLE
+ `DEPENDENCY_UNAVAILABLE:`). Unset URLs keep `NotReadyReadView`.
+ - D31: with the kn3 backend, execution MARK/INDEX is the cache-refreshing
+ view with the binding's own `stale_after_ms`, the acquisition quiet
+ policies and the session files (the Python stream's view held the same
+ read-committed canonical record); kn3 refuses to start with
+ `QDL_STABLE_EXECUTION_MARK_INDEX_URLS_JSON` set, so a shadow Query can
+ never reach a production stream's private endpoint.
+ Tests: Python `test_kn_query_backend` 19 (read view: events byte-equal to
+ the spool `StableGrpcSnapshotLoader` on the same records, v3 cursor at
+ the boundary, status equal to `service.status`, 401/400/409 typed;
+ execution view: fresh record served, 5 s old refused `STALE` on the 2 s
+ binding horizon while the alpha view still serves it) + 64 related
+ (`test_query_cold_work`, `test_phase113_reference_v2`,
+ `test_phase104_reference_batch`, `test_fund_phase5_e2e`,
+ `test_phase104_v2_query_stream_integration`) OK; Rust `qdl-stream-gateway`
+ fmt/clippy `-D warnings` clean, 28 unit (4 new: HMAC signature equals the
+ Python golden, reply mapping, proto body, `query_v2_1` is a valid TLS
+ name) + `native_stream` 33 OK. Not run: `cargo deny` (not installed in
+ `qdl-rust-builder:r134-test`; `reqwest` is already a locked workspace
+ dependency). The Rust client against a live Query is K4-T01 in the
+ shadow run | runtime NONE | next: SDK offset 0 (D33), shadow packet.
+- 2026-09-25: **K4 slice 5 (D33 SDK offset 0)** | this commit |
+ `StreamEvent` accepts Kafka offset 0 (negative/empty token still refused);
+ the session's strictly-increasing continuity after the handoff watermark
+ is unchanged, so a record at the watermark is still `OPEN_SEQUENCE_GAP`.
+ SDK version 2.0.3 -> 2.0.4 (`qdl_sdk/__init__.py`,
+ `scripts/build_qdl_sdk_release.py`, README), built reproducibly by the
+ release test, **not published**; the TS (2.0.3) and alpha (2.0.1) pins
+ are not edited - shadow clients use the source. New
+ `tests/test_qdl_sdk_offset_zero.py` 3 cases (constructor, continuity
+ after a zero watermark, the real gRPC transport decode yields offset 0):
+ before 3 ERROR on the previous tree, after OK; 67 SDK/consumer tests OK
+ (`test_qdl_sdk_release`, `test_sdk_client`, `test_qdl_sdk_read_reconnect`,
+ `test_qdl_sdk_replica_read_transport`, `test_qdl_sdk_stream_projection`,
+ `test_qdl_sdk_feed_status`, `test_fund_phase5_stream_sdk`,
+ `test_fund_phase5_consumer`) | runtime NONE | next: shadow packet.
+- 2026-09-25: **K4 slice 6 (K4.6 harness modes for the shadow, no new
+ engine)** | this commit | `scripts/phase3_consumer_load_acceptance.py`:
+ optional profile fields `scope` (`production`|`shadow`, recorded in
+ `host.json`, never relaxes a gate) and `monitored_containers` (a shadow run
+ watches its own containers for restarts; the production TS heartbeat is
+ still sampled - it is the packet's stop condition, not a shadow consumer;
+ Python projector spans are skipped in shadow); new mode `kn4-matrix`
+ (schema `qdl.kn4.read-plane-matrix.v1`) = the existing `target-matrix` plus
+ the 2,500/5,000/10,000-row history ladder (contiguous ordered opens, never
+ more rows than asked, a short window only with FULL coverage), strict
+ batches 1/8/16/32/50 with per-item watermarks, the freshness verdict per
+ read (a 1 ms bound must be refused on the product a normal bound serves),
+ every public HTTP operation of the KN-1 inventory (no `kn3-source`
+ placeholder in any body), snapshot -> stream handoff through the real SDK
+ (first offset strictly after the watermark, acknowledged) and replica
+ parity at an equal watermark. `scripts/kn_native_slice_probe.py matrix
+ --read-view 1`: GetSnapshot/GetFeedStatus must answer (a snapshot whose v3
+ cursor verifies as the Stream verifies it, or a status) or refuse typed
+ (FAILED_PRECONDITION `{CODE}:`, RATE_LIMITED); UNAVAILABLE/INTERNAL fail.
+ Tests: `test_kn_native_slice_probe` (+2 `ReadViewVerdictTests`),
+ `test_phase3_consumer_load_driver` (+1 shadow profile), with
+ `test_phase3_consumer_load`, `test_phase3_target_driver`: 91 OK | runtime
+ NONE | next: shadow packet and run.
+- 2026-09-25: **KN-4 K4.5/K4.6 isolated shadow runtime packet (recorded
+ before start).** Scope: disposable `kn4-*` services; production is read,
+ never written; no production Kafka, Redis, ACL or group is touched.
+ - Candidates (all from `ccec85c`; Rust tree identical to `29df556`):
+ release `qdl-projector` sha256 `2a6ffd8e...a99bf`, `qdl-stream-gateway`
+ `d4c8ed40...a75a2d` (built in `qdl-rust-builder:r134-test`, private
+ target dir), mounted read-only into `qdl-v2-rust:2.0.26-62241bc`; Python
+ image `qdl-v2-python:kn4-ccec85c` `sha256:2cd464f7...030b9` = the running
+ `qdl-v2-python:2.1.1-83fa1bc@sha256:dd065fdf...` plus the exported tree
+ (the same final-layer recipe; no dependency change); gateway bundle
+ `e8aa9c95...` (equal to KN-2's), catalog `2072202c...` (equal to the
+ running Query's).
+ - Reads of production (read-only): the `stable_state` volume (`mode=ro`,
+ `query_only`, primary-key / `committed_at_ns` indexes only) for the
+ capture of the demanded keys, the legacy BAR import (`--isolated`) and
+ the near-live tail (`kn_native_slice_probe.py load --phase tail`, one
+ indexed range query per 250 ms, bounded by `--live-seconds`); the
+ runtime dir `r135-b2-335792a.../runtime` and the stable TLS volume
+ read-only; `session-liveness` of the stable state read-only (Query
+ session quality); the running Query's env via `docker inspect` (only
+ public JWT keys and non-secret settings are kept - fresh shadow secrets
+ replace every secret); the production TS heartbeat through the harness's
+ existing `docker exec market_data_service` read (stop condition).
+ - Services (prefix `kn4-`, `--rm`, network `kn4-net` `--internal`; the two
+ Query replicas also join `kn4-egress` (plain bridge) for the bounded
+ venue REST of reference/pass-through reads - at most a few requests per
+ minute, as production Query does): `kn4-kafka` (stack Kafka digest,
+ 1 CPU / 1.5 GiB, `md.canonical.v2` 6 partitions delete, `md.latest.v2` /
+ `md.bars.v2` 6 partitions compact as KN-3); `kn4-cache` (stable Redis
+ digest, D6 config, `maxmemory` 1500000000, 0.5 CPU / 1792 MiB);
+ `kn4-quota` (quota/identity Redis, 0.1 CPU / 64 MiB);
+ `kn4-proj-a/-b` (0.5 CPU / 256 MiB); `kn4-stream-a/-b` (aliases
+ `qdl-v2-stream-a/-b` in the stream SAN, 0.5 CPU / 256 MiB, read view ->
+ the shadow Query pair, stream TLS identity read-only); `kn4-query-1/-2`
+ (aliases `query_v2_1`/`query_v2_2`/`qdl-v2-query` in the Query SAN,
+ 1.5 CPU / 1 GiB as production, `QDL_STABLE_QUERY_BACKEND=kn3`, state dir
+ = a scratch dir); loaders/tail/harness clients in the kn4 image
+ (`--rm`, bounded CPU/memory). Peak ~9 GiB RAM / ~6 vCPU during stage 35
+ (host 15 GiB available at start); nothing persists after cleanup.
+ - Steps: (1) capture demanded keys + history load; (2) legacy BAR import
+ into the isolated `md.bars.v2`; (3) projectors A/B (cold build, READY
+ count); (4) Stream A/B + Query 1/2, near-live tail for the window;
+ (5) `kn_native_slice_probe.py matrix --read-view 1` (all four RPCs,
+ negative matrix, GetSnapshot/GetFeedStatus through the read view);
+ (6) `phase3_consumer_load_acceptance.py --mode kn4-matrix` (K4-T01..T05
+ on both replicas); (7) stages 20 and 35 (`--mode target`, frozen
+ workload, K4-T06/T08, four latency quantities); (8) TS/alpha read
+ adapters no-order scenarios (K4-T07), incl. V1 fallback/return reads of
+ the running V1 service (read-only) and BLOCKED; (9) recovery probes
+ (Query replica stop/start, Stream failover, projector kill) as needed.
+ - Stop at once (automated guard) if host idle < 5 % for 60 s, the
+ production TS ready routes drop, or any production container restarts;
+ each step bounded (<= 30 min), whole window <= 4 h.
+ - Rollback: stop the `kn4-*` containers; production unchanged by
+ construction (no route, target, env or image of a running service
+ changes). Cleanup: containers, networks, anonymous volumes = 0; shadow
+ keys, env files, capture and scratch state deleted; image
+ `qdl-v2-python:kn4-ccec85c` kept until the KN-4 review (KN-5 candidate)
+ or removed by digest; evidence hashed into
+ `/home/bobby/.local/state/qdl-v2/kn4-20260925/evidence`.
+- 2026-09-25: **K4 slice 7 (fixes found by the full suite and the first
+ shadow runs)** | this commit |
+ - **Regression from slice 3, fixed:** the full suite (exported tree,
+ verbose, faulthandler) hung at
+ `test_read_plane_phase1_diagnostics.test_worker_shutdown_cancels_the_bounded_scan_without_a_stuck_task`.
+ The bounded gap scan stops cooperatively on a flag the caller set in
+ `finally`, i.e. after the await returned; `await_in_thread` now holds the
+ caller until the thread ends, so flag and thread waited on each other
+ (a shutdown would hang the same way). `await_in_thread(on_cancel=...)`
+ signals such a worker at the cancellation; the gap scan passes its flag.
+ Slice 3's receipt listed the suites run - this one was not among them.
+ - `tests/test_phaseb_stable_release.py` still pinned SDK `2.0.3` (slice 5
+ missed it); the same test proves the OpenAPI snapshot is unchanged
+ (11 paths, 68 schemas).
+ - Harness (found by running `kn4-matrix` in the container, not by unit
+ tests): the inner config refused the `budget`/`final` fields for
+ `kn4-matrix`; the host kept only `qdl.phase3.target-` receipts; a
+ client failure before its receipt is now recorded (`client_failure`,
+ payload-free); the HTTP checks now send the exact manifest requirement
+ (`query_params()` - the entitlement match includes the recency/session
+ fields; the first run's 403s were the test's); the freshness check
+ follows the manifest contract (strict BAR -> `DATA_STALE`; quiet-policy
+ ON_CHANGE QUOTE -> served with `event_recency_state` STALE and
+ `LAST_EVENT_STALE`); handoff needs >= 1 event after the watermark (a
+ 1m BAR has ~1/min, a thin OKX pair may not trade 3 times in 45 s).
+ Full suite on this tree: 2,180 tests, 1 failure (the SDK pin above, fixed
+ and rerun OK), 31 skipped, no hang; affected suites (diagnostics, cold
+ work, lanes, harness, probe, release) OK | runtime: the shadow of the
+ packet above | next: stages 20/35, receipt.
+- 2026-09-25: **KN-4 shadow run receipt (executed per the packet; stopped
+ on the TS stop condition).** Evidence
+ `/home/bobby/.local/state/qdl-v2/kn4-20260925/evidence` (SHA256SUMS
+ `30086d0d...`). Candidates as packeted (`ccec85c`; slice 7 changed only
+ the gap-scan shutdown and the harness, which is mounted from the repo).
+ - Setup: capture 66,961 committed records of 190 demanded keys
+ (`b1285d07...`), legacy BAR import PASS 941,698 rows / 140 of 144
+ bindings (`cfe9b637...`); cold build 206 of 216 products READY in ~3 min
+ (the 10 are products without source data: DNSE and 4 BAR bindings
+ without rows); **all 140 BAR products with data had a canonical
+ source coordinate - `SOURCE_BOUNDARY_UNKNOWN` = 0** (D27 gate).
+ - Input gap caused by the orchestration, not the read plane: the tail
+ started at its own start time (~4 min after the import) and was paused
+ for the probe rerun, so 1m BARs had missing opens and every read
+ returned typed `OPEN_SEQUENCE_GAP` (the correct outcome). Fixed by
+ rerunning the idempotent import (941,798 rows, `e8c21785...`).
+ - K4-T01 all-RPC Stream matrix (`kn_native_slice_probe.py matrix
+ --read-view 1`, both Stream replicas, 292 subscriptions, 6 consumers):
+ with a bounded 60 s input as in KN-2 **PASS** (`1a8729bb...`); negatives
+ 24/24; Replay exact; GetSnapshot through the Query read view with a v3
+ cursor the Stream accepts, GetFeedStatus LIVE, VN typed
+ `DATA_NOT_READY`. The first run with a continuous input "missed" the
+ records committed after each subscription closed (oracle read at the
+ end, input still flowing) - method, kept as evidence; 0 duplicates, 0
+ out-of-order, 0 token errors in both.
+ - K4-T01..T05 `kn4-matrix` on both Query replicas (`kn4-matrix-084443`):
+ target matrix 132/132; history ladder 48/48 (2,500/5,000/10,000 rows of
+ 1m/1h/4h/1d, contiguous, FULL, 10k 1m ~8.5 s wall under the cold duty
+ cycle); strict batches 1/8/16/32/50 20/20; per-read freshness 8/8
+ (strict BAR refused `DATA_STALE` under 1 ms, quiet-policy QUOTE served
+ with `event_recency_state` STALE); every public HTTP operation 18/18,
+ no placeholder in any body; replica parity 24/24 (9 pairs at an equal
+ watermark byte-equal); handoff 15/16 at that run (a thin OKX BNB swap
+ traded < 3 times in 45 s; criterion changed to >= 1 event, not rerun).
+ Earlier runs failed on harness defects fixed in slice 7.
+ - K4-T07 consumers (`consumer-scenarios.json` `39a381ab...`): TS read
+ adapter (its image, SDK 2.0.3, test identity): V2 primary trade/kline/
+ stream view OK; Query unreachable -> every route BLOCKED
+ (`policy blocks fallback`, binding r10 has `fallback: BLOCKED`
+ everywhere; `parity.blocked` 3, V1 never called); restored -> V2.
+ Alpha gateway (unsealed, as the compose example): V2 primary OK;
+ unreachable -> trade fell back to V1 (read-only, via a forwarder so no
+ production Query name resolved), kline/warmup ended BLOCKED because the
+ V1 leg also failed (alpha/V1 side, outside KN-4; varied between two
+ runs); execution-context book read refused without a sealed binding in
+ every phase; restored -> V2. The current alpha sealed binding could
+ not be compiled (the inventory is the source declaration, the compiler
+ needs the resolved one) - not done.
+ - K4-T06/T08 stages (frozen v2.1.1 workload, alpha identities): **stage 20
+ PASS, all gates** (`stage-20-091755`). **Stage 35 run 1**: every shadow
+ gate PASS - latency p95/p99 QUOTE 19.5/30.6 ms (BINANCE, n 1,260),
+ MARK/INDEX 20.4/33.3 ms (n 1,980), L2 46.1 ms p95, BAR latest 43.8 ms
+ p95, TRADE 26.2 ms p95, 0 failed/missed, streams clean, cold
+ 2,500/5,000 overlap PASS - but `ts:ready_60_every_sample` FAIL: the
+ production TS showed 59/60 in 5 of 20 samples (3 = the owner-approved
+ OKX DOGE QUOTE quiet exemption, 2 = OKX SOL BOOK_DELTA DISCONNECTED).
+ **Run 2**: shadow `kn4-query-2` OOM-killed (docker event `oom`, exit
+ 137) - Query peak memory was 632-710 MiB at stage 20 and 930-992 MiB at
+ stage 35 of its 1 GiB limit, and `kn4-query-1` held 932 MiB idle after
+ the load. **Run 3** (both Query restarted, peak 441-461 MiB): failed
+ requests (5 `DATA_STALE`) and 30 stream errors, and the production TS
+ lost MARK/INDEX (execution path, `SOURCE_UNAVAILABLE`, 99 disconnects
+ in 4.5 min, 24.5/min vs 0.6 baseline) and QUOTE slices. **Stop
+ condition -> the whole shadow was torn down at 09:32:26**; TS
+ disconnects then 1 in 75 s. Context: the same MARK/INDEX disconnect
+ occurred 2,083 times in the previous 24 h (592/346/280 per hour on
+ 09-24 14-16 h, during the KN-3 flow runs on this host); host idle 17-34 %
+ during run 3; no production container restarted
+ (`production-restart-diff.txt` empty). **Causality between shadow load
+ and the production execution MARK/INDEX path is not proven either way.**
+ - Not done: the four latency quantities report
+ (`report_feed_latency_quantities.py` still reads the spool, not
+ adapted); the Query memory root cause (row cache ~2.8 KB/row x 20,000 is
+ small next to 930 MiB; per-request bodies and allocator retention are
+ the suspects - measured, not concluded); stage 35 clean; T07 on a sealed
+ alpha binding.
+ - Cleanup: `kn4-*` containers 0, networks 0, anonymous volumes 0 (7
+ dangling volumes all predate today, untouched); shadow keys, env files,
+ capture, cursor/state dirs deleted; scratch exports/build trees
+ deleted; kept: release binaries (`bin/`, SHA256SUMS), orchestration,
+ bundle, harness profile (no secret), image `qdl-v2-python:kn4-ccec85c`
+ `2cd464f7...` (the KN-4 candidate for a resumed shadow; remove by
+ digest at KN-4 close or when superseded). Runtime mutations of
+ production: NONE (reads only, plus one read-only `docker exec
+ sha256sum` in `query_v2_1` for the catalog hash and the harness's TS
+ heartbeat reads).
+ - **Owner decision gate before any further shadow load:** (a) whether the
+ production execution MARK/INDEX sensitivity is investigated first or
+ load resumes with a TS stop watcher; (b) Query memory: optimise and
+ re-measure before any limit change (standing owner rule).
+- 2026-09-25: **Owner decision after the stopped shadow run (recorded before
+ code; D35-D41).** Keep the KN architecture (Rust canonical/stream/
+ projector, market cache behind Query, Python API/SDK compatibility); no
+ new phase; finish in KN-4, then KN-5 closes the program (no KN-6).
+ - **D35 MARK/INDEX correctness, not timeouts.** Published cadences differ
+ (Binance USD-M `@markPrice@1s` carries MARK and INDEX in one message;
+ OKX mark-price 200 ms on change / 10 s unchanged; OKX index-tickers
+ 100 ms on change / 1 min unchanged). The configured internal bounds
+ (Binance both 5 s, OKX MARK 15 s, INDEX 70 s) stay; verify their
+ application: per-instrument/component pairing, separate MARK/INDEX
+ timestamps and provenance (a new component never refreshes an old
+ one), event age vs component confirmation vs session liveness vs
+ pipeline lag vs execution eligibility kept distinct; disconnect,
+ generation change, missing component or wrong lineage fail closed; the
+ read time never replaces a source timestamp; DOGE and the strict
+ execution policy are not relaxed; quiet policy only per manifest.
+ - **D36 Read boundary fails closed.** `latest_stored_event()` turned every
+ `QueryBackendError` into `None` and `CacheRefreshingMarkIndexView` could
+ then serve a remembered price: a cache error, a lost generation and
+ absent data become indistinguishable. Distinguish them; a fencing or
+ integrity failure (or the product losing its state) invalidates the
+ remembered record; a transient failure reuses nothing unless the
+ contract proves validity. Regression: good read -> cache error /
+ generation change / broken lineage -> read again.
+ - **D37 Narrow TS investigation first**, same timestamps: typed errors,
+ session/component, Kafka lag, cache apply, Query queue, cgroup CPU
+ throttling, memory pressure and disk latency (host idle does not rule
+ out one throttled container or a saturated core/I/O). The watcher stays
+ a guard, not a diagnosis.
+ - **D38 No spool in the live shadow input.** Captured/replayed data only
+ for correctness/load; the live measurement reads production canonical
+ Kafka `read_committed` with the existing reader, a separate scope, no
+ group commit, no production offset change; the history import joins the
+ live tail by a continuous watermark (overlap, idempotent), never by the
+ wall clock.
+ - **D39 OOM before RAM.** Measure heap/RSS per request and across
+ repeated rounds; separate leak from allocator retention; bound bytes in
+ flight, queue depth and cache bytes; remove the protobuf -> object ->
+ JSON duplicate copies; keep permits until the worker ends. 10k history
+ and the consumer count are not reduced. Native (Rust) work only where
+ the profiler proves Python/GIL is the bottleneck. If a bounded working
+ set still needs more than 1 GiB, raise the cap to the measured peak plus
+ headroom with before/after evidence.
+ - **D40 Real consumers and provenance.** Resolve the alpha inventory and
+ compile the sealed alpha binding; test execution-context/L2, allowed
+ fallback and BLOCKED. The candidate image must contain `abd036c` and
+ later fixes; `ccec85c` certifies nothing new.
+ - **D41 Tests and gates.** Handoff by a fixed boundary/watermark with the
+ whole window's records compared (quiet-live separately; captured
+ provider replay where events must be deterministic), not "N events";
+ the matrix covers the agreed endpoints/bindings (11 HTTP, 4 RPC,
+ BAR/intervals/history, trade/quote, L2, reference, diagnostics; batches
+ 1/8/16/32/50; history 2.5k/5k/10k; two replicas; cursor/reconnect/
+ fallback); report consumer-call -> usable, durable event age, delivery
+ lag and event -> consumer-cache applied, MARK/INDEX per component, with
+ errors/timeouts/unserved load in the denominator and no received_at
+ posing as Kafka commit time; frozen budget, same-workload baseline;
+ stage 35 clean of OOM, worker leak, data loss and eligibility errors;
+ no C2 as a bug detector; unchanged evidence inherited.
+ Order: D36 (source, small) and D37 in parallel, then D38, D39, D40, D41,
+ then shadow reruns with the watcher.
+- 2026-09-25: **K4 slice 8 (D36 MARK/INDEX read boundary fails closed)** |
+ this commit | `KnMarketCacheQueryBackend.latest_stored_event` returns
+ `(stored, OK)` or `(None, NOT_READY|UNAVAILABLE|INTEGRITY|FENCED)`;
+ `CacheRefreshingMarkIndexView.read` drops the remembered record and answers
+ `MARKET_CACHE_` (or `LINEAGE_INVALID` when the envelope is not a
+ MARK/INDEX of the binding or `remember` refuses its provenance) - the
+ endpoint turns it into its typed 409, the reader into
+ `SOURCE_UNAVAILABLE`. No transient reuse (validity cannot be proven from
+ the cache failure). New regression
+ `test_the_mark_index_view_never_answers_a_cache_failure_with_a_remembered_price`
+ (good -> cache error -> recover -> integrity -> lost state -> other topic
+ generation -> new generation served -> broken lineage): before FAIL on
+ `dd94e2f` (the remembered record was served on the cache error), after OK;
+ `test_kn_query_backend` 19, `test_phase113_reference_v2` +
+ `test_phase104_reference_batch` OK | runtime NONE | next: D35 audit, D37.
+- 2026-09-25: **D37 result (read-only diagnosis, no mutation).** The TS text
+ `SOURCE_UNAVAILABLE ... did not return a current active record` exists only
+ at `qdl/reference/execution_live.py:211`; `_bounded_reason` (`:233-249`)
+ collapses COMPONENT_STALE/SESSION_*/QUIET_POLICY/LINEAGE into NOT_READY and
+ the per-URL errors are dropped, so the exact reason is not recoverable from
+ logs (a diagnosability gap, recorded for D41). Excluded by evidence: lease
+ change (all 6 production projectors: `stream_v2_active` 409 / passive 200
+ for the whole 07-10h window), STALE/GAP/IDENTITY (would surface as other
+ codes), ingestor session change (0 log lines 08:50-09:45). Same timestamps:
+ production raw input rose 2-3x (kafka1 segment rolls: raw p4 130-190/s ->
+ 316/s from 09:24:44, 443/s 09:28:08-09:30:52; started BEFORE run 3);
+ `rust_core_2` (0.5 CPU, 28% of periods throttled cumulatively) reached
+ raw_age 18.6 s and expired +560 MARK/INDEX components (core_1/3: +0); the
+ lease-holding stream ingest saturated (appends ~200 -> 40-65/min per
+ projector, mean 0.9-1.4 s, max 5.2 s; canonical age up to 48.7 s) and sits
+ at its 1 GiB memory limit (457,599 max events, page-cache refaults, 1,982 s
+ cumulative I/O pressure) on one EBS volume running ~3,000 write IOPS.
+ Onset/recovery of both TS episodes (09:28:10-09:30:19, 09:31:00-09:32:34)
+ match to seconds; Binance fails ~5 s and OKX ~18 s after onset (the 5 s /
+ 15 s component bounds) -> most likely COMPONENT_STALE (inference). The
+ 2026-09-24 08-16h peaks show the same signature. Verdict: a production
+ capacity limit hit by an input burst; shadow contribution INCONCLUSIVE,
+ not primary (run 1 took host idle to 15% with no effect; shadow cgroups
+ unthrottled); host idle 9% at onset keeps contention possible. For every
+ further watched run: production cgroup cpu/io/memory samples every 5 s,
+ `/proc/diskstats` + PSI, raw ingress per partition, core raw_age, and load
+ started only at baseline ingress. Raw extracts in the session scratchpad
+ (not evidence of record).
+- 2026-09-25: **D35 audit result (read-only, `7a6dbd7`).** Verified: bounds
+ are configured per component (`config/v2/stable-acquisition-bindings.yaml`
+ 10 entries: Binance BOTH 5000; OKX MARK 15000 / INDEX 70000) and applied in
+ the Rust core at pair emission (`rust/qdl-realtime-core/src/lib.rs:892-903`,
+ `MARK_INDEX_COMPONENT_EXPIRED`) and again at the Query edge
+ (`qdl/data_quality/execution_mark_index.py:74-85`); separate MARK/INDEX
+ slots with own price/ts/receipt/capture (`lib.rs:385-401, 853-860`), older
+ ts ignored, same-ts different price quarantined; generation/session
+ changes quarantine or reset both slots; nothing emitted until both
+ components exist; processing time never enters the envelope; the OBSERVE
+ path checks lineage, exact session, component ages; quiet policy only via
+ manifest (`api_v2/router.py:980-982`, `manifest.py:112-128`); no DOGE or
+ symbol special case. Defects: **(1)** `execution_mark_index.py:246` catches
+ an unimported `DecodeError` (NameError on a corrupt hydration row);
+ **(2)** the strict (non-OBSERVE) read and the KN cache view serve a
+ MARK/INDEX record without checking its pair lineage; **(3)**
+ `mark_index_lineage.py` does not bind the envelope times to the components
+ (min source ts / min receipt) and accepts component ts 0; **(4)** the
+ component bound is optional in the plan validator (all 10 bindings set it);
+ **(7)** the strict path clamps a future anchor to age 0. Decision: fix
+ 1/2/3/4(Python validator)/7 in one tested slice. Not fixed here, recorded:
+ (5) the Rust pair state has no lane rule and OKX generation files are
+ positional - renumbering lanes without a core restart would quarantine
+ pairs as StaleGeneration (fail closed, availability) -> owner item;
+ (6) OKX chunking could split a pair only with an odd cap (cap 100, safe);
+ (8) the view gates on `state` not `execution_eligible` (equivalent today);
+ pipeline lag is not a separate input (a core stall reads as a stale
+ component) -> D41 diagnostics.
+- 2026-09-25: **K4 slice 9 (D38 canonical mirror)** | this commit |
+ `scripts/kn_canonical_mirror.py`: `start` resolves per-partition source
+ offsets by time (`offsets_for_times`) and writes them before the history
+ import; `run` reads `md.canonical.v2` `read_committed` in assign mode (no
+ group join, no commit, no offset store) and re-publishes bundle products
+ (Kafka key = bundle physical key and bound payload feed; others counted by
+ reason, never sent - stage A stops on them) to the same partition of an
+ isolated broker in transactions, keeping key/value/headers/timestamp plus
+ `qdl-mirror-source-{partition,offset,timestamp}`; the commit log adds the
+ source Kafka timestamp to the probe's `{partition, offset, commit_ns}`
+ shape. Refuses `kafka1..3`/`qdl_v2_stable_candidate*` destinations, a
+ start file not covering every source partition, and a destination topic
+ with a different partition count (production canonical has 6,
+ `docker-compose.v2-stable.yml:460`). Tests `tests/test_kn_canonical_mirror.py`
+ 4 OK on the disposable broker (`kn3-lead-kafka`): aborted source records
+ (flushed, then aborted) are never mirrored, the start by time lands on
+ the aborted offset and read_committed skips it, the committed record
+ carries source offset 2, out-of-bundle records are counted and dropped,
+ no `kn-shadow-mirror-*` group exists afterwards. First run of the test
+ failed because the aborted batch was purged before reaching the broker
+ (test bug, fixed by flushing) | `tested locally`; runtime NONE (the
+ production read is a separate journaled packet) | next: D35 fixes, then
+ the D38 packet.
+- 2026-09-25: **K4 slice 10 (D35 fixes 1-3)** | this commit | (1)
+ `qdl/runtime/execution_mark_index.py` imports `DecodeError`: a corrupt
+ hydration row is the typed `ValueError`, not a `NameError`. (2)
+ `ExecutionMarkIndexLiveView.remember` requires the Rust pair lineage
+ (`paired_mark_index_lineage`) for every retained record, so the strict
+ (BLOCK) read and the KN cache view (`CacheRefreshingMarkIndexView`, which
+ turns the refusal into `LINEAGE_INVALID`) no longer serve a MARK/INDEX
+ record without proof; the ingest path already validated it
+ (`stable_ingest.py:203`), so no new failure mode there. (3)
+ `mark_index_lineage.paired_mark_index_lineage` refuses component source
+ time 0 and envelope clocks that are not the components' oldest
+ (`source_event_time_ns == min(source ms) * 1e6`,
+ `received_at_ns == min(receipts)`, exactly the Rust emission
+ `lib.rs:904-906, 943`); checked on the two real golden MARK/INDEX records
+ (Binance and OKX, provenance "real records read from the stable spool"),
+ both satisfy it. A read-only check on the production spool was refused
+ by the session's permission classifier and not attempted another way.
+ Not changed, with reason: (4) an absent component bound is fail-closed
+ already (OBSERVE refuses `QUIET_POLICY_UNAVAILABLE`, the strict read keeps
+ the 2 s event bound) - no defect; (7) the future-anchor clamp is the same
+ on the quiet path (`:517`) and receipts are same-host clocks; a tolerance
+ would be a new invented bound, so none is added; (5) goes to the owner.
+ Tests: new `test_a_corrupt_durable_row_is_a_typed_hydration_failure`,
+ `test_the_strict_read_never_retains_a_pair_without_its_lineage` (5
+ damages) and KN case 7 in
+ `test_the_mark_index_view_never_answers_a_cache_failure_with_a_remembered_price`;
+ before (HEAD source): NameError + 4 damages retained; after OK. Fixtures
+ that built MARK/INDEX without lineage (the gap itself: 8 live-view tests,
+ 2 KN tests) now carry Rust-shaped lineage. `test_execution_mark_index_live_view`
+ + `test_kn_query_backend` 53 OK; full suite 2,187 OK / 10 skipped
+ (image `qdl-v2-python:2.1.1-83fa1bc`, disposable kn3-lead Redis/Kafka) |
+ `tested locally`; runtime NONE | next: D39 measurement (isolated), D38
+ runtime packet with the D37 watch set.
+- 2026-09-25: **D38 method note.** The KN projector cannot read production
+ canonical directly: stage A uses one bootstrap for the canonical source and
+ the state topics and commits offsets in the producer transaction
+ (`rust/qdl-projector/src/kafka_pipe.rs:159-177`), which would write state
+ topics and a consumer group on the production cluster. The shadow therefore
+ keeps the existing KN reader on the isolated broker and feeds it with the
+ slice-9 mirror (assign mode, no production write of any kind).
+- 2026-09-25: **K4 slice 11 (D39 Query memory: measure, then bound)** | this
+ commit | Method: a scratch bench (session scratchpad, not evidence of
+ record) drives the real HTTP warmup (`TestClient` -> router -> service ->
+ KN backend -> real Lua reads) on the disposable kn3-lead Redis, one 1h BAR
+ product with 10,010 cached rows, image `qdl-v2-python:2.1.1-83fa1bc`;
+ tracemalloc for Python heap per stage, `/proc/self/status` for RSS/HWM,
+ `malloc_trim(0)` after the rounds. **Before** (at `c0f86e0`): per request
+ heap peak 51.4 / 101.9 / 202.5 MB for 2.5k / 5k / 10k rows (body 6.8 /
+ 13.7 / 27.4 MB); of the 10k peak, `_warmup` built every `MarketDataView`
+ first (109.6 MB retained = ~11 KB/row) and the chunked render added 82.8 MB
+ (str parts + joined str + bytes); the KN row cache is 2,819 B/entry
+ (26.9 MB for 10k rows, <= 56 MB at the 20k default) - not the cause. Across
+ 6 sequential 10k rounds RSS ratcheted 410 -> 510 MB (HWM 567) while the
+ Python heap retained only 7-41 MB per request; with `MALLOC_ARENA_MAX=2`
+ the same run is flat at 380 MB (HWM 441) and trims to 288 -> the growth is
+ glibc arena retention, not a Python leak. Renders ran on the loop's default
+ executor (host `nproc` 16 -> up to 20 threads, each able to keep a
+ ~200 MB arena high-water), and the batch render used `asyncio.to_thread`,
+ which releases the local lease on cancellation while the thread still
+ renders. Fix: (1) `_render_warmup_result` renders views one 250-row chunk
+ at a time from the result (never all views), (2) each piece is UTF-8
+ encoded as made (no whole-body str next to its bytes), (3) all large
+ renders run on a fixed 2-thread `qdl-query-render` executor via
+ `await_in_thread`, so the batch render also holds its lease through
+ cancellation. Bytes unchanged (existing byte-identity tests plus a new
+ equality with the model renderer). **After** (same bench): heap peak 18.1 /
+ 34.8 / 68.4 MB (-66% at 10k; render stage 55.9 MB); 6 x 10k RSS plateau 391
+ (HWM 394) default arenas, 358 flat (HWM 358) with `MALLOC_ARENA_MAX=2`;
+ 10k latency 5.6-6.0 s -> 5.0-5.2 s. Not changed, with reason: the local
+ lane's 1 KiB/row reservation is a queue-depth budget (queued waiters hold
+ no rows; the memory bound is `max_active=1`, `service.py:288-299`); raising
+ it to the measured ~7 KB/row would reinstate the 09-23 cold-start
+ `RATE_LIMITED` refusals. No Rust work: a cProfile of the 10k render shows
+ `_market_item` 3.5 s (Decimal text checks, Pydantic validation, `asdict`)
+ and 2.06 s of deliberate `cold_yield` sleeps, json 0.33 s; the guide applies
+ no latency budget to a whole warmup (`upgrade/...REVIEW.md:2357`) and its
+ P2.5 criterion is hot p95/p99 during a 5k warmup, met in stage 35 run 1
+ (QUOTE 19.5/30.6 ms) - no measured gate violation justifies native render.
+ Deployment setting carried to the shadow/KN-5 packet: `MALLOC_ARENA_MAX=2`
+ for Query (measured above). The stage-35 OOM (930-992 MiB of 1 GiB) is
+ CONSISTENT with these two mechanisms but not proven by this bench; the
+ watched stage 35 rerun must show it (memory sampling kept). Tests: new
+ `test_the_batch_render_holds_its_lease_through_cancellation`,
+ `test_large_renders_never_use_the_loops_default_executor` (before: FAIL
+ both - `asyncio_0` threads, the batch task finished while its thread still
+ ran; after OK); `test_query_cold_work` 10, `test_fund_phase5_api` 15,
+ `test_kn_query_backend` 19 OK (one combined invocation was killed with exit
+ 137 before printing; rerun per module OK); full suite 2,189 OK / 10 skipped |
+ `tested locally`; runtime NONE | next: D40 (alpha inventory, sealed
+ binding, candidate image), then the D38/D41 watched packet.
+- 2026-09-25: **K4 slice 12 (D41 handoff by a fixed boundary, whole window)**
+ | this commit | `scripts/phase3_consumer_load_acceptance.py` kn4-matrix: the
+ sequential "at least one event within 60/75 s" handoff is replaced by
+ `_kn4_fixed_window_handoffs` - every (replica x venue x feed) handoff opens
+ at once through the real SDK (`warmup_then_stream`), streams for one fixed
+ 90 s window, the boundary is every canonical partition's end offset at the
+ close (`canonical_end_offsets`), the oracle is the isolated canonical log
+ from 120 s before the window to that boundary
+ (`kafka_oracle_window`, read_committed, assign mode), sessions drain up to
+ 30 s to reach the last expected offset, and `kn4_handoff_verdict` judges
+ every record after the snapshot watermark and inside the boundary with the
+ KN-2 rules (`expected_delivery` / `judge_subscription`: no missing
+ lossless record, coalesced records only when superseded, no duplicate,
+ reorder or unexpected offset, first event after the watermark). A product
+ without a record in the window is `quiet_live`, reported separately, never
+ an event PASS; no oracle broker -> every handoff FAIL (never skipped).
+ Profile field `oracle_bootstrap` (shadow scope only, never `kafka1..3`)
+ reaches the inner config for kn4-matrix only. `scripts/kn_native_slice_probe.py`
+ gains `canonical_end_offsets` and `kafka_oracle_window`. Tests:
+ `WindowOracleKafkaTests` on the disposable broker (records before the
+ window, an aborted batch and records after the boundary excluded; committed
+ offsets exact), `Kn4FixedWindowHandoffVerdictTests` (4, real golden TRADE
+ record: whole window in order once, a missing tail inside the boundary
+ fails, after-boundary events counted not judged, watermark start, quiet
+ product), profile/inner-config cases; `test_phase3_consumer_load_driver` +
+ `test_phase3_consumer_load` + `test_phase3_target_driver` 63 OK,
+ `test_kn_native_slice_probe` 35 OK | `tested locally`; runtime NONE |
+ open in D41: the KN-2 probe matrix still reads the whole canonical topic
+ (`kafka_oracle`) and labels latency as capture replay - with the mirror it
+ needs the window oracle and the production-record-timestamp -> client
+ quantity (the mirror commit log carries `source_timestamp_ms`; it is the
+ production record's CreateTime, reported as such, never as a commit time).
+- 2026-09-25: **K4 slice 13 (D38/D41 probe matrix over the mirrored live
+ log)** | this commit | `scripts/kn_native_slice_probe.py matrix
+ --source-mode mirror`: the oracle is one fixed window
+ (`--oracle-back-seconds`, default 600, to every partition's end at the
+ read) instead of the whole topic; a product without a record in the window
+ is listed in `unsampled_in_window` and not streamed (no cursor from offset
+ 0 of a live log); exactness is judged as before. Latency: the commit log of
+ `kn_canonical_mirror.py` gives the isolated transaction commit (existing
+ `commit_to_client_after_live_ms`, now labelled with its basis) and
+ `production_record_timestamp_to_client_ms` from the production record's
+ CreateTime only (LogAppendTime and capture rows give none; labelled "not a
+ commit time"). Capture mode is unchanged. Tests `MirrorSourceModeTests` (2);
+ `test_kn_native_slice_probe` + `test_kn_canonical_mirror` 41 OK |
+ `tested locally`; runtime NONE | next: candidate image rebuild, D38/D41
+ runtime packet.
+- 2026-09-25: **KN-4 D38/D40/D41 watched shadow packet (recorded before
+ start).** Same isolated `kn4-*` topology, limits and cleanup as the first
+ shadow packet above, with these differences:
+ - Candidate: `qdl-v2-python:kn4-c328974` `sha256:035f2372...` (FROM the
+ running `2.1.1-83fa1bc` + `git archive c328974`; contains `abd036c`,
+ `7a6dbd7` and slices 9-13); superseded candidates `kn4-ccec85c`
+ `2cd464f7...` and `kn4-f708ba3` `51a41ce8...` removed by digest (no
+ container referenced them). Rust binaries unchanged (`2a6ffd8e...`,
+ `d4c8ed40...`; the Rust tree has not changed since `29df556`).
+ - Live input (D38): no spool capture/tail. `kn4-mirror-start` then
+ `kn4-mirror` (`scripts/kn_canonical_mirror.py`, 0.2/0.5 CPU, 128/256 MiB,
+ `--rm`) join the production network
+ `qdl_v2_stable_candidate_stable_internal` and read `md.canonical.v2`
+ from `kafka1..3` with the projector client identity (stable TLS volume,
+ read-only): read_committed, assign mode, no group join, no commit, no
+ production write of any kind, <= 4 MiB/s, deadline 4 h; start offsets
+ resolved 60 s back BEFORE the legacy BAR import (the only remaining spool
+ read, `--isolated`, as before), so import and live log overlap
+ (idempotent). The mirror writes only `kn4-kafka` (a production
+ destination is refused in code).
+ - Query env adds `MALLOC_ARENA_MAX=2` (slice 11 measurement).
+ - Measurement: probe `matrix --read-view 1 --source-mode mirror`
+ (window oracle, labelled clocks); harness `kn4-matrix` with
+ `oracle_bootstrap kn4-kafka:9092` (fixed-window handoff); T07 consumers
+ with the sealed grid binding `alpha-grid.binding.json` `2cc5fdc8...`
+ (inventory `35a18db3...` 93 deployments -> 18 admitted / 75 BLOCKED,
+ compilation `faa550e9...`; TS binding unchanged); stages 20 then 35.
+ - Watch set (D37): `kn4_watch.sh` every 5 s - host PSI cpu/io/memory,
+ nvme0n1 diskstats, cgroup cpu.stat/pressure/memory.current/events for
+ 19 production roles (stream, cores, projectors, ingestors, kafka1-3,
+ Query, `market_data_service`) and every `kn4-*` container; read-only.
+ - Stop conditions (automated in `kn4_guard.sh`): host idle < 5 % for 60 s;
+ any production compose container (re)started; production TS execution
+ MARK/INDEX `SOURCE_UNAVAILABLE` >= 10 lines in 60 s (baseline at packet
+ time: 2 lines in 20 min). Load steps start only when the core progress
+ log shows no saturated batch (D37 input control).
+ - Rollback: `kn4_shadow_down.sh` (stops/removes every `kn4-*` container and
+ the two kn4 networks); no production offset, group, topic, ACL, Redis or
+ state is written, so nothing in production needs reverting.
+ - Orchestration sha256 (first 12): up `d29a1e25afe7`, steps `40d707b238c8`,
+ setup `2c2eadd55c32`, guard `40d5ec500ee4`, watch `927f97948ee7`, down
+ `5fd58af14e95`, consumers `8075573aab22`; bundle file `b4b34222687d`.
+- 2026-09-25: **Watched packet, first attempt: mirror refused by the broker
+ (fail closed).** 13:24:59 `kn4-mirror-start` resolved the six start
+ offsets (topic Describe/ListOffsets allowed); `kn4-mirror` then stopped at
+ its first fetch with `GROUP_AUTHORIZATION_FAILED` (FindCoordinator):
+ librdkafka looks up the coordinator of `group.id` even in assign mode, and
+ `confluent-kafka` refuses a consumer without `group.id` (checked on
+ `kn4-kafka`: "group.id must be set"). Nothing was written to production;
+ the shadow bring-up (legacy import) continued. Not done: no ACL change
+ (needs the owner), no production group id (would break "separate scope").
+- 2026-09-25: **K4 slice 14 (mirror group namespace)** | this commit |
+ `kn_canonical_mirror.py --group-prefix {kn-shadow-mirror-,qdl-c40-handoff-}`:
+ the unique group id (`qdl-c40-handoff-kn4-mirror-<12 hex>`) lives in the
+ prefixed read-only audit namespace the stable broker already grants the
+ projector principal for bounded control-plane readers
+ (`scripts/phaseb_bootstrap_stable_broker.py:43-46`; the C40 live handoff
+ collector `scripts/phasec40_collect_live_handoff.py:59-60` reads live
+ canonical the same way). Never joined, never committed; any other value is
+ refused by the parser. Owner note: this borrows the C40 audit namespace;
+ a dedicated `qdl-kn4-shadow-` prefix would be an ACL change (owner
+ decision). Tests `test_kn_canonical_mirror` 5 OK (Kafka case on the
+ isolated `kn4-kafka`, topics `kn4-mirror-*` created and deleted) |
+ `tested locally` | next: the mirror only is re-created from an image at
+ this commit; every other shadow container keeps `kn4-c328974` (the source
+ difference is this script alone).
+- 2026-09-25: **K4 slice 15 (mirror memory bound)** | this commit | the
+ re-created `kn4-mirror` (image `kn4-173e7b2`, `qdl-c40-handoff-` group)
+ fetched and mirrored 1,380 records, then was OOM-killed (exit 137) at its
+ 256 MiB limit within ~20 s: librdkafka prefetches up to 64 MiB per
+ partition by default (`queued.max.messages.kbytes`, six partitions) and
+ the producer queue defaults to 1 GiB. Bounded to 4 MiB per partition and a
+ 32 MiB producer queue (a transaction holds one consume batch). Test asserts
+ the bound; `test_kn_canonical_mirror` 5 OK (Kafka case on `kn4-kafka`) |
+ `tested locally`; the running measurement follows in the run receipt.
+- 2026-09-25: **K4 slice 16 (mirror restart exactness)** | this commit | the
+ killed mirror's commit log ended in a partial line (block-buffered writes
+ lost at the kill), so a resume point cannot come from it. `run
+ --resume-from-destination` starts each partition after the largest
+ `qdl-mirror-source-offset` among the isolated topic's last committed
+ records (never skips, never repeats); the commit log is line-buffered.
+ Test: the Kafka case resumes at source offset 3 on partitions 1 and 2
+ (committed record at 2); `test_kn_canonical_mirror` 5 OK on `kn4-kafka` |
+ `tested locally`.
+- 2026-09-25: **Watched shadow run receipt: STOPPED by the TS stop condition
+ before any load step; shadow bring-up is temporally associated with the TS
+ degradation.** Timeline (UTC): 13:24:59 mirror start offsets; 13:25:57
+ isolated broker up; 13:26-13:33 legacy BAR import from the production spool
+ (read-only, 942,766 rows, receipt `fae818aa...` PASS); mirror attempts
+ (group refusal, OOM, resume - slices 14-16), the resumed mirror caught up
+ from 189 s to 12.6 s lag at <= 104 MiB and mirrored 494,004 records exactly
+ (resume from the destination; no production write); 13:33:32 projectors,
+ 13:33:34 Stream/Query; 13:35:06 guard + watch started; 13:35:23 guard
+ ABORT (`MARK_INDEX ... SOURCE_UNAVAILABLE` 11 lines in 60 s), teardown to 0
+ `kn4-*` containers / 0 networks. No probe, matrix, consumer or stage load
+ ran. Production TS execution MARK/INDEX refusals per minute
+ (`docker logs market_data_service`): 13:18 2, then **13:26 33, 13:27 34,
+ 13:28 17, 13:29 12, 13:30 32, 13:31 17, 13:32 21, 13:33 27, 13:34 12,
+ 13:35 14**, after teardown 13:36 17, 13:37 9, 13:38 4 (decaying). Core_2
+ batches (`qdl_realtime_core_progress`): n 5-15k before 13:26, 22.6-25.6k
+ (full) from 13:30 to 13:37 with raw_age up to 5.9 s. Watch set (from 13:35,
+ `watch-133506.jsonl` `4d003df8...`): core_2 at its 0.5 CPU quota, 55-70 %
+ of periods throttled, host cpu PSI some avg10 20-31 %, io 10-14 %; the
+ no-shadow control 13:36:35-13:38:05 (`watch-control-133635.jsonl`
+ `2d824f42...`): core_2 still 65 % throttled (catching up), host cpu PSI
+ 15-22 %. **Reading:** onset matches the bring-up to the minute (import +
+ mirror catch-up + cold build) and the errors decay within ~3 min of the
+ teardown - the second such association (first: run 3, 09:28); D37's lean
+ "not primary" is therefore not upheld for the bring-up phase. The
+ mechanism is not proven (no IO/PSI data for 13:26-13:35 because the guard
+ and watch started after the bring-up - a process error of this run, fixed
+ in the orchestration: both now start before the first shadow action,
+ guard `5d2ac337...`, up `9f70375d...`). The production binding limit seen
+ in both D37 and this run is core_2's 0.5 CPU quota under input bursts; it is
+ a production resource decision, not a KN change. Evidence kept outside Git
+ (`run/`: watch files, guard/TS counters, import receipt, 80 MB mirror
+ commit log - deleted at KN-4 close); shadow secrets, env files and Query
+ state dirs deleted; candidate image `qdl-v2-python:kn4-67cfd8a`
+ `sha256:11d2b38e...` kept (superset of every slice); `kn4-c328974` removed
+ by digest. Production mutations: NONE.
+ - **Owner decision gate (no further shadow load until decided):** (a)
+ whether the shadow may run on this host at all while core_2 stays at
+ 0.5 CPU (a production quota change is the owner's); (b) the history
+ import: the spool read is the heaviest bring-up step - keep it off-peak
+ with an IO bound (`--device-read-bps`) or seed history from Kafka; (c) the
+ mirror's group namespace: keep borrowing `qdl-c40-handoff-` or grant a
+ dedicated `qdl-kn4-shadow-` read-only prefix (ACL change).
+ - KN-4 status stays IMPLEMENTING: slices 1-16 `tested locally`; K4-T01..T08
+ live evidence for the new candidate is NOT collected; no latency or
+ capacity claim.
+- 2026-09-25: **Owner decision after the stopped watched run (D42-D45,
+ recorded before action).** Protecting TS on the old path is not a reason to
+ keep the old architecture; resources are provisioned to accept KN, and the
+ old path is retired (resources reclaimed) in KN-5. `rust_core_2` is not a
+ spool component: it produces canonical data used by both the old path and
+ KN and is never stopped or removed.
+ - **D42 shared canonical core CPU:** raise only `rust_core_2` 0.5 -> 1.0
+ vCPU; image, business config and RAM (256 MiB) unchanged; old config
+ recorded for rollback; throttling, raw lag and MARK/INDEX measured before
+ and after (one variable, the target metric decides).
+ - **D43 history:** one bounded, checkpointed historical migration from the
+ spool (CPU/IO bounded), joined to canonical Kafka by watermark with
+ overlap and dedup; the spool is never the live tail; a verified import
+ artifact is reused, not re-read from the spool on each retry; import,
+ mirror catch-up and cold build never run at the same time.
+ - **D44 mirror namespace:** keep a unique id under the granted read prefix
+ `qdl-c40-handoff-`; never join/commit, never a real group; no ACL change.
+ - **D45 run discipline:** guard before every preparation step; sequential
+ bootstrap, matrix -> T07 -> stage 20/35 only after lag is stable; report
+ the KN stack's resources separately and old+new totals on the host
+ (a raised cap does not remove cost from the benchmark); Query RAM stays
+ 1 GiB unless real load shows a bounded working set without headroom.
+ - KN-5: 50 alpha + TS, Query/Stream handoff, rollback/return, then stop the
+ old projectors/stream/spool without consumers; time-limited rollback, no
+ two permanent stacks; v2.2.0 release; cleanup of images/caches/worktrees,
+ never history/volumes only because a container stopped.
+- 2026-09-25: **D42 capacity packet (recorded before the change).**
+ - Evidence without any shadow (13:40-14:25, `window.py` scratch, read-only
+ logs): `rust_core_2` n median 17.3k per progress line (08:00-09:20: 5.2k),
+ raw_age max 31.2 s / mean-of-means 2.9 s, 17 full batches; `rust_core`
+ and `rust_core_3` normal (3.2/7.1 s max, 0 full); projector canonical age
+ p90-of-max 172 s (morning 1.4 s); TS disconnects MARK_INDEX 461 and
+ BOOK_SNAPSHOT 368 in 45 min (morning 45 / 0); core_2 cgroup 65 %
+ periods throttled at its 0.5 quota. The degradation continues with the
+ shadow down, so it is production input on core_2's partitions.
+ - Change: `docker update --cpus 1.0 qdl_v2_stable_candidate-rust_core_2-1`
+ - a live cgroup quota change: no restart, no recreate, same container,
+ image `qdl-v2-rust:2.0.20-f1c9e1d` `sha256:389753b3...`, memory 256 MiB
+ and every env/mount unchanged. Before: NanoCpus 500000000, restart 0,
+ started 2026-09-19T17:23:49Z. Data-layer CPU ceiling sum 22.0 -> 22.5
+ vCPU (owner-approved addition, not resource-neutral; recorded).
+ - Not touched: every other role, Kafka, projectors, stream, Query, TS,
+ alphas, compose file (drift noted: compose still says 0.5 for this role;
+ the rule is `docker start`, never `compose up`; KN-5 packet reconciles).
+ - Windows: baseline 10 min (watch set, `kn4_watch.sh`) before; after 10 min
+ minimum, then compare the same metrics. Rollback
+ `docker update --cpus 0.5 qdl_v2_stable_candidate-rust_core_2-1` only if
+ the target metric worsens and no backlog is draining (drain first).
+- 2026-09-25: **D42 applied and measured (owner-approved exact command).**
+ 14:38:50Z `docker update --cpus 1.0 qdl_v2_stable_candidate-rust_core_2-1`:
+ cgroup `cpu.max` 100000/100000, NanoCpus 500000000 -> 1000000000; same
+ container (StartedAt 2026-09-19T17:23:49Z, restart 0), same image
+ `sha256:389753b3...`, memory 256 MiB, env/mounts unchanged; ceiling sum
+ 22.0 -> 22.5. Windows (read-only, watch set + logs): before 14:28:22-14:38:25,
+ after 14:38:50-14:50:44. core_2 throttled periods 36.9 % -> 1.0 % at the
+ same work (0.322 -> 0.325 CPU); raw_age mean 242 -> 213 ms, max 1.2 -> 2.5 s,
+ 0 full batches in both (input calm: n median 11.5k -> 9.2k, no burst in
+ either window, so the burst effect - 31 s raw_age at 13:40-14:25 - is not
+ yet demonstrated). Target metric: TS MARK/INDEX refusals 5 -> 15; all 15
+ (Binance DOGEUSDT 14:44-14:47, one SOLUSDT) coincide second-for-second with
+ `projector_v2_4` canonical age spikes 8-14 s and durable append max
+ 1.3-1.7 s (projector -> stream spool ingest; core_2 raw_age <= 2.5 s):
+ they are on the old path downstream of the core, the path KN replaces,
+ not caused by D42. Kept (no revert: the change is not implicated). Compose
+ drift recorded (compose 0.5, running 1.0).
+- 2026-09-25: **D43/D45 orchestration (outside Git), recorded before the
+ next run.** `kn4_shadow_up.sh` (`df43261a73ed`) is now sequential: guard + watch
+ first; isolated broker on the named volume `kn4-kafka-data` (fixed
+ `CLUSTER_ID` in the state dir, 7-day retention) so the verified history
+ import and the mirrored log survive retries; mirror start resolved once
+ (60 s back) before the import; the spool import runs alone at 0.5 CPU and
+ `--device-read-bps /dev/nvme0n1:20mb`, once (skipped when a PASS receipt
+ exists for the broker's topic id); then the mirror alone (resume from the
+ destination) until lag < 5 s three times; then the projector cold build
+ alone until >= 200 products READY; only then Query/Stream. Image for every
+ shadow role `qdl-v2-python:kn4-67cfd8a` `sha256:11d2b38e...` (steps
+ `90976f060146`, setup `9cc143fa4162`). `kn4_shadow_down.sh purge` (`39eec4b55bdc`) removes the volume
+ and state dir at KN-4 close only; a plain teardown keeps them.
+- 2026-09-25: **Second watched attempt receipt: STOPPED by the guard during
+ the bounded history import; cause located.** 14:51 guard + watch, 14:52:44
+ isolated broker (named volume) and mirror start offsets, then the spool
+ import alone (0.5 CPU, 20 MB/s device reads, one read transaction per
+ binding). 14:53-14:54 every production projector's durable append (projector
+ -> stream -> spool) rose from mean 80-270 ms / max 0.3-1.1 s to mean
+ 1.1-4.5 s / max 1.9-9.2 s, canonical age 0.7-2.4 s -> 7-21 s; the three
+ cores stayed normal (raw_age <= 1.2 s at 14:53, input calm); TS refused
+ MARK/INDEX on every Binance symbol and OKX ETH/SOL (17 lines in 60 s at
+ 14:54, guard ABORT). Recovery at 14:55 right after the import stopped
+ (projector_6 append 78/194 ms). The bandwidth bound did not prevent it: a
+ read of the live spool is itself the load on the old path's writer
+ (inference on the mechanism: long read snapshots holding back the WAL
+ checkpoint). The run-1325 onset (13:26) was the same import. Safety defect:
+ the import container was not named `kn4-*`, so the teardown missed it; it
+ kept reading until stopped by hand at ~14:56 (named `kn4-import` now).
+- 2026-09-25: **K4 slice 17 (paced live-spool export, D43)** | this commit |
+ `scripts/kn_bar_legacy_import.py --page-transactions --page-pause-ms N`:
+ one short read transaction per page with a pause between pages; the cutoff
+ still bounds the range; summaries add `spool_first_logical_offset_read`
+ (retention may prune the oldest rows during a paced read). Default
+ behaviour unchanged. Test `PagedLiveSpoolExportTests`: on a spool written by
+ the real spool code, paged summaries equal the single-snapshot ones and at
+ every pause a writer's `wal_checkpoint(TRUNCATE)` completes with busy 0;
+ `test_kn_bar_legacy_import` 14 OK (2 skipped: broker, real sample) |
+ `tested locally` | orchestration: import `--page-rows 500 --page-pause-ms
+ 200`, and `kn4_spool_watchdog.sh` stops `kn4-import` within ~10 s when any
+ production projector's durable append mean exceeds 600 ms (the writer's own
+ latency, ahead of the TS symptom).
+- 2026-09-25: **Third attempt receipt (paced import): stopped by the spool
+ watchdog, TS kept below the stop condition.** 14:59 broker reused (same
+ topic id `94nFTVLF...` from the named volume), import with 500-row page
+ transactions + 200 ms pauses, 0.5 CPU, 20 MB/s. Watchdog metric (worst
+ durable-append mean of the six production projectors, 10 s cadence): with
+ the import p50 227 / p90 403 / max 1,302 ms (stop at 15:03:15,
+ `projector_v2_4`); no-import control 15:04-15:09 p50 217 / p90 270 / max
+ 324 ms. TS max 6 refusals in 60 s (no guard stop). Disk (nvme0n1, watch
+ set): the import added ~300-450 read IOPS (baseline 100-200) next to
+ 3.5-5k write IOPS; write latency 1.1 ms rose to 1.5-2.9 ms (util 81 %) at
+ the stop. The paced read still raises the writer's tail; the mechanism
+ (IO queueing vs. SQLite checkpoint) is not separated.
+- 2026-09-25: **K4 slice 18 (checkpointed history import, D43)** | this
+ commit | `kn_bar_legacy_import.py import --progress FILE`: after each
+ binding's frames are committed a JSONL line (plan SHA-256 + binding
+ summary) is appended (line-buffered); a rerun of the same plan reuses those
+ summaries without reading the spool (`export(completed=...)`), publishes
+ only the rest and passes when the new frames equal the rows of the new
+ bindings (`resumed_bindings` in the receipt); lines of another plan or cut
+ by a kill are ignored. Tests: `CheckpointedImportTests` (2: reuse without
+ a spool read, equal totals/export hash; progress parsing) and the Kafka case
+ `test_a_checkpointed_import_resumes_without_republishing_committed_bindings`
+ (second run: 0 frames, 0 mutations, PASS, nothing published twice);
+ `test_kn_bar_legacy_import` 17 OK on the disposable kn3-lead broker (torn
+ down after) | `tested locally` | orchestration: read IOPS cap 150 added;
+ a watchdog stop now cools down (worst writer mean < 300 ms for 60 s) and
+ resumes from the checkpoint, up to 12 attempts; the watch set's lifetime
+ is tied to the shadow (pid file; two stale watchers from earlier runs were
+ found and stopped).
+- 2026-09-25: **Fourth attempt receipt (checkpointed, IOPS-capped import):
+ stopped; decision needed on the migration window.** 15:14:26 broker reused;
+ import with 500-row page transactions, 200 ms pauses, 0.5 CPU, 20 MB/s and
+ 150 read IOPS. 15:15:52 the spool watchdog stopped it after 4 committed
+ bindings (checkpoint kept, `state/import-progress.jsonl`): worst writer
+ mean 693 ms. The largest disturbance came AFTER the stop: 15:16 durable
+ append mean up to 2.6 s and canonical age up to 13 s on all projectors
+ (15:15 0.3-0.6 s), recovered 15:17; core_2 normal (raw_age <= 2.3 s); TS 7
+ + 6 refusals (15:15/15:16), guard ABORT at 12 in 60 s. Same shape as
+ 14:53-14:55. Spool file facts (metadata only, read-only mount):
+ `canonical-cache.sqlite3` 3.31 GB, `-wal` 64 MiB, `-shm` 6.4 MB. Reading:
+ any read session on the live 3.3 GB spool disturbs its writer, and the
+ larger stall follows the reader's release; that fits WAL checkpoint
+ starvation (the writer copies the backlog once the reader leaves) and an
+ IOPS cap makes each read transaction longer (inference; not separated).
+ Retrying in small attempts would cost one TS disturbance per ~4 bindings
+ (144 bindings). Teardown clean (0 containers/networks, no watcher left).
+- 2026-09-25: **Owner decision D46 (supersedes D43's spool migration).** No
+ history migration from the spool. The new architecture replaces the old one
+ and starts fresh: stored data may be reset; history comes from the venues
+ (the data layer's job is to talk to the exchanges), bounded by retention
+ policy (old data is dropped, not archived). Consequences recorded before
+ work: the legacy spool import is removed from the KN bootstrap (the
+ checkpointed import of slices 17/18 stays as a tested tool, not a step);
+ the isolated broker's partial LEGACY_BAR rows are purged with its volume;
+ the capability that fills KN BAR history from the venues is located first
+ (E1: V1, V2 and KN grep with file:line) before anything new is built.
+- 2026-09-25: **D46 inventory (E1, read-only) and plan D47 - KN BAR history
+ from the venues.** Existing: the stable BAR edge
+ (`qdl/runtime/stable_bar_edge.py`) already bootstraps up to
+ `QDL_STABLE_BAR_WARMUP_ROWS` (compose 10,000; capped at 1,095 days) per
+ enabled binding over venue REST (Binance `/fapi|/api/v3 klines` pages of
+ 1,000, `qdl/adapters/binance/bar_edge.py:188-275`; OKX
+ `history-candles` pages of 300, `qdl/adapters/okx/history.py:105-160`),
+ publishes raw envelopes to the raw topic, and the Rust core canonicalizes
+ them as authoritative BACKFILLED bars (`rust/qdl-core/src/canonical.rs:454-478`);
+ it fills only opens its readback reports missing, and has a kn3 readback
+ (`qdl/runtime/kn_bar_readback.py`). Pass-through
+ (`qdl/runtime/provider_history.py`) is non-authoritative and never fills a
+ cache; V1 recovery writes V1 only; Rust has no kline REST. Gaps to close,
+ in order (each a tested slice): (1) a fresh KN cache: the kn3 readback
+ raises `KnBarReadbackNotReady` for a product without a READY generation
+ (`kn_bar_readback.py:218-219`), so the edge cannot bootstrap an empty
+ product - a product that has never been built must read as "nothing
+ durable" while a fenced/unavailable cache still fails closed; (2) venue
+ budget: the Binance edge path has no weight accounting and no 418/429
+ `Retry-After` handling (the repo pattern exists in
+ `qdl/adapters/binance/reference.py:59-66`,
+ `app/providers/binance/derivatives.py:126-196`) and the OKX bucket is
+ created per call (`qdl/adapters/okx/bar_edge.py:92`) - the shadow shares
+ the production host IP, so a bounded share of the venue budget, honoured
+ 429/418 and a stop on 418 are required before any fill; (3) ingest pacing:
+ a full re-bootstrap once left a 601,622-record projector backlog
+ (plan `:39330-39345`) - the fill is paced per binding; (4) shadow
+ topology: an isolated edge + isolated Rust core on the shadow's own raw
+ topic feed the isolated canonical log next to the mirror (the mirror
+ carries live production canonical; history comes from the venues), with
+ retention = the KN retained caps (largest manifest warmup + 2,064, 12,064
+ for 140 products, `rust/qdl-projector/src/products.rs:22-23,119-143`).
+ The same edge + kn3 readback is the production path at the KN-5 cutover.
+- 2026-09-25: **Review of D47 accepted after reading the code (D47
+ amended).** Confirmed in source: (P1-1) `KnBarReadback.cache_identity`
+ hashed every product's READY generation (`kn_bar_readback.py:192-203`) and
+ the edge cleared every watermark when it changed
+ (`stable_bar_edge.py:969-983`), so each first READY during a fresh fill would
+ have re-bootstrapped all 140 bindings; (P1-2) the watermark advanced on
+ `durable | published == expected` (`stable_bar_edge.py:771-781`): a Kafka
+ ACK, not served rows; (P1-3) the mirror resume looked at the last 64
+ offsets only (`kn_canonical_mirror.py` `destination_resume_offsets`),
+ unsafe once another producer writes the isolated canonical log. Amended
+ slices: D47-1 cold start/readback states + per-product rebase + serving
+ progress; D47-2 venue admission through the existing Rust provider
+ admission (`rust/qdl-core/src/provider_admission.rs`, `qdl/admission/`),
+ Binance weight by page size, OKX budget across calls, realtime reserve,
+ typed 429/Retry-After, 418, OKX 50011, fault-injection tests; D47-3
+ downstream backpressure (backlog/bytes, live first), depth by demand,
+ truthful insufficient provider history; D47-4 history/live join through the
+ existing duplicate/revision rules, latest BAR never regresses, isolated
+ canonical cursor, durable mirror checkpoint in the destination
+ transaction, real-Kafka restart tests. Run order: guard -> consuming KN
+ pipeline -> mirror live -> small bootstrap on both venues -> readback/cursor
+ check -> history with backpressure -> matrix -> T07 -> stages 20/35;
+ teardown by labels/run id. Deployment config to carry `rust_core_2` 1.0.
+- 2026-09-25: **K4 slice 19 (D47-1 cold start, readback states, serving
+ progress)** | this commit | `qdl/runtime/kn_bar_readback.py`: the cache
+ identity is now the *epoch* (environment, bars topic, state partitions),
+ valid only while stage B's checkpoint of each partition exists (a finished
+ build always records it, `stage_b.rs:1310-1313`; an empty partition's build
+ finishes on the next poll, `:496-499`); a lost/unbuilt partition raises
+ `KnBarReadbackEpochNotReady`. Readback states: no pointer (or fence only,
+ `apply.lua` op X) in a built partition -> empty (never served; unpublish
+ happens only when the log holds nothing, `apply.lua:186-195`); staging only
+ -> NotReady `REBUILDING`; no checkpoint -> NotReady
+ `PARTITION_NOT_BUILT`; Redis error -> error; `generation_identities` in one
+ round trip. `qdl/runtime/stable_bar_edge.py`: `_rebase_changed_products`
+ rebases only a binding whose READY generation changed (first READY is
+ normal); `_record_serving`/`verify_serving` keep publish progress (the
+ watermark moves on the ACK for live polling) apart from serving progress
+ (read back from the cache, <= 8 bindings per turn, overdue after 900 s,
+ never re-fetched from the venue while the cache catches up); heartbeat
+ detail carries `published/served/pending/overdue`. The SQLite path is
+ unchanged. Tests `tests/test_kn_bar_readback.py`: not-ready states and the
+ never-materialized product (incl. cache lost), epoch stable across first
+ READY / rebuild / second product READY and failing closed on a lost
+ checkpoint, generation change during a read (kept), SQLite/cache parity
+ with only the rebuilt product rebased, served only after readback incl. a
+ rebuilding product, overdue, and the restart gap check (fails closed while
+ rebuilding, finds the unmaterialized window, clears once materialized);
+ real-Redis case; 26 OK with `test_kn3_flow_check`; edge suites (10
+ modules) 195 OK | `tested locally`; runtime NONE.
+- 2026-09-25: **D42 carried into the deployment config** | this commit |
+ `docker-compose.v2-stable.yml` `rust_core_2.cpus` 0.50 -> 1.00 (the running
+ container was raised live on 2026-09-25 14:38:50 with `docker update`; a
+ recreate from compose would otherwise return it to 0.50). Nothing is
+ recreated by this commit. Compose-reading suites (18 modules) 180 OK |
+ runtime NONE (config source only).
+- 2026-09-25: **K4 slice 20 (D47-2 venue admission for the BAR edge)** |
+ this commit | Reuses the Rust provider admission (token bucket per lane,
+ REALTIME/BATCH with reserved realtime inflight, shared cooldown); Python
+ only calls REST and maps replies to typed results. `rust/qdl-core/src/provider_admission.rs`:
+ the rate-limit signal also accepts OKX `50011`, and a provider code must be
+ the lane venue's own (`provider_rate_limit_code`; an OKX code never cools a
+ Binance lane); `qdl/admission/http.py` relays it. New
+ `qdl/admission/edge.py` (`BlockingProviderAdmission`): the thread-based edge
+ leases a Rust grant per venue call on a private loop thread - waits out
+ DEFERRED by the Rust `retry_after_ms`, typed `AdmissionDeadlineExceeded`
+ (no venue call), completion on every exit, `ProviderRateLimited` after
+ relaying the reply to Rust; no policy of its own. New
+ `qdl/adapters/binance/admitted_klines.py`: drop-in `fetcher` with the
+ documented page weight (USD-M 1/2/5/10 by limit, Spot 2), one pooled
+ session, 418/429/-1003 relayed with `Retry-After` and never retried
+ (the adapter's retry loop only retries transport/HTTP errors), and the
+ whole-IP `X-MBX-USED-WEIGHT-1M`: BATCH work above 50 % of the IP limit
+ waits for the next minute window, REALTIME does not. New
+ `qdl/adapters/okx/admitted_rest.py`: one shared client and session (the edge
+ built a new `OkxRestClient`, so a new bucket, per call), a grant per request
+ (candle endpoints only, lane SWAP/SPOT by instId), 429/`50011` relayed and
+ never retried, other errors keep bounded retries. `stable_bar_edge.py`:
+ optional `provider_admission` (env `QDL_STABLE_BAR_PROVIDER_ADMISSION_URL` +
+ `_SECRET_FILE`; off by default, so production is unchanged); history,
+ catch-up and native recovery are BATCH, the live final-bar reads REALTIME;
+ clients are shared per venue and priority. Tests
+ `tests/test_kn_provider_admission_edge.py` 11 (fault injection: scripted
+ Rust runtime and HTTP session - deferral, deadline, failure/cancel
+ completion, 8 concurrent threads, weights, 429/418/-1003, transient retry
+ under a fresh grant, IP share, OKX 50011/429 and transient retries, edge
+ wiring); admission/edge suites 250 OK; Rust `qdl-core` provider_admission 10
+ OK (new `okx_code_50011_cools_an_okx_lane_and_never_a_binance_one`),
+ `qdl-realtime-core` provider_admission 9 OK | `tested locally`; runtime
+ NONE. Open for the shadow: the lane policies (shadow share) and the
+ isolated core hosting the endpoint (D47-4).
+- 2026-09-25: **K4 slice 21 (D47-3 fill by demand, backpressure, truthful
+ short history)** | this commit | New `qdl/runtime/bar_history_demand.py`:
+ demanded rows per BAR binding from the gateway bundle with the projector's
+ own rule (`products.rs` `retained_caps`: largest `max_warmup_rows` of a
+ manifest requiring the product; the 2,064 headroom is retention, never
+ fetched). New `qdl/runtime/history_backpressure.py`: per pipeline stage
+ (core on the raw topic, projector stage A `kn-projector-v3-a` on canonical,
+ stage B `kn-projector-v3-b` on bars) the unconsumed records (end - committed
+ group offset, read-only admin/watermarks); the gate closes above a stage
+ limit or when the backlog cannot be read. `stable_bar_edge.py` (KN mode
+ only): depth = min(global bound, 1,095-day capacity, demand; 1 bar for a
+ product nobody demands - the live watermark); the gate is checked before
+ each binding's history - closed pauses the fill without failing, live bars
+ keep flowing, the next turn resumes from the checkpoint; venue history
+ shorter than asked is published as it is and reported (`short` in the
+ heartbeat), an empty one is skipped and not retried. Adapters:
+ `allow_short` in Binance (a short page is the venue's first bars only when
+ one more older row does not exist) and OKX (only `PROVIDER_EXHAUSTED`);
+ default behaviour unchanged. Env (off by default):
+ `QDL_STABLE_BAR_DEMAND_BUNDLE`, `QDL_STABLE_BAR_BACKPRESSURE_BOOTSTRAP` +
+ `_STAGES` (`name:group:topic:limit,...`). Tests
+ `tests/test_kn_history_fill.py` 8 (demand rule; backlog/gate incl.
+ unreadable; Binance/OKX short acceptance and refusal; edge depth, short and
+ empty history not retried; gate pause and resume) + a real-broker group
+ backlog case (disposable kn3-lead broker); edge/admission suites 209 OK,
+ adapter-dependent suites 109 OK | `tested locally`; runtime NONE.
+- 2026-09-25: **K4 slice 22 (D47-4 history/live join and durable mirror
+ checkpoint)** | this commit | `scripts/kn_canonical_mirror.py`: the resume
+ point is a checkpoint record (`kn.mirror.checkpoint.v1`, compacted, one
+ partition; key `next-source-offsets`, value = next source offset per
+ partition) produced in the same transaction as the copies, so it is exactly
+ as far as the committed copy whatever else the destination holds
+ (`checkpoint_resume_offsets` replaces the 64-offset scan); the mirror
+ refuses to run without that topic; the transactional id is fixed per source
+ topic, so a restart fences a killed mirror and aborts its open transaction
+ at once (a random id left it open until the transaction timeout, holding
+ back every read_committed reader of the isolated canonical log).
+ `stable_bar_edge.py`: `history_end_ms` (env
+ `QDL_STABLE_BAR_HISTORY_END_MS`) bounds the fill to bars closed before the
+ live log's start - with the mirror started first, a bar closed just before
+ it and emitted after it exists in both and the earlier live copy is kept;
+ `history_only` (`QDL_STABLE_BAR_HISTORY_ONLY=1`) turns off the REST live
+ poll and native recovery so two live sources never overlap (the shadow's
+ live bars come from the mirror). Evidence reused, not rebuilt: stage B keeps
+ the first fact on an equal-revision conflict ("never last-write-wins"),
+ applies higher revisions, drops lower ones and duplicates
+ (`tests/stage_b_redis.rs` `bar_revisions_follow_the_contract_rules`); the
+ BAR fact identity is the SHA-256 of the canonical envelope
+ (`state_codec.rs:618`), so BACKFILLED vs VENUE_NATIVE at one open is a
+ noted conflict; readers do not use the conflict counter; mirror headers are
+ provenance only (no `qdl-mirror` reader in `rust/` or `qdl/`), cursors
+ carry the isolated coordinates. Tests: new Rust
+ `late_venue_history_never_moves_the_latest_bar_back_and_live_is_kept`
+ (live opens 20/21 first, history 10..20 later with a different open 20:
+ `last`/`last_final` stay 21, the live 20 is kept, one conflict, 12 rows) -
+ `stage_b_redis` 27 OK on the disposable Redis; mirror
+ `test_the_durable_checkpoint_survives_other_producers_and_a_killed_mirror`
+ (100 foreign records, a killed transaction with its checkpoint, restart:
+ every committed source record exactly once, checkpoint 11) -
+ `test_kn_canonical_mirror` 6 OK on the disposable broker;
+ `HistoryLiveJoinTests` (boundary, history-only wiring) -
+ `test_kn_history_fill` 12 OK; edge/admission/probe suites 236 OK |
+ `tested locally`; runtime NONE.
+- 2026-09-25: **K4 slice 23 (KN bar-edge admission lanes)** | this commit |
+ `config/v2/provider-admission-policy-kn-bar-edge-v1.json` (sha256
+ `5493201992b5...`): BINANCE USDM KLINES 60 tokens + 10/s (600 weight/min =
+ 25 % of the 2,400/min IP limit), SPOT KLINES 150 + 25/s (25 % of
+ 6,000/min), OKX SWAP/SPOT HISTORY_CANDLES and CANDLES 5 + 5/2 s (25 % of
+ 20/2 s); each lane reserves realtime inflight (1 of 2-4), 30 s lease, 60 s
+ default cooldown. Test `BarEdgeLanePolicyTests` pins the shares and the
+ reserve (`test_kn_provider_admission_edge` 12 OK) | `tested locally`;
+ hosted by the shadow's isolated core (D47-4 topology); a production merge is
+ a KN-5 cutover item.
+- 2026-09-25: **KN-4 D47 shadow packet (recorded before start).** Order (review):
+ guard + watch -> networks/Redis -> isolated broker with PLAINTEXT 9092 (KN
+ roles) and SSL 9094 (throwaway 7-day test CA, `kn4_tls_setup.py`; the core
+ and the edge require TLS) on the named volume `kn4-kafka-data` -> topics
+ (canonical, raw, latest, bars, `kn.mirror.checkpoint.v1`) -> shadow
+ material + isolated core material (`kn4_core_setup.py`: `core_config`
+ for the 140 enabled Binance/OKX BAR bindings of the running runtime catalog,
+ the KN bar-edge lanes, a fresh admission secret) -> projectors until all 12
+ state partitions are checkpointed -> Query x2 + Stream x2 -> mirror live
+ (production canonical, read-only, `qdl-c40-handoff-` group, transactional
+ checkpoint) until lag < 5 s -> isolated core `kn4-core` (release binary
+ `qdl-realtime-core` `5ea8ef7c...` built at `84fabec`/`0ea3850` source, in
+ `qdl-v2-rust:2.0.26-62241bc`; 0.75 CPU / 256 MiB; alias `rust_core`
+ hosting the provider admission on the shadow network) -> history edge
+ `kn4-edge` (image `qdl-v2-python:kn4-0ea3850` `sha256:72db8784...`;
+ 0.5 CPU / 512 MiB; kn3 readback, admission, demand from the bundle,
+ backpressure core 20k / stage A 50k / stage B 50k records, history-only,
+ history end = mirror start) first with 20 rows per binding (small bootstrap,
+ both venues), readback/cursor check, then 10,000 (the gap check fills the
+ rest by demand) -> matrix -> T07 -> stages 20/35. Venue calls: public
+ Binance/OKX REST from the host IP, bounded by the lanes (25 % of each IP
+ limit) and the whole-IP Binance weight share; 418 stops the lane.
+ Stop conditions as before (guard: host idle, production restarts, TS
+ MARK/INDEX >= 10 in 60 s). Every resource carries `kn4.run=`;
+ teardown by label (`kn4_shadow_down.sh`, `purge` at KN-4 close).
+ Production mutations: none (the mirror's production read as before).
+ Orchestration sha256 (12): bb2adc6103bc kn4_shadow_up.sh;d560462e219d kn4_shadow_down.sh;35fe36922658 kn4_steps.sh;a1e33fd7316f kn4_shadow_setup.py;f23bce08bca9 kn4_tls_setup.py;8b1440d7d357 kn4_core_setup.py;5d2ac337fd57 kn4_guard.sh;927f97948ee7 kn4_watch.sh;
+- 2026-09-25: **D47 shadow receipt, part 1: pipeline, live, history from the
+ venues.** First bring-up stopped at the core (the provider-admission Redis
+ prefix must start with `qdl:stable:v2:`, `provider_admission_server.rs:222`;
+ fixed to `qdl:stable:v2:kn4shadow:provider-admission:v1`; the core is now
+ created, then started, so its log survives). Second run (run id in
+ `run/run-id`): 18:51:09 broker (PLAINTEXT + SSL), 18:51:23 12/12 state
+ partitions checkpointed, 18:51:25 Query/Stream, 18:51:28 mirror, caught up
+ 18:51:58, 18:52:14 core (140 bindings, 6 admission lanes). Small bootstrap
+ (20 rows): 140 bindings, 2,800 rows in < 1 min; check through Query
+ (`kn4_history_check.py`, alpha identities): Binance and OKX BTC 1m/1h 20/20,
+ contiguous, FULL, cursor verified against the isolated topic id and refused
+ for another topic id (an earlier isolated broker's, not production's).
+ Full fill (10,000 by demand; the checkpoint is bound to `warmup_rows`, so the
+ depth change started from a fresh edge state - fail-closed as designed):
+ 18:58-19:12, 140 bindings, 863,920 rows published (e.g. 9,980 of 10,000 -
+ the 20 already durable were read back and skipped), backpressure gate never
+ closed, 0 short histories, 0 rate-limit replies, 0 admission deadlines; TS
+ execution MARK/INDEX refusals 0-1 per minute (guard never stopped). After:
+ 202/216 products READY (all 140 BAR with a source), BTC 1m/1h on both venues
+ 10,000/10,000 contiguous FULL with verified isolated cursors; market cache
+ 645 MB. KN stack steady state: ~0.45 vCPU (isolated broker 0.19), ~2.1 GB;
+ production data layer + TS ~5.05 vCPU at the same time. Finding
+ (pre-existing, not changed here): the core canonicalizes every OKX REST
+ history bar as `VENUE_NATIVE` (`rust/qdl-core/src/canonical.rs:656,745`);
+ only the Binance REST path carries `BACKFILLED` (`:453-478`) - OKX history
+ provenance is not distinguishable today.
+- 2026-09-25: **Probe over the live log, first run: FAIL by method (receipt
+ `run/probe-matrix.json` `2a1a9682...`), fixed in K4 slice 24** | this commit
+ | Two defects of slice 13's mirror mode: (1) the verdict counted the 76
+ products without a record in the window (e.g. BAR 12h/1d/1h, deliberately
+ not streamed) as missing subscriptions; (2) the final oracle was read after
+ the streams stopped while the live log kept growing, so records produced
+ after a subscription ended were "expected" - every lossless live feed showed
+ missing_lossless (TRADE 687-1,945, BOOK_DELTA 827-939, BOOK_SNAPSHOT ~52,
+ BAR 1m/3m 1) and QUOTE unsuperseded_drops=1: the same method error D41 names.
+ Fix (`scripts/kn_native_slice_probe.py`, mirror mode only): each wave's
+ window boundary is every partition's end offset at the moment its streams
+ stop; delivered and expected records are judged inside it
+ (`delivered_after_boundary` counted); unsampled products are excluded from
+ "missing" and stay listed. Test `test_unsampled_products_are_reported_not_missing`;
+ `test_kn_native_slice_probe` 38 OK | `tested locally`; the probe is rerun on
+ the same shadow with an image at this commit (measurement client only).
+- 2026-09-25: **Probe rerun (slice 24 image `kn4-717f560`): 12 residuals, all
+ at the window edge; K4 slice 25** | this commit | Receipt
+ `run/probe-matrix.json` `59e2bf10...`: the unsampled and post-stop artefacts
+ are gone; left per subscription: BOOK_DELTA missing_lossless 2-3, QUOTE
+ unsuperseded_drops 1, TRADE missing 1-143 (Binance DOGE 143, others <= 13)
+ - records produced in the last moments before the boundary, which was taken
+ at the instant the streams stopped, so nothing below it could still be
+ delivered (and a coalesced QUOTE's successor fell outside). The boundary is
+ now taken `MIRROR_DRAIN_S` = 15 s before the streams stop (the harness
+ handoff's close-then-drain rule); `test_kn_native_slice_probe` 38 OK |
+ `tested locally`; rerun follows.
+- 2026-09-25: **Probe diagnostic run and harness fix, K4 slice 26** | this
+ commit | Probe rerun with the slice-25 boundary (receipt
+ `run/probe-matrix.run3.json` `5b2a36c8...`): the edge residuals were gone;
+ 10 failures left, all Binance BAR 5m/15m `unexpected=1` (e.g. BTC 5m: 3
+ delivered, 2 expected). A diagnostic run with the probe from the working
+ tree (`559748...`, not acceptance evidence) did not reproduce them but hit
+ another mode: at ~15 s many streams got the typed
+ `RATE_LIMITED: bounded outbound buffer exhausted` (DOGE/BTC TRADE, BOOK,
+ QUOTE, MARK) and ended - 194 streams on a 1-CPU probe client; client CPU was
+ not sampled, so a slow client is the leading reading, not proven. Same run:
+ RPC 17/17, negatives 23/24; isolated commit -> client p50/p95/p99
+ 6.5/25/77 ms (n 24,291); production record CreateTime -> client
+ 127/667/2,251 ms (n 25,345). The live-log exactness check therefore stays
+ OPEN. This commit: the probe records `unexpected_sample` (offset, cursor,
+ the log key/partition holding it) so the next unexpected delivery is
+ diagnosable; the kn4-matrix client failed with `FileNotFoundError` because
+ the driver runs from `/driver` and loaded the probe from `/scripts` - the
+ probe is now mounted beside the driver and looked up there first
+ (`test_phase3_*` 63 OK, `test_kn_native_slice_probe` 38 OK) | `tested
+ locally`.
+- 2026-09-25: **kn4-matrix on the D47 shadow: PASS after three harness fixes,
+ K4 slice 27** | this commit | Runs 193949/194703/195xxx failed in the
+ harness, not the read plane: (1) the fixed-window handoff read each session
+ with `wait_for(session.__anext__(), 1 s)` - cancelling a pending gRPC read
+ ends the call, so quiet streams (OKX TRADE, BAR) died at their first 1 s
+ timeout (`StopAsyncIteration`, 0-3 delivered) and busy ones at their first
+ quiet gap; now a pump task owns the read and the controller waits on a
+ queue (`stream_ended` / `stream_error` recorded, an error fails the case);
+ (2) 16 concurrent sessions on the 1-CPU client -> waves of 4, each with its
+ own fixed window, one client per session; (3) the window oracle held every
+ product's records (client OOM, exit 137 at 512 MiB) -> `kafka_oracle_window
+ (keys=...)` keeps only the judged products (disposable-broker test).
+ Receipt `evidence/kn4-matrix-200716/receipt.json` (`0ff24dec1c2d...`): target
+ matrix + history 48/48 (2,500/5,000/10,000 rows, contiguous, replica parity
+ 24/24 at equal watermarks), strict batches 20/20, freshness 8/8, HTTP 18/18,
+ **handoff 16/16** - every committed record after the snapshot watermark
+ and inside the fixed boundary delivered once and in order (e.g. Binance
+ TRADE 420/420, BOOK_DELTA 797/797, OKX QUOTE 568/568 coalescing-legal),
+ on both replicas; TS refusals 0. Harness suites 63 OK | shadow evidence
+ (`tested locally` for the source; the receipt is runtime evidence on the
+ isolated shadow).
+- 2026-09-25: **T07 on the D47 shadow: TS PASS, alpha PASS except QUOTE;
+ stage 20 PASS, stage 35 no OOM/backlog with two open gates** | no source
+ change (orchestration outside Git) | **T07** (receipt
+ `evidence/consumer-scenarios.json` `e86b97d63252...`, TS image
+ `v1.2.5-1193b13`, alpha runtime mounted read-only, sealed grid binding
+ `7af78ab8fa4e...`): TS V2 primary 3/3 OK -> V2 unreachable BLOCKED 3/3 (no
+ same-venue fallback, as its policy says) -> restored 3/3 OK. Alpha: TRADE,
+ MARK/INDEX (execution-context `MarkIndexRead`, 9.6 ms), L2 book, BAR 1h
+ latest and warmup 1h x500 OK on V2; V2 unreachable -> TRADE falls back to
+ V1 (its route says `V1`), every other read BLOCKED; restored -> OK again.
+ Two earlier alpha failures were the harness, not the read plane: (1) BAR 1h
+ `DATA_STALE (EVENT_AGE)` - the T07 container shared the TS env, whose
+ `DATA_LAYER_V2_BAR_MAX_FRESHNESS_MS=180000` (TS reads 1m bars) the alpha
+ gateway applies as a cap, `min(180000, 3780000)`
+ (`execution_alpha/.../data_layer_client.py:559-568`), so a 1h bar went
+ stale 3 min after its close; the alpha deployment leaves it empty
+ (`runtime/docker-compose.alpha.example.yml:30`) and the scenario now sets
+ the alpha deployment's own defaults; BAR freshness is anchored on the bar
+ close (`qdl/runtime/stable_source.py:1030-1039`), which is correct.
+ (2) Warmup 1h "BLOCKED" was the debug read's audit sink failing on a
+ read-only `/app/state`; with the sink stubbed it is `V2_PASS_THROUGH`
+ (alpha materialises only 1m). **Open, pre-existing, not KN:** alpha QUOTE
+ is `PERMISSION_DENIED` - manifest revision 12 (`137633b`, 2026-09-21)
+ declares QUOTE `event_recency_policy: OBSERVE` for `ON_CHANGE` quotes
+ (`scripts/phase533_materialize_alpha_runtime_entitlements.py:227-231`),
+ the manifest match requires an equal policy (`qdl/consumer/manifest.py:122`),
+ and the alpha gateway sends a recency policy only for TRADE
+ (`execution_alpha/runtime/app/alpha_runtime/orchestration/data_layer_v2.py:580-584`;
+ TS has `quote_event_recency_policy`,
+ `trading_system/adapters/market_data/data_layer_v2.py:224`). Production
+ Query applies the same match, so any alpha QUOTE read on V2 is denied
+ today; no alpha container runs now. Fix belongs to `execution_alpha`
+ (owner decision). **Stage 20** (`stage-20-202819`, gates `06b464d6df6a...`):
+ PASS, 2,547 offered, 0 failed, 36 streams 0 errors, TS ready every sample.
+ **Stage 35** (`stage-35-203119`, gates `1465602c99cb...`): no OOM, no
+ restart, no leaked task, worker RSS <= 319 MiB, scheduler lag p99 3.1 ms,
+ 63 streams 0 errors, every live stream delivered, final bar on all 21 BAR
+ streams; projector lag after the run 22 / 40 records (groups a / b);
+ mirror live (last commit 41 ms after its source). Two gates failed:
+ `requests:no_failures` - 2 of 6,527 requests `DATA_STALE (EVENT_AGE)` on
+ Binance BNBUSDT QUOTE (alpha manifest); for an `ON_CHANGE` + `OBSERVE`
+ quote the event age cannot make the state STALE
+ (`qdl/data_quality/binding_decision.py:262-266`), so this label comes
+ from state STALE (`:327-328`), i.e. session/generation; a race on the
+ production session-liveness file was ruled out at idle (1,777 reads in
+ 180 s, all LIVE, max 1,073 ms) - cause not pinned, and the harness records
+ only the detail hash. `ts:ready_60_every_sample` - 2 of 20 production TS
+ samples DEGRADED: QUOTE Binance BTCUSDT and OKX SOL-USDT-SWAP STALE at
+ 2.059 s against TS's 2 s quote bound; TS reads production, not the
+ shadow, and its log shows the same QUOTE `DATA_STALE (EVENT_AGE)`
+ disconnects before any load (20:13-20:19, 6 lines); host idle during
+ stage 35 was 31-37 % (38-45 % before). Neither is attributed to the KN
+ shadow; neither is proven unrelated. **Latency (four quantities, stage
+ 35):** (1) request, Query snapshot p50/p95/p99 ms: QUOTE Binance
+ 10.1/19.9/34.3 (n 1,258), OKX 9.7/20.3/50.4 (n 1,260); MARK/INDEX
+ Binance 10.9/21.5/42.3 (n 1,980), OKX 10.7/20.1/37.6 (n 1,800); L2
+ Binance 34.9/122/303 (n 36); BAR latest 14.9/22.0/306.6 (n 36);
+ denominators 6,527 offered, 2 failed. (2) event age at response: the
+ freshness gate of kn4-matrix (8/8); not sampled per request here. (3)
+ delivery lag source -> canonical is production's (the shadow consumes its
+ canonical); the shadow adds the mirror hop: production append -> shadow
+ commit p50/p95/p99 119/296/359 ms, max 538 (n 94,466). (4) source/close
+ -> usable at the consumer (streams): QUOTE p50 372-512 ms, worst p99
+ 1,096 (n 5,632); TRADE p50 359-624, worst p99 1,312 (n 2,329);
+ BOOK_DELTA p50 350-493, worst p99 1,029 (n 1,792); BAR (close) p50
+ 618-1,526 (n 63). These include the mirror hop, which KN-5 removes.
+ Resources: KN stack ~0.45 vCPU / ~2.1 GiB idle; Query 307/384 MiB of 1 GiB
+ after stage 35 (D45 holds) | shadow evidence.
+- 2026-09-26: **Session read path: heartbeat read clock, session-named
+ staleness, parsed-content cache; K4 slice 28 (Astra KN-4 review F2)** | this
+ commit | (1) Query sampled `now_ns` before reading the ingestor's session
+ record; the ingestor rewrites it continuously (temp file + rename), so a
+ record read after the sample could carry a transport time just past it and
+ was refused as `SOURCE_SESSION_CLOCK_SKEW` -> UNKNOWN -> STALE -> DATA_STALE
+ although no clock was wrong. `StableSessionLivenessReader(clock_ns=...)`
+ (wired with the caller's own clock in `stable_source.py` and `stable.py`)
+ judges only such a record at a clock sampled after the read (never earlier
+ than the caller's sample); a transport time still in the future is a real
+ skew and fails closed; without `clock_ns` the old strict rule holds. Not yet
+ proven to be the cause of the two stage-35 BNB refusals - that needs the
+ refusal diagnostics of slice 29. (2) `freshness_verdict` named every STALE
+ state `EVENT_AGE`, although a quiet ON_CHANGE quote / OBSERVE feed is STALE
+ only through its session; a session-caused STALE is now `SESSION_STATE`
+ (admission unchanged; the old `SESSION_STATE` branch was unreachable).
+ (3) Astra's optimisation note, measured first: `status()` listed the lane
+ directory and read + parsed every record per call, per item (13 Binance
+ USDM lanes, 8 long DISCONNECTED) - 918.6 us per call on 1 CPU (2,000 calls,
+ host loaded by a concurrent suite). Parsed content is now kept per file
+ under its (inode, mtime, size) key - exact because the ingestor writes by
+ rename - and re-read only when the file changes; no verdict, age or match
+ is cached, the directory is re-listed every call and the cache holds only
+ the files listed now: 280.2 us per call (3.3x). Tests: new
+ `test_session_liveness_read_clock` 11 (rewrite-during-read LIVE, strict
+ without clock, real skew, clock behind the sample, ordinary heartbeat,
+ disconnect/generation/config mismatch; rename, in-place rewrite,
+ malformed -> repaired -> removed, ambiguous copy, age per call);
+ `test_dlv2_r1_stale_reason` +1; session/quality/Query/KN suites 253 OK |
+ `tested locally`.
+- 2026-09-26: **Refusal diagnostics: the quality a request was refused on
+ travels with the refusal; K4 slice 29 (Astra KN-4 review step 1)** | this
+ commit | The stage-35 receipt held only a detail hash for its two BNB QUOTE
+ refusals, so their cause could not be read. Query now attaches, to every
+ refusal decided in `_enforce` (snapshot and warmup), the quality it was
+ decided on, taken at that moment: `evaluated_at_ns`, state, freshness,
+ event-recency and provider-session state, session liveness, execution
+ eligibility, gap/complete, reason codes (session flags name generation,
+ config, skew or ambiguity), source id, watermark, observed/received times.
+ `ProblemDetails.diagnostics` (`ProblemDiagnostics`, optional, numeric
+ bounds only so a diagnostic can never turn a refusal into a 500) is an
+ additive OpenAPI change (semantic diff `PASS_PRE_BETA_FREEZE`, 0 hard
+ breaks; schema pin 68 -> 69); the SDK keeps it on `DataLayerError.diagnostics`
+ (deployed clients decode error bodies as dicts and ignore it). The Phase-3
+ harness records, at the failed request, the typed reason, the bounded
+ diagnostics, the serving replica, wall-clock send/fail times and elapsed
+ time (both failure sites). Tests: API stale refusal carries the
+ diagnostics; SDK decode keeps/drops them; harness evidence bounded and
+ field-filtered; `test_fund_phase5_api`, SDK, harness, contract-golden,
+ release suites 145 OK | `tested locally`.
+- 2026-09-26: **Evidence tools: bounded mirror log, streamed probe log,
+ coordinate-exact BAR diagnosis, a quota negative that proves its own
+ condition; K4 slice 30 (Astra KN-4 review F3/F5)** | this commit |
+ (1) The mirror commit log grew to 894 MiB (one line per record); it now
+ rotates past `--commit-log-max-bytes` (64 MiB) to `.1`, at most two
+ files. (2) The probe read the whole log with `read_text().splitlines()`
+ (client OOM risk); it now streams `.1` then `` and keeps only the
+ received coordinates (matrix) or received event ids (slice). (3) The BAR
+ `unexpected` diagnosis looked a delivered offset up by offset alone across
+ every partition; it now locates it by (partition, offset), compares the
+ delivered identity (event id, interval, open, revision, lifecycle, final)
+ with the log record's and names the reason (`at_or_before_cursor`,
+ `after_boundary`, `not_in_oracle`, `other_product_key`, `identity_differs`,
+ `same_record_not_expected`). (4) `quota_exhausted_shared_redis` passed in
+ probe runs 1-3 and observed `OK` in the diagnostic run: it seeded only the
+ current minute's counter, so a call authenticated after the minute turned
+ met an empty counter, and it never checked that the gateway consumed the
+ seeded key. It now seeds this and the next minute with the server's exact
+ key (`quota_minute_key` = `RedisMinuteQuota._key` = gateway `auth.rs`),
+ reads the counters back and passes only on RESOURCE_EXHAUSTED with a
+ consumed seeded key; `kn_native_slice_probe.py quota --repeat N` runs it
+ alone plus an unseeded control that must be OK. Tests:
+ `test_kn_native_slice_probe` 43 (1 Kafka skip), `test_kn_canonical_mirror`
+ (rotation) | `tested locally`. Orchestration (outside Git): the guard now
+ tears the run down at its deadline (it used to only exit, leaving 11
+ containers; they were torn down 2026-09-26 02:50Z without purge);
+ `purge` also removes the commit log; `L` label defined for every step.
+- 2026-09-26: **Test isolation: the order-dependent bar-bootstrap failures
+ were my slice-21 test; K4 slice 31** | this commit | The full suite
+ (2,241 tests) failed 1 + 7 tests of `test_phaseb_bar_history_bootstrap`
+ (checkpoint "binding watermarks are invalid") on `HEAD` and on the working
+ tree alike, while the module passed alone. A bisect over the 172 preceding
+ modules named `test_kn_history_fill`, then `EdgeFillTests`: its fixture
+ assigned `type(edge)._binding_ids = property(...)`, replacing the property
+ on `StableBinanceBarEdge` itself for the rest of the process, so every later
+ edge saw three fake bindings. The fixture now uses a test-local subclass;
+ the history-fill + bootstrap + admission + readback modules together: 82 OK
+ | `tested locally` (full suite rerun follows).
+- 2026-09-26: **Probe: identity capture on BAR streams only; K4 slice 32** |
+ this commit | The first live-log probe with the slice-30 diagnosis ended
+ many busy streams with the gateway's typed `RATE_LIMITED: bounded outbound
+ buffer exhausted` (TRADE/QUOTE/BOOK, `missing_lossless` up to 1,437): the
+ probe decoded an identity for every delivered event on all 194 streams,
+ slowing the client below the stream rate - the gateway's slow-consumer
+ bound did its job. Only BAR streams (a few events a minute, the open
+ question) keep delivered identities; `test_kn_native_slice_probe` 43 OK |
+ `tested locally`.
+- 2026-09-26: **Astra KN-4 review closed item by item on the resumed D47
+ shadow; KN-4 IMPLEMENTED_PENDING_ASTRA_REVIEW** | this commit | Shadow
+ (images `kn4-3b853f5` services, `kn4-f6606ad` steps) brought up again with
+ the broker volume kept: the mirror resumed from its transactional
+ checkpoint (22:51Z, the production canonical topic keeps 6 h, so the mirror
+ was started right after the broker; `auto.offset.reset=error` would have
+ refused a lost range) and caught up 5 h 17 min in 29 min; the cache
+ rebuilt from the log (12/12 partitions in 35 s, 202/216 READY, 651 MB).
+ Evidence, all on the isolated shadow: (1) history after the resume: 10k
+ 1m/1h, both venues, FULL and contiguous, isolated cursor VERIFIED. (2)
+ Quota negative alone (`kn4_steps.sh quota`): 8/8 RESOURCE_EXHAUSTED with
+ the seeded key consumed, unseeded control OK, on both gateways. (3) TS 60
+ bindings (`kn4_consumer_matrix.py ts60`, TS image, real adapter): A - every
+ binding on both Query replicas, 587/600 reads OK at 8 in flight per replica
+ (queue wait included): request -> validated view p50/p95/p99 ms QUOTE
+ 61.6/115.7/144.8, MARK 59.8/94.6/119.6, BOOK 76.6/119.6/183.0, BAR
+ 62.6/123.7/176.4; the 13 refusals are the TS client rejecting quiet TRADE
+ snapshots as not execution eligible (its own rule); a 50-way burst is
+ refused typed by the hot lane's 15 pending TS reads per replica (by
+ design). B - the real `DataLayerMarketDataBridge` (streams + MARK/BOOK
+ polls, recording projector, no TS Redis/DB): 30/30 samples 60/60 READY;
+ age at the projector p50/p99 ms QUOTE 460/963, BOOK_DELTA 409/890, TRADE
+ 485/1,705, MARK 986/2,131, BAR from close 1,262/3,930 (n 30). (4) Alpha,
+ sealed compiled bindings, both venues (grid 1h, fib 5m, fib 15m): 52/52
+ reads incl. QUOTE, BAR 5m/15m/1h latest, warmup 500 contiguous from the KN
+ materialised cache (`DATA_LAYER_V2_MATERIALISED_BAR_INTERVALS` = the 14 KN
+ intervals; 0 pass-through). (5) Live-log probe (2 client CPUs): 194
+ subscriptions PASS, 0 duplicate/out-of-order/unexpected/missing over 89,633
+ events, negatives 24/24, RPC 17/17; commit -> client after LIVE p50/p99
+ 14.6/880 ms (n 64,717). The run-3 BAR 5m/15m `unexpected=1` (every Binance
+ 5m/15m stream, none on OKX) did not recur with a 15m close inside the
+ window; Kafka CreateTime equals publish time on both venues (checked), so
+ the stale-timestamp hypothesis is refuted; the mechanism stays
+ unexplained. (6) Stage 35 with the TS runner attached: run 043712 - 10
+ OKX QUOTE refusals in 2 s, diagnostics `SOURCE_SESSION_DISCONNECTED` then
+ `SOURCE_SESSION_UNAVAILABLE` = a production OKX public-session reconnect
+ (generations +3 in 8 h), a correct fail-closed refusal; run 044319 -
+ 6,527 requests 0 failed, 63 streams 0 errors, no OOM/restart/leak, lag
+ 82/68 records, latency p99 ms QUOTE 32-40, MARK 34-37, L2 55-84, BAR 25,
+ TRADE 20-62; KN TS runner 66/66 samples 60/60 READY; the only failed gate
+ is production TS on the old path (3/21 samples OKX BTC QUOTE STALE, age
+ 2.746 s repeated), host idle 32-35 %: not attributed. (7) Warmup cost
+ measured: TTFB 235 ms for 500 BAR rows and 4.5-4.75 s for 10k (~0.47 ms a
+ row in Query), body 7-9 ms, JSON 1.5 MB / 30 MB (~3 KB a bar) - the next
+ latency target, profile first. Cleanup: images `kn4-1213fd5`,
+ `kn4-0ea3850` removed by digest; the mirror log is bounded. Open for the
+ review: the production-TS readiness samples, the unexplained run-3 BAR
+ artefact, the warmup row cost, and that the TS runner measures to the
+ projector call, not the TS Redis write | shadow evidence.
+- 2026-09-26: **Freshness judged at the end of the read, every time; K4
+ slice 33 (Astra KN-4 re-review F1)** | this commit | Slice 28 re-sampled the
+ clock only for a heartbeat newer than the caller's sample; an older one was
+ still aged at that earlier sample: 1,999 ms at the sample, 2,019 ms when the
+ read ended, reported 1,999 and passed a 2,000 ms SLA (Astra reproduced it
+ with a mock clock; my slice-28 test pinned the wrong behaviour). With an
+ injected clock the reader now judges every record at a clock sampled after
+ the read, never earlier than the caller's sample; real skew, disconnect,
+ generation and config mismatch still fail closed. Self-review found the
+ same flaw in two more places, fixed alike: `StableSpoolQueryBackend._quality`
+ took the event age before the session read (now after it, from one later
+ sample), and the execution MARK/INDEX view aged the event and its
+ components before its session read (now re-sampled after it when the
+ caller did not inject a clock). Tests: the over-SLA-during-read case (1,999
+ -> 2,019 ms, `SOURCE_SESSION_HEARTBEAT_EXPIRED` through
+ `evaluate_binding_quality`, and 1,999 without a clock) and a Query clock-order
+ test; both fail on the previous commit and pass now; session/quality/MARK/
+ Query/KN/edge suites 415 OK | `tested locally`.
+- 2026-09-26: **The run-3 BAR `unexpected=1` explained and pinned; K4 slice
+ 34 (Astra KN-4 re-review)** | this commit | Reconstructed from the retained
+ shadow log (168 h): on all ten Binance 5m/15m streams the cursor was the
+ offset just before the 19:15:07Z close record, the stream delivered that
+ record and the later closes (5m: 19:15:07, 19:20:06, 19:25:08; 15m:
+ 19:15:07), and the judging oracle lacked exactly the 19:15:07 record.
+ `matrix_async` took the cursor oracle at T0 (window from T0 - 600 s), set
+ up the client, and anchored the judging oracle at the later run start: a
+ record in [T0 - 600 s, start - 600 s) chose a cursor but was not judged.
+ Binance publishes 5m/15m closes at :07, OKX at :01 (measured on the shadow
+ broker), so only Binance fell in the gap; the new run's green result was
+ timing, not a fix. The judging oracle now opens at the earliest cursor
+ oracle (`judging_window_ns`). Regression `JudgingWindowTests`: a synthetic
+ log with a close in the gap gives `unexpected=1` with the old anchor and 0
+ with the new one; `test_kn_native_slice_probe` 44 OK | `tested locally`.
+- 2026-09-26: **Astra KN-4 re-review: F1 fixed, benchmark corrected, run-3
+ explained; evidence rerun on `kn4-abda016`** | this commit | Receipt
+ `evidence/kn4-closure-receipt-v2.json` (`32c8ee9214928e8a...`, v1 kept)
+ lists four corrections to v1 made on my own review: v1 claimed TS 60/60 on
+ both replicas while its file said 59; "queue wait included" was false
+ (the timer started after the consumer semaphore); the TS age p99 came from
+ an end-biased sampler; stage 35 and the probe ran on the Query binary
+ before the F1 fix. Runner (outside Git) now times from the call
+ (`queue_wait` / `sdk_call` / `call_to_usable`), keeps a uniform per-slice
+ reservoir with start-up and steady apart, stores per binding x replica
+ results and, for a client refusal, the quality of the exact view refused
+ (the TS `_validate_identity` rule wrapped, not changed). Results on
+ `kn4-abda016` (Query recreated one replica at a time): TS A 60/60 positive on
+ both replicas (063818) and 59/60 (065612: OKX BNB-USDT-SWAP had no trade
+ for 18-29 s); every refusal is TRADE with quality LIVE / event STALE /
+ session LIVE / not eligible / `LAST_EVENT_STALE` (TS's 3 s snapshot rule);
+ call_to_usable p50/p99 ms QUOTE 233/575, MARK 204/606, BAR 321/602 - mostly
+ the runner's own 8-slot queue (sdk_call p50 56-75, p99 146-195). TS bridge
+ 60/60 READY in 30/30, 36/36 and 66/66 samples; steady age to the projector
+ callback p50/p99 ms QUOTE 380/893, BOOK_DELTA 340/720, TRADE 396/1,504,
+ MARK 946/2,111, BAR (close) 1,276/3,402. Alpha 52/52, warmups from the KN
+ cache. Probe 184 subscriptions PASS (75,553 events, 0 defects, negatives
+ 24/24, RPC 17/17). Stage 35 (064645) PASS on every gate - KN gates
+ (6,527 requests / 0 failed, 63 streams / 0 errors, no OOM/restart/leak,
+ lag 29/51) and, this run, production TS 20/20; the production gate varies
+ by run (044319 failed 3/21) and is reported apart from KN. Open: the
+ production-TS readiness variation (old path), the warmup row cost (KN-5
+ profile) and the consumer-cache end-to-end (KN-5 handoff) | shadow
+ evidence.
+
+
+### KN Pre-5 Owner Read-Plane Completion (Astra, 2026-09-26)
+
+**Status: IMPLEMENTED / TESTED_LOCALLY / SOURCE_ONLY_HANDOFF.** Completion of
+K4.3/K4.4/K4.5 before Claude starts KN-5, not a new architecture/phase train.
+Guide: [read completion](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-owner-read-completion).
+Bobby requires actual universe daily warmup, reusable execution feeds and
+Binance/OKX reference parity, not a certificate inferred from the TS 60 routes.
+**Baseline:** Data Layer `f176ad6`, `feat/consumer-endpoint-benchmark`;
+alpha `f266097`, feature `fix/kn5-alpha-read-completion` from current dev.
+Preserve the two pre-existing owner markdown hunks. No extra worktree.
+**Scope:** SDK bounded true batch and validated per-item warmup/cursor reuse;
+alpha batch/QUOTE facade; OKX OI history, long/short and taker analytics with
+exact native units/scopes; focused reusable latency/universe test tooling;
+affected capability/contracts/guides and release checks.
+**Invariants:** no strategy/sizing/order changes; V1/serving roles, Kafka/Redis/
+spool/ACL/identities unchanged; no new service, freshness relaxation, fake
+history, cross-venue substitution or invented metric cursor.
+**Tests/exit:** SDK/alpha behavioral tests on both venues: chunk bounds,
+partial/identity/interval/finality/coverage, cancellation, reconnect and ack;
+OKX pagination/boundary/unit/ratio/missing/retry tests and bounded authentic
+provider reads when reachable. All latency in ms from caller before queue to
+decoded/validated usable window, separate source age and per-item failures.
+Universe tests declare symbols, daily anchor, requested/available rows/maxlen;
+50 mixed products x100 rows is not 350 symbols x2500/5000 rows.
+Only affected tests rerun. No C2/runtime deployment in this task.
+**Rollback/cleanup:** revert these source commits only. Disposable tests have
+read-only source, bounded CPU/RAM, no network except public provider reads.
+Reuse existing image; remove own containers/temp artifacts, no broad cleanup.
+Active/rollback artifacts retained. No push/merge/tag in this task.
+**Handoff:** Claude freezes both repos/artifacts and runs universe/hot coexistence
+plus actual cache-write latency in KN-5. Source tests do not certify load.
+
+#### Tested-Slice Journal
+- Entry: rules, guide, source, retained KN-4 matrix and Git inspected. SDK real
+ batch exists but alpha fans out single reads; KN-4 batch used 100 rows/item.
+ OKX explicitly refuses OI history/ratios/taker. Implementation/testing pending;
+ no runtime mutation or certification claimed. Both apply_patch tool and CLI
+ fail mount setup; exact-match scripted replacement used and diff verified.
+
+
+- SDK/source slice: true batch iterator bounds both item count and row budget
+ (default 100 items/10000 estimated rows), eliminates full typed->JSON->typed
+ aggregation, rejects contradictory per-item status/data/counts, and accepts
+ caller-owned BAR warmup for cursor handoff without a second query. Hot price
+ feeds cannot reuse an old initial warmup. CI wheel install/import now uses
+ emitted build manifest instead of a stale 2.0.3 literal. Removed legacy quiet
+ exemptions from target budget/gate: disconnect is never quiet/live.
+- Verification: existing SDK/batch/reconnect suite 31 PASS; expanded run first
+ exposed two new fixture mistakes (interval envelope mismatch, invalid lifecycle
+ FORMING). Corrected fixtures to test valid-shaped wrong interval and
+ IN_PROGRESS; final expanded command in reused `qdl-v2-python:kn4-abda016`:
+ `python -B -m unittest tests.test_kn_pre5_sdk tests.test_phase10_universal_warmup
+ tests.test_fund_phase5_stream_sdk tests.test_qdl_sdk_release
+ tests.test_qdl_sdk_read_reconnect tests.test_qdl_sdk_offset_zero
+ tests.test_phase3_target_driver tests.test_phase3_target_workload`:
+ **155 PASS, 0 fail, 0 skip, 10.195s**, network none, cpus1, memory768m.
+ Container self-removed; no image build/provider/production operation.
+ Source OKX/alpha/benchmark slices still being verified; no KN-5 start.
+
+- Alpha integration slice committed separately as `4a820bf` on canonical
+ `/home/bobby/execution_alpha`, `fix/kn5-alpha-read-completion` from dev`f266097`:
+ true bounded SDK batch, typed QUOTE PubSub, policy-correct per-item projection,
+ BAR cursor reuse and backwards-compatible legacy result map. **147 PASS,
+ 0 fail/skip,17.15s** with actual2500/5000-row synthetic outputs on both venues.
+ Exact command and cleanup are in alpha main-plan anchor of the same name.
+ No strategy/order/runtime edits; no push/merge. SDK dependency is `86e15e8`.
+- Benchmark/handoff slice: `scripts/benchmark_kn_universe.py` is inventory-only
+ by default, requires explicit target pairs/identity/profile for approved reads,
+ uses real SDK batch with default50 respecting alpha quotas and row-budget
+ chunks. Reports ms before queue -> usable item/window, callback separately,
+ HTTP-body bytes, source ages, per-item typed failure/short-history and counts.
+ Scratch rows released, no fabricated retained-universe memory/capacity claim.
+ Supports explicit BAR stream selection and signed initial handoff; never
+ subscribes350 streams implicitly. `--schema` documents the profile contract.
+ Tests: **17 PASS,0 fail/skip**, deterministic TEST_ONLY; parent combined run
+ `python -B -m unittest tests.test_kn_universe_benchmark tests.test_kn_pre5_sdk
+ tests.test_phase3_target_driver -q`: **51 PASS,0 fail/skip,1.632s**. Counts
+ overlap the SDK slice; do not sum repeated runs as independent coverage.
+- Detailed guide now maps consumer jobs to exact shared HTTP/gRPC endpoints,
+ script/profile usage, ms accounting, native daily anchor/listing limits,
+ caller-owned cursor vs legacy dictionary, QUOTE advisory vs Risk authority,
+ future provider extension and the concrete K5.1/K5.2/K5.6 acceptance checklist.
+ Existing KN matrix still owns all11 HTTP/four gRPC RPC coverage. No old spool
+ scan benchmark is used to certify KN. No new phase or runtime operation.
+ OKX reference/provider-admission slice still under verification.
+
+#### Final Pre-5 Source Receipt (2026-09-26)
+
+**Completed scope:** shared SDK/alpha batch + BAR handoff + QUOTE facade;
+OKX exact-contract analytics/admission/capabilities; bounded consumer universe
+measurement and explicit KN-5 workload/endpoint/latency handoff. No new phase,
+service, Rust reducer or Kafka/spool path. This is **source completion**, not
+new production load/latency certification or a runtime handoff.
+
+**OKX correction:** removed obsolete snapshot-only/unsupported assumptions for
+SWAP/FUTURES OI history, global-account/top-account/top-position long-short and
+taker volume. Native instId, UTC interval, contracts/base/USD, top-population,
+SELL-before-BUY, pagination/dedup/gaps/retention/missing fields are explicit.
+No false native basis, ratio component, finality, execution grant or cursor.
+Official docs, bounded real receipts and candidate materialization steps:
+[OKX provider addendum](upgrade/OKX_MARKET_DATA_V5_GUIDE_QUANT_DATA_LAYER.md#okx-kn-owner-reference-completion).
+
+**Admission correction:** new statistics pages use Query's existing async Rust
+provider-admission runtime. Missing config/lane or a deferred grant makes zero
+provider calls; Python local buckets are not substituted for shared authority.
+Each retry takes a new lease. Cancellation drains the actual worker before
+completion, relays late429/50011 cooldown, does not spawn a retry, and retains
+caller cancellation. Candidate source policy adds only statistics lanes; default
+1/s and one in-flight per market is deliberately conservative, not a throughput
+claim. KN-5 must union these entries with its exact runtime BAR/history policy,
+not replace the compiled policy with the reference-only candidate document.
+No live policy/image/config/entitlement was changed. Existing funding/OI snapshot/
+MARK/INDEX/metadata and provider-specific Binance/DNSE quotas remain unchanged.
+
+**Compiler proof:** in-memory copies of existing compiler inputs add15 OKX
+reference entitlements (five symbols x OI-history/ratio/taker at1d), preserve all
+old requirements: OKX20->35, combined reference55->70, reference/L2 manifest
+79->94. Ratio variants remain typed selectors, not duplicate bindings. This is
+UNIT_TEST metadata, not a sealed production bundle; actual universe/identity
+and reference bindings are frozen and tested by Claude in K5.1/K5.2.
+
+**Final parent verification:** existing image `qdl-v2-python:kn4-abda016`,
+`sha256:1596ce7a239bc65d623ee3b37c2d1299a7af0fbdcca256eae58b1341dc7a45f7`;
+source mounted read-only, network none, cpus1/memory768m/pids128, tmpfs192m,
+`PYTHONDONTWRITEBYTECODE=1`. Command `python -B -m unittest -q` with:
+```text
+tests.test_kn_pre5_sdk tests.test_kn_universe_benchmark
+tests.test_phase10_universal_warmup tests.test_fund_phase5_stream_sdk
+tests.test_qdl_sdk_release tests.test_qdl_sdk_read_reconnect
+tests.test_qdl_sdk_offset_zero tests.test_phase3_target_driver
+tests.test_phase3_target_workload tests.test_okx_reference_completion
+tests.test_fund_phase3_okx tests.test_fund_phase4_okx_history
+tests.test_phase104_reference_batch tests.test_kn_provider_admission_edge
+tests.test_phase113_reference_v2 tests.test_phase104_v2_query_stream_integration
+tests.test_phase104_contract_foundation tests.test_phase1_instrument_domain
+tests.test_phase10_universal_demand tests.test_reference_l2_materializer
+tests.test_phase24315_reference_entitlement_materialization
+tests.test_phasec36_liquid_crypto_features
+```
+**323 run:322 pass,1 opt-in public-provider skip,0 fail/error,35.173s.**
+Source/test tree hash remained
+`a410ead1fb3edb593834796ada804dd888bad992247600b866575094f8a41bb9`
+during the run. It emitted a Starlette deprecation and event-loop ResourceWarning
+from the test suite; neither is claimed as a production observation. No full
+Rust/C2 suite rerun: no Rust/IDL changes; affected Python/SDK/contract tests ran.
+Additional worker run includes `tests.test_phasec36_admission_binding`:
+102 run/101 pass/1 public skip; overlap is not additive coverage.
+Alpha:147 pass,0 fail/skip on SDK`86e15e8`, committed `4a820bf`.
+
+**Authentic provider check:** two bounded opt-in OKX runs, each10 public GETs,
+five series x two pages,20 observations,zero failures, no raw rows persisted.
+The final run took5.872s; per-product complete request1075.656-1549.347ms,
+including deliberately500ms pacing before each page. This is BTC/5m direct
+provider wrapper evidence, NOT alpha->Query KN latency, all-symbol/daily proof
+or shared-Rust throughput. Full hashes/window/results are in the provider guide.
+
+**Evidence inheritance:** independently verified all21 files referenced by
+`~/.local/state/qdl-v2/kn4-20260925/evidence/kn4-closure-receipt-v2.json` against
+its hashes;21/21 match. Receipt SHA256
+`32c8ee9214928e8a90bb05cc7a5d2ec80d8f1bfe274783cff7d2cf43ef2b453a`.
+Its stage35 retained run has6527 requests/0failure,63 streams/0error;
+`abda016..f176ad6` changes only the plan. Preserve those results with their old
+artifacts, including prior failed runs,59/60 strict snapshot coverage and
+callback-vs-Redis limitation. Do not relabel them as measurements of this patch.
+This source handoff does not silently change KN-4's review status or KN-5 exit.
+
+**Claude next:** read the detailed guide anchor `kn-owner-read-completion`,
+freeze both source commits and SDK2.0.4 candidate, compile actual universe and
+new reference entitlement/policy copies, then affected fast matrix and existing
+K5 workload/cutover/release sequence. Measure exact60 TS routes plus declared
+universe1d/2500/5000 and all existing endpoints; not350 inferred from5 symbols.
+Do not publish an alpha image with SDK2.0.3 and the new iterator facade. No
+additional architecture or C2 debugging loop is requested.
+
+**Runtime/provenance/cleanup:** no production mutation, restart, build, push,
+merge, tag or release in this task. Canonical DL `/home/bobby/data_layer`,
+`feat/consumer-endpoint-benchmark` (`86e15e8`, `2da88a9` plus this receipt's
+reference commit); alpha `/home/bobby/execution_alpha`,
+`fix/kn5-alpha-read-completion` at`4a820bf`, clean. One checkout per repo, no
+extra worktree. Stable local release tag remains`v2.1.0`, not this source HEAD.
+Serving Query x2`2.1.1-83fa1bc` image`dd065fdf8c43...`, Stream x2
+`2.1.1-ae2d62a` image`37d7f5182ea1...`, Rust x3`389753b37c4f...`, projector
+x6`56d331db87d9...`, BAR/ingestors/Kafka/Redis unchanged. Exact image IDs and
+Query config hashes recorded in provider guide; Query/Stream/Rust restart0.
+All disposable task test containers self-removed. No task-created images/cache
+exist to prune. Inventory:51 images/21.6GB, BuildKit87/6.771GB; disk166GB used,
+124GB available of290GB. Existing active/rollback/Claude candidate artifacts
+retained intentionally; no broad prune or volume cleanup. Two owner plan hunks
+remain unstaged; scoped/staged whitespace checks pass, their old whitespace is
+not silently edited. Contributor BobbyAxerol; remote CI not run (no push).
+
+
+### KN-5 - Target Load, Paired Cutover, Retirement And V2.2.0 Release
+
+**Status: RUNTIME_CERTIFIED / SOURCE_CI_PASS / PUBLICATION_PENDING (2026-09-27).**
+Actual TS uses KN Query/native Stream with SDK2.0.5 and unchanged binding10.
+Final telemetry-aware reader7e7e2d02:300s/29of29TS60READY, no fallback/error;
+82,522events with no new overflow/replay/reconnect, queues drained, noOOM/restart.
+Paired old-V2 rollback/return PASS; production final50 PASS(15,504requests,
+90streams). Matched whole-serving-stack average4.669vCPU over374.415s.
+Ten old SQLite roles stopped, state retained; VN/V1 unchanged. Source3ccb8ee
+remote CI36311629772 all four jobs PASS. Runtime certificate, per-binding latency
+report and release notes are in [v2.2.0 evidence](upgrade/evidence/releases/v2.2.0/RELEASE_NOTES.md).
+Not yet published: final evidence commit, dev/main CI/integration, tag/release and
+scoped artifact cleanup remain. No new runtime repair or architecture phase.
+Details: [actual handoff journal](#kn5-production-handoff-20260927).
+**Goal:** prove and deploy the target read plane, retire the old bottleneck,
+publish an immutable stable release and clean safely, without another phase train.
+**Guide index:** [18.12 work items and K5-T01..T07](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-guide-phase-5),
+[18.6 capacity/latency](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-resources-and-latency),
+[18.13 rollout/cleanup](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-rollout-and-cleanup),
+[18.14 Astra handoff](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-review-handoff).
+
+**To do:**
+- [x] K5.1 freeze measured candidate/runtime/rollback/workload; final dependency-clean artifact tracked below.
+- [x] K5.2 50 logical alpha + actual TS60, burst/recovery and whole-stack resource measurement.
+- [x] K5.3 actual paired Query/Stream handoff and rollback-return; no order path change.
+- [x] K5.4 final replacement300s PASS after serialized preflight; failed first attempt retained.
+- [ ] K5.5 Astra release review, remote feature->dev CI->main, immutable provenance/affected smoke.
+- [ ] K5.6 old writer/projector/tick-spool retirement, ADR/runbooks, cleanup and v2.2.0 publication.
+**Completed:** K5.2 isolated final-50 load PASS (15,504 requests, 90 streams),
+TS60 actual isolated Redis write/readback, universe 480-depth 1,020/1,020 reads;
+source/test fixes and exact limitations are in the acceptance journal below.
+**Verification:** K5-T01/T02 actual production workload and full-stack accounting
+PASS; full-cap allocator evidence is separately test-only. K5-T03/T04 paired
+handoff/rollback-return and controlled disconnect PASS; inherited native recovery
+and contract evidence retained. K5-T06 final TS300s/cache/stream/loop/cursor receipt
+PASS. K5-T07 final remote publication and cleanup remain. Latency report preserves
+sample counts, missing percentiles and source-age versus request-time semantics. Whole-serving-stack steady-state CPU <=5.0 vCPU; no silent loss,
+false eligibility, unbounded lag/memory/disk or unexplained restart.
+**Exit gate:** KN-1..KN-4 and KN-5 review pass, actual target load/cutover/rollback
+proof, coherent source/image/config receipt, old data path off, cleanup documented
+and release published under approved remote workflow. If publication permission
+is pending, state CERTIFIED_PENDING_PUBLICATION, not RELEASED.
+**Technical debt / decisions:** the six predeploy findings and cursor/consumer
+corrections are closed by the linked runtime receipts. Do not claim release
+closure until remote publication and final cleanup are verified. Single-host
+failure-domain limits, governed retention and deferred venues are explicit limits,
+not evidence of global production HA. Do not introduce a mandatory 72h wait.
+**Runtime / rollback:** exact old V2 image/config/state for V2-only products;
+V1 only by allowed policy. Restore route pair, not offset reset/history deletion.
+TS recreate, if needed, is only market_data_service read-config handoff using its
+correct current image/mounts, never TS core/risk/executor upgrade.
+**Cleanup:** active plus named rollback/candidate only; archive expiry, image-digest
+inventory, scoped BuildKit cleanup and merged-branch/worktree safety verification.
+**Astra review:** ACTIVE as implementer/reviewer by owner request; remaining
+production handoff and artifact gates are explicit, not an extra Claude review requirement.
+**Next permitted step:** return to separately approved TS/alpha work after release;
+no automatic execution or new architecture expansion.
+
+#### KN-5 Execution Journal
+- 2026-09-23: owner-approved plan recorded; implementation/tests/runtime NONE.
+- Append tested-slice receipts, release review and publication/cleanup outcome here.
+
+
+#### KN-5 Predeploy Gap Closure (2026-09-27, Astra)
+
+Status: IN_PROGRESS. Owner requests closure of six predeploy findings, not a
+new phase. Guide: KN-5 sections 18.12/18.13; baseline b80e01b. Preserve the two
+owner plan hunks. Scope: expiry-safe research demand retirement; explicit gap
+coverage/missing-generation reporting; whole-cache capacity and full-stack CPU
+accounting; coherent artifact/handoff/rollback packet; truthful tracker status.
+Tests: deterministic contracts and isolated Redis first; bounded authentic
+provider checks for five 3d history discontinuities; test-only capacity fill
+must never be represented as provider data or production load evidence.
+No production deployment, retirement, offset reset, cache deletion, TS/order
+mutation, remote push/merge or publication in this predeploy task. Runtime
+replacement and paired production rollback-return cannot be certified before
+deployment. Preserve existing acceptance and rerun only affected gates.
+Rollback: source revert until deployment; cleanup exact owned test resources,
+retain production and named rollback artifacts. Record exact remaining runtime
+gates instead of declaring source preparation to be a completed cutover.
+
+**Tested source slice:** expired research L2 retirement selects exactly four
+BTC/ETH 260925 snapshot/delta bindings at 2026-09-27; metadata retained, no
+replacement ticker inferred, alpha/TS entitlements unchanged. Source catalog
+11 (712 bindings), acquisition 19, promotion scope 10, research manifest 6.
+Regressions cover inclusive expiry, idempotency, preserved unrelated BAR/metadata,
+and refusal to retire alpha/execution demand. Host apply initially stopped on
+missing protobuf dependency before any write; applied in the existing candidate
+image with network disabled, never against runtime mounts.
+
+KN diagnostic now carries one coverage row per binding, explicit exclusions
+from disabled acquisition, missing-generation/empty-view status and retained
+first/last opens. Default HTTP fails PARTIAL_RESULT for missing demanded views;
+include_coverage=true returns explicit materialization completeness. No history
+completeness is inferred outside retained windows. Old successful response body
+is unchanged; optional coverage is opt-in, OpenAPI/SDK updated together.
+Affected suite: 52 tests PASS (real disposable Redis + API/contract behavior),
+no skips, no runtime mutation. Existing SDK compatibility/contract tests follow.
+
+Contract/SDK/universe/reference entitlement suite: 32/32 PASS. Five bounded
+Binance GETs (one each BTC/ETH/BNB/DOGE/SOL) reproduce overlapping fixed-duration
+3d windows at the historical coordinates, HTTP200, 62-193ms. These are NOT
+missing bars that may be fabricated; source classifies OVERLAPPING_PROVIDER_WINDOWS
+separately from MISSING_PROVIDER_WINDOW and remains fail-closed. Authentic receipt:
+`~/.local/state/qdl-v2/kn5-close-20260927/binance-3d-provider.json`.
+
+Capacity probe uses TEST_ONLY padded real row sizes, Redis's exact 112-row
+listpack/index layout, all 644 BAR products at 12,064 rows (including disabled
+legacy products conservatively) plus four staged/retired product copies. This
+is allocator capacity, not canonical/native replay or market-data certification.
+First isolated cap 7,000,000,000 B reaches typed Redis OutOfMemoryError during
+staging, not container OOM-kill. Retry only this allocator test at maxmemory
+8,000,000,000 B / container 9GiB to measure required headroom. Production limits
+remain unchanged. Full replay/cutover acceptance is not inferred from this test.
+
+**Measured cap result:** 7,769,216 TEST_ONLY layout rows across 644 BAR products,
+plus four staging/retired product copies; 80.492s. Steady 6,970,460,232 B,
+with staging 7,013,770,760 B; RSS 6,757,109,760 B; evicted0, OOMfalse, restart0.
+Candidate maxmemory 8,000,000,000 B/container9GiB now has ~986MB allocator
+headroom plus 1.66GB cgroup margin, NOT an immediate production RAM change.
+Dedicated test Redis/client/network removed after measurement; no volume used.
+
+Whole-stack simultaneous cgroup receipt recomputes 597.492s of the existing
+50-load run: shared Kafka/ingestors/cores plus native KN serving roles = 3.852
+mean cores. Stable quota/provider Redis was missing from that recorder, so the
+full-stack gate remains INCOMPLETE, not PASS. No false use of read-plane1.294
+as whole-stack CPU. Receipt `kn5-close-20260927/serving-cpu-accounting.json`.
+
+Packaging finding: canonical Rust Dockerfile omitted native KN projector and
+stream binaries; add both to the standard image with revision/version labels
+and bounded build jobs. Actual immutable build/smoke is still required before
+source packaging is called ready. Source history/contract/budget suite85/85PASS.
+Additional expiry/budget/provision-packet suite35 run:34PASS/1SKIP (isolated broker opt-in).
+Retirement also refreshes release routing catalog revision/hash atomically; no
+consumer policy/entitlement drift may be hidden behind an old catalog hash.
+
+Release handoff runbook: [paired cutover](docs/runbooks/kn5-paired-cutover.md).
+New 500 daily products need producer/acquisition maps plus real bootstrap before
+read routing; they cannot be activated by a reader manifest alone. Old V2/V1
+rollback does not imply coverage of those added products. Exact current runtime
+image/mount snapshot and immutable candidate artifacts are recorded externally;
+no deploy is authorized by the predeploy runbook. Source-only routing now27.
+Catalog/materializer/gateway bundle/alpha reference tests16/16PASS; additional
+classification/CPU accounting regressions6/6PASS. Tests are affected suites,
+not a claim of an entirely new provider/C2 certification. Source freeze commit
+follows; canonical Rust/Python packaging verification is still pending.
+Tool: apply_patch failed before writing (sandbox mountinfo); workspace rule 32
+permits exact-match replacements, followed by diff inspection.
+
+Packaging follow-up: clean Python build cannot resolve locked vnstock4.0.2 and
+vnai2.4.8; exact PyPI version JSON endpoints return404. Existing tested Python
+image17a359779702 contains those exact locked versions. Implement an explicit
+digest-pinned dependency-image build option, verifying installed main-lock
+versions and RECORD hashes before copying its venv. No lockfile/venue upgrade,
+no arbitrary unpinned base; normal clean builder remains the default. Verify
+the packaged image and standalone SDK, then freeze coherent candidate images.
+Dependency verifier:5/5 regressions PASS (pin, version, tamper, missing hashes,
+platform markers); actual immutable dependency image passes7507 RECORD file
+hashes against main-lock versions (lock6295d2b2..., installed-files0c03aa43...).
+SDK2.0.4 standalone no-source import/old-gap/additive-coverage tests PASS; wheel
+216f3109c2ac5926f796d4bd1748440db8d337e63a5b2a81514e4e273a2c9b34.
+Rust81d4912 canonical image built successfully, including both KN native roles.
+Python build path typo failed before build and was corrected; clean dependency
+resolution then failed on the two upstream404 packages, retained in separate
+logs. The dependency-image option will be used explicitly for final packaging;
+this is verified installed content, not a fabricated upstream wheel artifact.
+Final packaging02cd827: Python and Rust images built, non-root10001. Local
+base digest resolution tried the registry and failed (unpublished local base);
+resolved using an OCI layout exported from that exact image with every blob
+hash checked, supplied as a named build context. No base retag/substitution.
+Packaged Python64/64PASS,0skip on disposable Redis without host source mounts;
+native12 binary linkages PASS, both KN roles fail closed on missing config;
+Query/BAR imports and dependency receipt PASS. SDK from02cd827 reproduces the
+same216f3109... wheel. No runtime latency/performance result is invented here.
+Cleanup next: remove intermediate Rust81d4912 image after checking no container
+reference, exact owned native-builder cache IDs, both disposable build contexts
+and duplicate OCI export. Keep final Python/Rust02cd827, verified dependency
+base17a35977 and every existing production/rollback image/state. No broad prune.
+
+**Checkpoint: PACKAGED_AND_AFFECTED_TESTS_PASS / RUNTIME_GATES_OPEN.**
+[Machine-readable receipt](upgrade/evidence/KN5_PREDEPLOY_GAP_CLOSURE.json).
+Source commits81d4912 +02cd827; BobbyAxerol identity; not pushed or merged.
+Final candidate images (both source02cd827, not deployed/released):
+- Python `qdl-v2-python:2.2.0-rc1-02cd827`, digest
+ `sha256:9ed25f9e5d7632e0814e4f577072a8aea2b6ceb0d53c036a3c617e2f8da55a3f`.
+- Rust `qdl-v2-rust:2.2.0-rc1-02cd827`, digest
+ `sha256:7fe348060734e4f51824b02faed7020465bb8dc754ad5299cb88befba7f9f69f`.
+- SDK2.0.4 wheel216f3109...; same-tree deterministic build and standalone smoke.
+
+| Gap | Honest closure state |
+|---|---|
+| 1 old production architecture | NOT RETIRED; cannot certify replacement before deployment. Paired handoff and old-writer stop remain K5.3/K5.6. |
+| 2 expired research L2 | Source retired exactly4; catalog11/712; TS/alpha unchanged; idempotency/ownership regressions pass. |
+| 3 diagnostic/history | Missing generation and retained bounds fixed/tested; five authentic provider3d overlap windows remain unavailable for strict full history, not fabricated/repaired. |
+| 4 whole budget | Full-cap padded allocator plus staging PASS; maxmemory8e9/container9GiB proposed. Full native replay and whole-stack CPU still need same-window quota Redis measurement. |
+| 5 artifact/handoff | Immutable same-SHA Python/Rust/SDK packaging PASS; exact current22-role rollback snapshot and offline topic packet prepared. Dedicated-principal trust activation, actual paired rollback-return and remote CI/publication not executed. |
+| 6 tracker | Reconciled with existing 50+TS evidence and current remaining gates; no new phase. |
+
+Production inventory compared before/after:22/22 same container/image/start/restart/
+OOM/CPU/RAM configuration; no runtime impact. One canonical checkout only at
+`/home/bobby/data_layer`, `feat/consumer-endpoint-benchmark`; main/dev unchanged
+`e6955f33...`, published tagv2.1.0. Owner's two unrelated plan hunks still unstaged.
+
+Cleanup receipt `kn5-close-20260927/cleanup.json`:0 owned test containers/networks;
+intermediate Rust81d4912 image removed; exact native-builder cache handles removed
+(~1.946GB reported). Default filtered prune initially reclaimed0; adding `--all`
+with SAME explicit IDs removed shared builder references, not image/volume data.
+Both build contexts and duplicate OCI archive/layout removed. Filesystem used
+192,535,576,576 ->189,615,525,888 B (net2,920,050,688 B reduction; concurrent host
+writes mean this is filesystem delta, not exact Docker attribution). Final2.2.0-rc1
+candidates and verified dependency base retained explicitly; active/rollback sets
+untouched. No broad prune, volume removal, production SQL/Redis/Kafka mutation.
+
+Next existing KN-5 action: finalize exact production trust/config/role packet,
+start candidate without spool import, measure whole serving stack incl. quota
+Redis, fast readiness/coverage -> paired handoff/rollback-return -> one300s
+no-order acceptance -> stop legacy writers -> approved CI/release workflow.
+Not CERTIFIED_PENDING_PUBLICATION yet: runtime gates genuinely remain open.
+Read-only handoff check: `docker exec market_data_service python -B ...`
+reports SDK2.0.3, not candidate2.0.4. Native cursor offset0 compatibility must
+be included in the existing paired consumer handoff; do not assume building a
+wheel updates TS. No consumer image/config was changed. Remote CI also needs
+the pinned dependency OCI/registry artifact; local packaging PASS is not CI PASS.
+
+
+#### KN-5 Astra Implementation / Claude Review (2026-09-26)
+
+**Status: SOURCE_TESTED_PENDING_CLAUDE_REVIEW / NOT_DEPLOYED.**
+Implementer Astra, reviewer Claude; this closes the correction source slice,
+not KN-5 load/cutover/release acceptance.
+Owner approved the four findings and related in-scope defects. Baseline
+`718631d`, canonical `feat/consumer-endpoint-benchmark`; the two existing owner
+plan hunks are preserved and excluded from these commits.
+Guide: [owner read completion](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-owner-read-completion),
+[D48](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-d48-daily-universe),
+[KN-5](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-guide-phase-5).
+
+**Scope / gates:** explicit universe ownership preserving independent BAR demand;
+actual-alpha OKX reference entitlement and negative authorization tests; whole
+cache capacity accounting including staging/overhead without silently reducing
+10,000-row entitlement; additive evidence corrections for partial diagnostics,
+sample-qualified percentiles, refusals, queue/SDK/application/cache timing.
+Inspect affected KN read/render/diagnostic bottlenecks and fix bounded source
+defects with correctness-first tests and source-only performance measurements.
+TRADE may legitimately be quiet: never invent ticks, relax execution freshness,
+substitute candles/mark for executable quotes, or call a refused price usable.
+
+**Tests:** targeted unit/contract/authorization/negative/concurrency tests;
+retained-evidence hash verification and a new derived receipt, never rewriting
+old evidence. Use bounded existing test images if dependencies are absent.
+No broad C2 rerun or new architecture. Report exact tests and live limitations.
+**Rollback / boundary:** source/config revert only until runtime review. No
+production writes/recreate, authority/offset/cache reset, credential changes,
+TS/order/alpha activation, push/merge/tag/release. No production latency
+improvement claim without rollout evidence.
+**Exit:** tested source and evidence handed to Claude, not release certification.
+K5.2 load, actual TS Redis-write timing and K5.3-K5.6 remain runtime acceptance
+items. Cleanup only this task's disposable tests; retain active/rollback images.
+**Tool note:** apply_patch (tool and elevated executable) failed before writing
+with `bubblewrap: mountinfo path is not absolute`. Exact-match scripted edits
+are used under workspace rule 32, followed by diff verification.
+
+**Tested slice checkpoint (Astra):** ownership regression `python3 -B -m
+unittest tests.test_kn_universe_top300 -v`: **11 PASS**. Seed ledger owns only
+500 exact rows introduced between `c22f4d3` and `718631d`; modified, borrowed,
+non-universe and independently declared BAR rows remain intact. No provider
+call/config apply was used to test deletion. Compiler dry-run and source apply
+add exactly 15 OKX reference requirements (five symbols x OI-history/long-short/
+taker), retaining current OI. Alpha OKX revision 14; Binance unchanged 14;
+reference revision 5; release routing 26, primary routing 8 (source only).
+Source admission budget must include the same two OKX feed types; no poller,
+acquisition, topic or stream was added. Test image UID 1000 could not write the
+source files; rerun as file owner 1001 succeeded, only four listed YAML files.
+
+**Additional findings being tested:** cache BAR trailer hash previously did
+not bind the Redis open-time field; reader now validates it using the already
+parsed protobuf. Cold bucket decode now polls the existing cooperative cancel
+signal before I/O and per row. Neither changes writer/state format or Rust
+contracts. Test fixture compiler needed its pre-completion baseline restored
+in memory after the source demand acquired the new metrics (otherwise duplicate
+selectors failed convergence). No production mutation resulted from that failure.
+
+**Budget/evidence correction:** `whole_cache_d48` keeps 10,000 served rows and
+2,064 headroom; 7,731,216 total rows imply 5,844,799,296 B steady and
+5,865,791,240 B including inherited staging delta, **extrapolated**, not measured
+KN5 capacity. Current 1.5 GB candidate cap does not fit full retention. Client
+buffers/RSS/mix and old-plus-new overlap remain explicitly unmeasured. No RAM
+or retention changed. Additive corrected evidence:
+`/home/bobby/.local/state/qdl-v2/kn5-astra-20260926/corrected-kn4-evidence.json`
+SHA256 `1475d9e2065670011e052ead29abbd0fe1575b24e6c1311b1f910d02619b7e06`.
+Original evidence unchanged: gap 409 is incomplete, TRADE 74 usable/26 refused,
+small-sample p99 withheld. Current harness must also fail incomplete diagnostics,
+not quietly count them as PASS. This is not a new live acceptance certificate.
+
+**Final verification / reviewer receipt:**
+[KN5_ASTRA_PREDEPLOY_REVIEW.md](upgrade/evidence/KN5_ASTRA_PREDEPLOY_REVIEW.md)
+contains scope, exact test modules/skips, inherited endpoint latency by venue,
+known safety/availability distinctions, deployment requirements and handoff.
+Final affected suite **235 run / 232 PASS / 0 FAIL / 3 SKIP**, 107.961 s;
+`QDL_KN_TEST_REDIS` pointed only to this task's isolated Redis. Skips are opt-in
+provider GET, absent full KN3 capture and Kafka oracle; golden vectors, API
+identity and real Redis tests did run. Test log SHA256
+`6613f20899f1cabff802b9559d4c605264d6c5f74c05db5d592f0de7de397132`.
+All **21/21** inherited artifact hashes match; verification receipt SHA256
+`04efdfcc745e35873bebc2c39ac9ad54a919d4d9578dc1019db1b73c9208c714`.
+New negative checks cover independent demand ownership, native identity change,
+actual compiled alpha subject/manifest (test JWT/provider), open/bucket binding,
+inside-decode deadline/cancel, partial diagnostic and sample-size honesty.
+No full C2, real-provider rerun, Rust build or production performance claim.
+The bounded local 5,000-row profile (test-derived rows, cProfile, 1 CPU) measured
+cold 2,957.661 ms / cached 992.086 ms; not HTTP, not two versions, not p99.
+
+**Cleanup / runtime:** every `kn5-astra-*` container was auto-removed; exact
+Redis ID `643f0e88db93` was stopped after all tests, no volumes or custom network
+were created. No image/build cache was created. Inventory: images 21.58 GB,
+BuildKit 6.771 GB (120.9 MB reclaimable); existing shared candidate/active/
+rollback images were NOT pruned under this source-only scope. Whole-host free
+space before/after cleanup: 131,683,557,376 / 131,627,868,160 B; other host writes
+continued, so no invented disk saving. Query `dd065fdf8c43`, Stream
+`37d7f5182ea1`, TS market-data `06e992004735` keep identical image/start time,
+restart=0/OOM=false. Canonical `/home/bobby/data_layer` remains the only Data
+Layer worktree; source branch `feat/consumer-endpoint-benchmark`, local released
+main tag `v2.1.0`. Source manifests/routing are NOT runtime activation.
+
+Runtime reader mount remains `/home/bobby/.local/state/qdl-v2/r135-b2-335792a-20260920T015057Z/runtime`; no candidate manifest was copied there.
+
+**Next permitted step:** Claude reviews this correction commit and the linked
+addendum in the detailed guide. KN-5 still must measure total cache/RSS/rebuild,
+whole-universe completion, actual TS Redis-write boundary and load; then the
+existing K5.3 packet governs deploy/rollback. Partial gap scan stays visible as
+incomplete, not an all-endpoint PASS. No SLA relaxation, auto-reclassification
+of stale TRADE, hidden retention cut, additional phase, push/merge/release.
+
+
+#### KN-5 Astra Acceptance Completion (2026-09-26)
+
+**Status: IMPLEMENTED_SHADOW_TESTED_PENDING_CLAUDE_REVIEW. No deploy/release.**
+Continue existing K5.1/K5.2 at `e8d3435`; implementer Astra, reviewer Claude.
+The source receipt above remains historical evidence, not completion of this task.
+Scope: complete bounded gap diagnostics; fresh real-data endpoint/binding and
+universe batch/history measurements; actual TS Redis-write/readback timing;
+capacity and whole-cache accounting. Optimize measured bottlenecks without
+weakening freshness, identity, generation, gap or manifest semantics. Preserve
+10k history entitlement and report actual provider availability separately.
+Guide remains KN-5 and D48; no additional phase or architecture.
+
+**Test/exit:** affected source/protocol tests first, then isolated KN real-data
+matrix (both replicas/venues), sufficient per-product samples for percentiles,
+whole-universe warmup, load steps and TS60. Distinguish SDK/request/queue,
+event/component age, source-to-cache and completed consumer write. Never call
+quiet stale TRADE usable or substitute QUOTE without an explicit product choice.
+Incomplete diagnostics and insufficient sample counts cannot be marked PASS.
+Record failures and changes as they occur; no production certification until
+actual results meet the declared gates and Claude reviews the evidence.
+
+**Runtime boundary/rollback:** isolated `kn4-*`/`kn5-astra-*` test namespace,
+existing native binaries/images where source unchanged; candidate reader image
+only after source tests. Reuse retained authentic Kafka/history with provenance;
+no production spool import, source offset commit/reset, Redis flush, production
+recreate, TS/order/alpha activation or release. Read-only canonical mirror uses
+existing authorized namespace. Guard starts before shadow setup; bounded CPU,
+RAM, I/O/provider admission; teardown only owned test resources. Production
+cutover remains K5.3, not implicit in these tests. Keep active plus rollback
+artifacts; inventory cleanup/disk and runtime identity at exit.
+
+**Initial finding:** KN gap scan decodes full retained protobuf BAR history
+under one 5s diagnostic budget. At hundreds of products this is an algorithmic
+read-amplification issue, not evidence that the requested scan is complete.
+`apply_patch` still fails before writing (sandbox mountinfo error); workspace
+rule 32 exact-match edits with diff verification remain necessary.
+
+**Implementation checkpoint:** compact per-bucket BAR diagnostic index is now
+written by Rust Stage B in the SAME Redis Lua transaction as row/revision/floor
+and checkpoint. Generation reclaim deletes it. Query compares exact open-key
+sets, fences generation/source/retention before/after, reports sequence flags,
+and falls back to the verified bounded scan for older/incomplete indexes.
+This is a derived cache index, not a new durable authority or public data schema.
+Python affected reader tests: 25/25 PASS on isolated Redis. Rust library: 20/20
+PASS. Rust Redis integration/revision/floor/reclaim tests running. Initial Rust
+builder cache mount was incorrect; corrected to registry-only mount, no source
+or runtime effects. Actual TS benchmark now invokes the unchanged TS projector,
+awaits Redis pipeline ACK and verifies stored values in test-only Redis; no
+production TS writer replacement. Every duration is milliseconds, sparse p99
+withheld, refused prices retained as refusals. Full runtime measurements pending.
+
+**Isolated runtime packet, recorded before start:** source `1643049` (Bobby
+identity), Python `qdl-v2-python:kn5-1643049`; Rust projector release built from
+the same tree, existing unchanged stream/core binaries. Reuse ONLY retained
+`kn4-kafka-data` test volume and authentic state records, fresh mirror start
+(last 60s), fresh cursor route generation `kn5-astra-1643049`. Old shadow
+outage is NOT a gap-free continuity claim; provider history repairs/bootstrap
+and new cursor boundary define this acceptance window. No production spool read.
+Namespace remains owned `kn4-*`, no host ports; orchestration/evidence copied to
+`kn5-astra-20260926/shadow-run`, previous evidence left intact. Guard/watcher
+before setup, existing read-only source ACL, isolated groups/Redis, no source
+commit. Query two x1 CPU-equivalent scheduling limit remains existing 1.5 CPU/
+1GiB each; projector two x0.5 CPU/256MiB; Kafka 1 CPU/1.5GiB; unchanged stream
+x0.5CPU/256MiB; core 0.75CPU/256MiB. Cache ceiling 6.5GB noeviction/7GiB container
+only on shadow, based on full retained-row extrapolation plus diagnostic index;
+actual allocation and overhead must be measured. Host available ~16GiB before
+setup; do not confuse maximum ceiling with allocation or certification. Existing
+production images/config unchanged. Rollback is stopping this test namespace.
+Affected Python suite 76/76 PASS; Rust real Redis 33/33 PASS plus library 20/20.
+No final C2 yet: use matrix to diagnose, not repeated full certification runs.
+
+**Live setup/finding checkpoint:** copied test `core.json`/`core.env` had old
+UID ownership, causing two safe setup failures; exact test files corrected.
+Query then rejected production authority ENV copied onto the KN candidate's
+`RUST_SHADOW` record. Corrected isolated ENV to that record, never promoted
+production authority. Added Rust provider-admission lanes for new reference
+metrics, using the shared Query ingest-secret binding required by the existing
+adapter (secret values not recorded). Guard remains active, production unchanged.
+
+Real provider bootstrap exposed an additional contract issue: the legacy
+1,095-day spool sizing horizon still capped KN daily/weekly history. KN now uses
+the 10,000-row public bound plus actual manifest demand and provider pagination;
+legacy spool behavior remains unchanged. No invented history: listing/provider
+availability remains an explicit short result. Affected tests and next edge-only
+candidate follow; do not claim whole-universe depth from the old capped fill.
+
+**Actual TS writer probe (during bootstrap, NOT acceptance):** 120 snapshot
+reads included 28 refusals and 43/60 products with successful reads on both
+replicas. The unchanged TS projector completed 11,426 Redis writes and verified
+23,926 keys in isolated `kn5-astra-ts-cache`; writer ACK/readback is now measured,
+not inferred from callback. A new compatibility defect surfaced: nested reference
+errors serialize `diagnostics: null`, rejected by the deployed strict SDK 2.0.3.
+Fix only absent optional diagnostics serialization, keep non-null typed evidence
+and all existing error/nullable fields. Regression includes nested batch problems
+and old-SDK parsing. Freshness failures remain refusals; no eligibility relaxation.
+KN history-cap affected suite: 120 run, 119 PASS, 1 existing skipped integration.
+
+**Source checkpoint:** nullable-diagnostic compatibility and reference/API suite
+21/21 PASS. These changes will recreate only isolated Query x2 and BAR edge;
+production untouched. Candidate retains exact non-null diagnostic evidence.
+
+**Restart regression found on isolated edge:** 10k weekly rows made checkpoint
+verification request negative timestamps. Restrict KN checkpoint verification to
+positive source-time opens; provider pagination still determines actual available
+history. No production effect. Background guard from the setup shell stopped
+with its tool process: replaced with an explicitly held exec session before
+continuing load, recorded as a harness supervision defect, not claimed continuous.
+
+Checkpoint positive-time regression: 18 tests run, 17 PASS, one existing skip.
+First regression setup missed a mock property; corrected fixture, then pass.
+
+**Diagnostic real matrix:** both replicas/alpha identities still returned typed
+409 PARTIAL_RESULT at ~5s. A bounded profiler (no new history/provider reads)
+measured 716 products / 9,484ms and 920 genuine retained-window gaps in the shadow.
+Index exists; next optimization preserves exact key-set/sequence/fence checks,
+but packs the bounded Lua reply as JSON to avoid per-field Python RESP overhead.
+Do not increase the diagnostic work deadline or report these reads as PASS.
+
+**Diagnostic optimization measurement:** JSON bulk alone did not meet 5s.
+Exact contiguous-run encoding reduces Python profile calls 15.4M -> 1.02M;
+remaining 8.5s/9.2s is Redis round-trip/server work. Test-only capacity experiment:
+`kn4-cache` CPU 0.5 -> 1.0, same image/memory/data, rollback `docker update
+--cpus .5 kn4-cache`. Measure before/after; not a production capacity change.
+All 25 affected reader tests passed on real isolated Redis (the first command
+used the wrong test env name and skipped 25; corrected command ran all 25).
+
+**New authentic bootstrap finding:** the expanded provider history reaches a
+Binance BNBUSDT 3d time discontinuity and aborts the whole bootstrap loop,
+starving every later binding including OKX. Do not manufacture missing candles
+or silently truncate the requested horizon. Implement a typed history-gap error
+with exact source/open coordinates and isolate retries to that binding only;
+unknown transport, admission 418/429 and publication failures retain existing
+fail-closed behavior. Incomplete binding stays incomplete, never marks bootstrap
+complete. This fixes cross-product starvation; authentic provider gaps still
+need classification from captured coordinates before whole-universe acceptance.
+
+**Tested slice checkpoint:** run-length diagnostic ranges plus bounded pipeline
+of eight-key readonly scripts completed the actual 716-product scan in 4,550ms
+on isolated cache CPU 1.0; 920 real retained-window gaps reported (not zero-gap
+acceptance). This profiler allows 25s for attribution only; public gate remains
+5s and HTTP/loaded tests still required. Exact index key equality, revision/floor,
+generation/source fencing and partial-index fallback remain; no payload decoded
+on indexed path. Final affected reader/history-retry suite: 45/45 PASS. Earlier
+combined suite 91 ran with two errors in the new test fixture (read-only property
+assignment); corrected and rerun. Remaining bootstrap tests in that run passed.
+History errors are scoped and typed, not accepted as complete histories.
+TS actual measurement on reader `5242526`: 12,000 reads, 243 refusals exclusively
+TRADE eligibility, all 60 products read successfully on both replicas. Other five
+feed groups each 2,000/2,000 successful. Real TS bridge 60/60 READY for 60 samples /
+300s, 75,475 Redis writes, 153,745 keys verified; results in acceptance directory.
+No provider freshness policy, risk eligibility, orders or production changed.
+
+**Universe harness defect found by authentic invocation:** `client_for()` used
+TLS keyword names `cert_file/key_file`, while released SDK constructor uses
+`certificate_file/private_key_file`. All 510 products x2 replicas were correctly
+reported NOT_ATTEMPTED; no request or latency evidence from that run. Fix factory
+mapping and add signature-checked factory regression; prior fake-transport tests
+did not exercise credential/transport construction. This is an implementation
+error in the benchmark, not a provider outage or successful universe test.
+
+Universe benchmark factory regression: 18/18 PASS, including actual SDK
+constructor signature checks. Harness-only change; no reader image rebuild.
+
+**Expanded OKX history boundary:** weekly 10k now reaches before Unix epoch in
+the provider window constructor. Clamp request start to 0, preserving requested
+row count and actual provider exhaustion. Regression calls the real history
+window validator, not only a mock. No provider response is synthesized or clipped
+to pretend the requested depth exists. Native Binance 3d discontinuities remain
+typed with exact historical coordinates; current-window histories still serve.
+
+**Actual universe timing and oracle correction:** requests now execute; 480-row
+chunks of 20 symbols measured ~1.7-2.3s for partly unfilled OKX, ~6.8-8.1s for
+Binance. The benchmark itself then falsely rejected native inclusive millisecond
+close (`end_ns - 1,000,000`), accepting only exclusive/one-nanosecond endpoints.
+Align the test oracle with the existing stable canonical BAR contract; timestamps
+and provider payloads remain unchanged. New regression accepts native ms close
+and rejects a two-ms wrong close. Full matrix already passed 132 target reads,
+48 history ladders, 20 batches, 16 handoffs, 24 replica parity and 8 freshness
+cases; only the two global diagnostic HTTP calls failed (retain evidence).
+
+**18:21 UTC checkpoint:** source history/oracle suite 38 run, 37 PASS,
+1 pre-existing real-Kafka integration skip. Stage20 actual load PASS (receipt
+`shadow-run/evidence/stage-20-181605`); this does not certify stage50 or diagnostics.
+Next isolated edge image includes the validated nonnegative OKX weekly window;
+only test edge is recreated, all production remains unchanged.
+
+**Diagnostic closure scope before edit:** all four public probes still hit the
+5s work deadline as the universe fills. Materialize exact per-bucket run summaries
+inside Rust projector's existing atomic Lua apply, once per touched bucket/batch;
+Query reads summaries with bounded key-count/interval/head/floor/source checks.
+Old caches retain the exact slower scanner, never an empty success. This removes
+repeated sorting of millions of opens from a diagnostic request. Test correction,
+floor, generation, reclaim and incomplete summary against the verified scan.
+An isolated-cache-only summary initialization may use the same source Lua over
+existing test buckets; no production cache/migration or Kafka offsets touched.
+
+Summary slice verification: Python real-Redis reader 27/27 PASS; Rust real-Redis
+atomic cache 6/6 and Stage-B recovery/revision/floor/reclaim 27/27 PASS. The first
+new Python corruption test modified an open below its own test floor; corrected
+to newest retained open and reran. Rust builder first used wrong workspace path
+(no Cargo.toml, no tests executed); corrected to qdl-projector. Derived summaries
+are trusted projector outputs atomically coupled to row/index changes; they are
+not an independent tamper-proof database. Count mismatch or malformed summary
+fails closed; legacy indexes still perform exact key-set checks.
+
+**18:41 UTC real acceptance checkpoint:** `20e5062` reader + native projector
+now serve complete global diagnostics on both replicas/identities: HTTP200,
+833.8-1,250.3ms, 937 actual shadow retained-window gaps. One-time isolated-cache
+summary initialization used the identical committed Lua on 12,523 test buckets,
+9,091ms, zero failures; no source offsets/cache reset/production writes. Native
+future writes maintain summaries atomically. Clippy all-targets PASS; rustfmt
+found own line wrapping plus an older unrelated Stage-B fixture, only own files
+formatted. The obsolete SDK null-error path remains fixed.
+
+Reference matrix: 70/70 authenticated real-provider reads PASS across two query
+replicas for alpha Binance/OKX OI, long-short and taker scope; new OKX identity
+entitlements are exercised, not inferred from wrapper existence. First scratch
+probe attempted a single-replica replicated transport and made zero calls; used
+the proper direct transport for per-replica attribution and ran the matrix.
+
+Stage35 `183541`: FAIL `startup:bounded`, two SETUP OPEN_SEQUENCE_GAP refusals
+(sessions10/30) while expanded provider BAR bootstrap was still applying. This is
+not hidden as latency success. Running streams had zero errors; no OOM/restart.
+Diagnose exact warmup products/window and wait for actual bootstrap/readback,
+not retry full acceptance blindly. Complete global diagnostic does NOT imply
+all historical provider windows are gap-free; exact gaps remain visible.
+
+**Measured mixed-load root cause and next bounded edit:** after provider fill,
+Session10/30 failures no longer reproduce after SOL OKX 1m 5k fill. Stage35 plus real universe
+batch had 6,527 successful hot reads and63 error-free streams, but QUOTE p99
+535/573ms and MARK p99 660/630ms missed the frozen gate. Query is not materially
+CPU-throttled. Code inspection finds single warmup uses cooperative chunked
+rendering while `warmup:batch` still builds/dumps the WHOLE batch in one GIL-held
+path, and does not mark render cold. Fix this asymmetry using the same chunked
+renderer/lease/cancellation semantics, no new process/service or quota changes.
+Test byte-for-byte schema equivalence including partial errors, empty results,
+cursor binding, large chunks and cancelled requests before isolated Query update.
+No final C2 until targeted mixed load succeeds.
+
+**Chunked-batch regression:** first implementation assembled a non-empty
+batch envelope with an empty item list, correctly rejected by the count validator
+(2 failures/1 error). Fixed by validating the lightweight per-item metadata list,
+then rendering each item's rows in existing bounded chunks. Public counts/schema,
+per-item problems and cursor binding are unchanged; cancellation holds the same
+lease until cold work exits. Full previous suite still running separately; do
+not conflate that revision with this new focused suite.
+
+Whole universe480 initial corrected-oracle run: 1,000/1,020 products usable,
+20 typed RATE_LIMITED from one OKX chunk overlapping load startup. Other three
+venue/replica runs255/255; venue completion105.5-127.6s for ~105k rows. This
+mixed-load failure is retained; not reported as a passing whole-universe gate.
+
+Focused chunked-batch/API/cancellation/universe suite:46/46 PASS.
+
+**19:13 UTC mixed-load follow-up:** chunked batch reduced failures to one gate:
+QUOTE Binance p99 312.8ms vs250ms under two simultaneous universe profiles.
+6,527 reads/63 streams had zero errors, no OOM. Inspection finds prefetched batch
+`_warmup_from_history` still runs synchronously on the asyncio loop, validating
+and replacing thousands of row objects. Move that work to the existing bounded
+cold pool, preserve its batch lease/cancellation and add cold checkpoints to the
+eligibility walk. Regression asserts actual worker identity/cold context, not
+source text. No provider/quota/resource or public schema changes.
+
+Verification: first command ran85 tests successfully but named a nonexistent
+API module (one import error); corrected exact suite rerun, no failed domain case.
+
+Cold-prefetch targeted suite85/85 PASS; public API/render suite16/16 PASS.
+
+**19:22 UTC isolated update:** Query1 history clients have moved to Query2.
+Install validated9e81171 only on test Query1 now; Query2 waits for its active
+universe clients to complete, preserving measurements. Guard renewed before
+terminating the old guard, continuous production stop supervision. Candidate
+17a35977...599d06 retains all limits/config/mounts. No production rollout.
+
+**Source-suite limitation:** broad unittest run was interrupted after~48min
+to obtain a stack, not reported as PASS: repeated pure-Python YAML catalogue
+loads at `test_trading_consumer_scope.setUp`, not a runtime deadlock. It had
+advanced farther than quiet log implied. Run the remaining scoped checks and
+an immutable-candidate full suite with test-only compiled SafeLoader, after
+checking its parsed config values match the standard safe loader. This does
+not change production YAML parsing; report the test harness variation explicitly.
+
+Statistics self-review: TS benchmark selected one rank too high when n*q
+was integral. Align to ceil(n*q)-1, retaining sparse-sample rules. The old test
+pinned that off-by-one (one reproduced failure); correct it and cover explicit
+1..100 ranks. Existing raw read samples permit recalculation; final writer
+measurement will use the corrected helper. Harness-only, no image rebuild.
+
+**19:32 UTC history/load checkpoint:** 10 execution1m products each have
+5,000 exact contiguous rows, no sequence flags. Universe2500 original reads:
+1,008/1,020 usable; universe5000:1,012/1,020. All20 refusals are bounded
+RATE_LIMITED on Query1 during overlapping bootstrap load, not missing history.
+Retain these failures. Candidate9e81171 Query1 reread whole510-product480
+profile:510/510 usable,119.5s OKX and117.9s Binance. Exact12 failed2500
+products recovered12/12 on candidate; no full-suite rerun to hide failures.
+Query2 upgraded only after both original universe clients completed. Stage35
+now runs candidate pair with unchanged budgets. No final300s yet.
+
+**Broad-suite classification before final acceptance:** 2,339 run,12 failures,
+20 errors,46 skip. Four import errors are test read-only log configuration;
+two Dockerfile assertions inspected the test overlay instead of tracked release
+Dockerfile. Remaining failures pin pre-extension counts;16 errors expose a
+real certification-harness hard-code (55 refs instead of manifest-derived scope).
+Fix that harness to exact manifest identities, preserve duplicate/policy checks,
+update golden counts for15 approved OKX requirements and run all affected
+modules with writable tmpfs logs and original source Dockerfile. No reader
+behavior changes, no need to rebuild/roll Query for test-only corrections.
+
+Stage35 candidate9e81171 PASS: all frozen gates,6,527 requests/63 streams,
+QUOTE p99 31.0/28.6ms, MARK p99 30.1/31.4ms. This is the declared stage
+workload, not a controlled one-variable speedup claim vs two whole-universe
+profiles. Final50/300s waits for corrected source gate.
+
+Corrected broad failure matrix170 ran:166PASS/4 remaining stale assertions,
+all four corrected and rerun in exact affected modules. Environment errors
+are gone; exact manifest identity regression passes. Statistics5/5 PASS.
+Next: the existing final50-alpha300s, plus actual TS bridge/Redis writer and
+a single whole-universe480 profile on secondary. This is isolated acceptance,
+not production handoff. Reader image9e81171 unchanged; certification/test-only
+changes do not require another runtime image. No freshness/latency gate changed.
+
+Resource accounting update: append exact whole-cache measurement (execution
+plus510 daily products), not only universe increment:1,525,787BAR rows,
+1,171,251,296B used,1,169,522,688B RSS,zero evictions. Retention-cap arithmetic
+remains labelled extrapolated; production caps unchanged. Shadow7GiB is a
+ceiling, not actual allocation. Historical budget blocks preserved.
+
+**19:55 UTC final50 result and bounded correction (not certified):** 15,504 hot
+requests, zero request failures;90 streams, one failure. That stream is exactly
+the intentionally paused5s BNB QUOTE reader: harness applied current2s price
+freshness to its queued replay. Fix only the fault oracle: validate delayed
+frames as non-executable state replay, acknowledge ordered frames, require strict
+current snapshot recovery, and keep replay out of usable-price latency samples.
+Record typed quality on any remaining stream failure. Do not relax actual SDK
+execution eligibility or current-view validation. The final also exposed8s
+cold admission timeout when another universe10k-row chunk owned the serial
+materialization lane. Reduce SDK default aggregate chunk to2,500 rows (individual
+5k/10k requests stay intact), test requested-history preservation and run exact
+whole universe with the same total rows. No lane/SLA/quota/resource increase.
+TRADE OKX p95 121ms also failed100ms; preserve result, rerun affected mixed-load
+only after bounded chunk/fault tests. Shadow mirror/guard may be renewed once
+for this exact test namespace with1h deadline, source read-only unchanged.
+
+Actual TS600s measurement completed:115/115 steady health samples60/60 READY;
+133,878 actual Redis pipeline writes,258,764 readback keys verified; ACK p99
+6.7ms, ACK+readback11.1ms. No TS production write/config change. Snapshot
+3,600 reads had86 TRADE-only freshness refusals; all60products succeeded on
+both replicas, other feeds600/600 each. Retained raw facts are not execution
+prices merely because Redis accepted a write. Initial189test rerun had8test-
+environment errors because /tmp was read-only; rerun adds private tmpfs only.
+
+Final affected source/SDK/fault-oracle regression:189/189 PASS,83.973s, no skip.
+Runtime Query remains9e81171; next image is test-client/SDK only.
+
+**20:12 UTC bounded-universe result:** OKX255/255 completed113,270ms;
+Binance230/255 during final50 startup,25 explicit RATE_LIMITED, not data loss.
+Smaller chunks alone do not handle admitted fleet cold-start contention. Add
+bounded SDK cold-read recovery: at most3 attempts, only typed retryable
+RATE_LIMITED (or a whole validated batch with that same outcome), same identity/
+requirements, bounded Retry-After and cancellable waits. No retry for stale,
+gap, auth, partial mixed outcomes or snapshot/reference/execution price reads.
+Expose attempts/retry counters in benchmark and retain first-attempt failures;
+wall latency includes all waits. This is reusable SDK read backpressure, not a
+provider cooldown or hidden acceptance rerun. Query/runtime unchanged. Existing
+final50 candidate21fda1d continues unchanged and keeps its own provenance.
+
+SDK cold-admission regression133/133 PASS (including exhaustion, no retry for
+quality/auth, mixed partial preservation, cancellation and identity stability).
+Environment/legacy source rerun48/48 PASS; all initial broad-suite failures are
+accounted for by affected reruns, not a claim of a single full green run.
+Final50-bounded candidate21fda1d now PASS all frozen gates:15,504 requests,
+90 streams,30 BAR streams,12 restored reconnects, deliberate5s slow-reader replay
+8 non-executable frames followed by1 strict recovery. Cold4/4 complete,
+no leaked tasks. Initial final50 failure is retained. Additional real TS writer
+450s had84/85 steady samples60/60; one sample58/60 (QUOTE ages3.325/3.127s),
+recovered next sample; this stricter concurrent consumer observation is NOT
+hidden by the frozen gate's production-TS33/33 READY. Need distinguish test
+consumer1CPU instrumentation saturation from provider/session status before
+claiming whole-consumer readiness. No production TS change. Next bounded check
+uses2CPU test consumer (production TS is not capped at1CPU), keeps readback and
+records cgroup use; all Data Layer limits stay unchanged.
+
+**Final measured checkpoint (20:35 UTC):** whole universe480 is now1020/1020
+PASS (510 products x2replicas) on SDK2dad966, validated authentic rows with
+explicit short-listing history. Real cold-contention probe16/16 PASS:24attempts,
+8typed admission retries, exact5000rows each, no quality/freshness retry. Final
+TS600s with2CPU TEST client:115/115 steady samples60/60;149,656 actual pipeline
+writes,305,252 verified keys; ACKp997.9ms/readbackp9913.4ms. Five startup
+RATE_LIMITED stream openings recovered. The earlier1CPU test's one58/60 sample
+is preserved; no controlled causality claim. Query limits stayed unchanged.
+Cold full-universe480 completes in115,681-129,963ms per255symbol venue/replica,
+not a single-symbol latency. Explicit16cold5k contention calls take5,323-19,417ms
+including queue/retry. No claim of instantaneous history or100%usable quietTRADE.
+
+**Cleanup packet before execution:** all tests are finished. Inventory and remove
+only containers carrying exact `kn4.run=kn5-astra-1643049` plus this run's
+`kn5-astra-cache-test`; no production container. Remove empty `kn4-net` and
+`kn4-egress` only. Preserve pre-existing `kn4-kafka-data` volume and every shared
+volume. Stop exact owned guard/watch processes. Retain evidence/native binary and
+one explicit review image `qdl-v2-python:kn5-9e81171`; remove this run's other eight
+unreferenced Python images, exact build-context directories and Rust target.
+Remove only individually identified reclaimable build-cache IDs from this run;
+no blanket prune. Save production start/restart/image inventory and disk pre/post.
+Production rollback and Claude's other images remain untouched. No push/merge,
+release, order activity or production runtime mutation is approved by this cleanup.
+
+**Final handoff / cleanup receipt:** fresh implementation and isolated tests are
+complete for Claude review, NOT an unconditional production/release certificate.
+[Full report](upgrade/evidence/KN5_ASTRA_PREDEPLOY_REVIEW.md#post-patch-acceptance)
+and [37-artifact index](upgrade/evidence/KN5_ASTRA_ACCEPTANCE_INDEX.json) bind the
+exact source/image/test tuple. Reader9e81171, projector20e5062/a95310a, edge822a150,
+final50client21fda1d; SDK2dad966 separately proves16/16 real5k contention reads
+with24attempts/8typed retries. Full universe480:1020/1020PASS across both replicas.
+Keep the earlier2500/5000 original failures plus exact12/12and8/8 recovery, not a
+false fresh full-depth rerun. 70reference reads and4complete diagnostic scans pass.
+Final50:15,504hotreads/90streams,0errors; TS actual Redis600s115/115ready samples,
+149,656writes; ACK+readbackp9913.4ms. Earlier transient58/60sample remains visible.
+TRADE-only stale price refusals remain correct; Risk must request/recheck QUOTE/L2.
+
+Cleanup executed exact scope:14testcontainers/2networks,8image tags,35testcacheIDs,
+9build contexts/Rust target and scoped secret copies. Retain one reader9e81171
+for Claude review, native binary/evidence, pre-existing Kafka and5anonymous test
+volumes; no volume/broad prune. Net free disk121,209,298,944 ->122,719,633,408B
+(+1,510,334,464B). Verified57outside-scopecontainers unchanged image/start/restart,
+and no restart drift from initial shadow inventory. All owned worker/guard sessions
+ended. Main/dev/runtime/rollback untouched; main`e6955f3` is one release-closure
+docs commit after local tag`v2.1.0`; no push/merge/tag.
+Only owner two pre-existing plan hunks remain outside scoped commits. No extra
+worktree. Remaining KN-5 rollout/release/whole-final-topology qualification is the
+existing K5.3-K5.6, with Claude independent review first; not disguised as debt or
+an assertion that current production already uses this implementation.
+
+### KN Documentation And Handoff Receipt - 2026-09-23
+
+**Status: DOCUMENTATION VERIFIED / IMPLEMENTATION NOT STARTED.**
+Owner requested publication of the detailed five-phase consensus for Claude
+Opus 5.5, with Astra reviewing each phase. Added a prominent navigation notice
+and authoritative section 18 to the existing review; earlier discussions remain
+historical and intact. This tracker adds exactly KN-1..KN-5 with guide anchors,
+work items, test IDs, exit/rollback/cleanup, debt and independent review fields.
+No source, config, runtime, test provider, image, broker/cache, TS, alpha or order
+operation is part of this documentation slice. No push, merge, tag or release.
+
+Canonical: `/home/bobby/data_layer`, branch `feat/consumer-endpoint-benchmark`,
+review baseline `74337e71ce8ce7611ca424d33f7a0ab29535733a`; no extra worktree.
+Two pre-existing Unified Plan hunks are preserved and must remain outside this
+commit. Runtime image/config inventory is intentionally not refreshed for this
+documentation task, so no new health/capacity assertion is made. No build/test
+resources were created and no existing active/rollback artifacts were cleaned.
+Contributor: `BobbyAxerol `.
+Validation: `python3 -B` structural check passed: exactly five phases, 30 mapped
+work items, 38 planned test groups, all 55 local links/explicit anchors valid;
+required tracker fields/journals, code fences and added-line whitespace checked.
+The original review and pre-existing working-tree plan bodies were preserved
+byte-for-byte (SHA-256 `5e96f60bee0413735f46997c49791c76b72e22bacb14faae10c528b179ce5646`
+and `00abd3abd34bc7af618ec408d34f7ab3b3a97f7cf137e35097624f10ddfdfedf`).
+These are documentation checks, not 38 executed runtime tests. Scoped staged
+diff must pass `git diff --cached --check`; the pre-existing whitespace hunk is
+excluded, not silently repaired. Added-line counts are in the commit diff.
+Next implementation step belongs to Claude at KN-1 when the owner gives the
+start instruction; Astra has not pre-approved implementation.
+
+
+
+#### KN-5 Production Packet And Handoff (2026-09-27)
+
+Status: IN_PROGRESS, runtime authorization supersedes the prior predeploy-only
+boundary, not the acceptance gates. Goal: replace the SQLite serving path with
+Kafka-native state materialization and publish 2.2.0 only on measured acceptance.
+Guide: [18.12](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-guide-phase-5),
+[18.13](upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-rollout-and-cleanup);
+runbook: [paired cutover](docs/runbooks/kn5-paired-cutover.md).
+
+Approved scope: dedicated additive Kafka client trust/least-privilege ACL and two
+state topics; one bounded market cache; two native projectors; paired Query/Stream
+and compatible market_data_service read-plane SDK/config; bounded producer/BAR
+map and history bootstrap for declared demand. No new venue, alpha execution,
+order/risk/portfolio changes, Kafka reset, Redis flush, SQLite deletion or volume
+deletion. No production spool scan/import. Exact resource and identity packet
+is recorded before each activation, preserving old trust and current users.
+
+Candidate artifacts are already packaged from 02cd827: Python image
+9ed25f9e5d76, Rust 7fe348060734, SDK2.0.4 wheel 216f3109c2ac. Whole-cache cap
+8,000,000,000B/9GiB comes from the recorded full-cap allocator test, not an
+unbounded increase. Host initial available RAM ~18GiB; no admission of concurrent
+full-cache tests on top of production. Measure all serving roles including
+provider/quota Redis, brokers and producer/core, with rollback overhead reported
+separately. Watcher starts before new runtime is started.
+
+Tests/exit: exact fast binding/history/diagnostic coverage on both replicas;
+paired handoff, channel reconnect and cursor resnapshot; rollback to old V2 and
+return (new-only demand remains BLOCKED on rollback); one final 300s real-data
+no-order acceptance after preflight passes; TS Redis ACK/readback and alpha
+call-to-usable milliseconds with denominators; no OOM/restart/loss, bounded lag,
+steady whole serving stack <=5 cores. Existing unaffected evidence is inherited.
+
+Rollback: preserve per-role image/config/mount snapshots in
+~/.local/state/qdl-v2/kn5-close-20260927/production-rollback-manifest.json; retain
+old writers/state until acceptance and compute rollback horizon from retained
+broker offsets. V1 only for expressly allowed routes, never substitute stale
+TRADE/unsupported BAR/L2. Only PASS permits old writer stop, remote feature->dev
+CI->main release and scoped image/build-cache cleanup. Owner's two unrelated
+plan hunks remain untouched and uncommitted. No runtime mutation yet at journal
+creation; all subsequent operations/results append here.
+
+Packet preparation: three stdlib unit regressions PASS; Compose validation PASS.
+Host and runtime Python intentionally lack pytest; those attempts collected no
+tests. Packet tests were changed to unittest (no production dependency install).
+Runtime material created as root:10001 mode0640 in
+~/.local/state/qdl-v2/releases/v2.2.0-02cd827, no existing files overwritten.
+New services: market_cache (1CPU/9GiB), market_projector_1/2 (0.75CPU/512MiB),
+query_kn_1/2 (1.5CPU/1536MiB), stream_kn_1/2 (0.75CPU/512MiB). Limits are ceilings
+with headroom, not performance claims. New private consumer network separates
+legacy DNS; Stream read-view uses qdl-v2-query (native-only on its networks).
+No SQLite mount: only the session-liveness subdirectory is read-only mounted.
+
+Additive Kafka trust packet: dedicated kn-projector and kn-stream client leaves
+under a new client-only CA; copy existing truststore to a new file, import just
+the additional CA, dynamically set listener.name.ssl.ssl.truststore.location
+on broker1/2/3 sequentially. Keep original truststore, old CA, keystores, secrets
+and connections. Apache Kafka broker-config docs explicitly permit dynamic
+truststore replacement without restart (https://kafka.apache.org/41/configuration/broker-configs/).
+Rollback removes only that listener dynamic override (baseline has none); stop
+new native clients first. Do not rotate peer CA or restart a broker.
+State topics/ACLs apply via existing sealed packet; native Stream separately
+gets canonical READ/DESCRIBE and group kn-stream-production- DESCRIBE only.
+No group offset reset or authority promotion. Native bootstrap is read_committed
+on existing canonical plus normal writes to its two new state topics.
+
+Owner explicitly approved the additive three-broker trust packet in response to
+the tool-review stop, including exact dynamic key and rollback. Proceed within
+KN-5; no further scope expansion. Prior attempt was rejected before execution:
+0 broker changes. Client leaves and copied truststore were prepared offline,
+both client chains verify; copied JKS contains exactly old CA + KN client CA.
+Packet regressions9/9 PASS; a Docker create/inspect/remove proof verifies that
+Compose preserves literal dollar characters in healthchecks/env (an actual
+packaging defect caught before rollout). Rollback config parity6/6 PASS against
+live image/env/command/entrypoint/caps/healthcheck/mounts. Three Compose files
+validate; no candidate service started yet.
+Compiled runtime: catalog11/712, acquisition19, core695 mappings; two native
+ingestor configs; existing authority revision1 and writer groups retained,
+artifact attestation now names Rust7fe348060734. Query and BAR have no full
+SQLite state mount. Universe additions are REST BAR1d, not execution streams.
+Production rust_core currently has provider admission disabled: prepared config
+enables the existing Rust boundary with shared bounded BAR/reference policy,
+not a Python bypass. This rolls with the declared core image/config packet.
+First read-only resource watcher completed before authorization; start a fresh
+watch with TS MARK/INDEX refuse guard (10/min), host idle guard (5% for60s),
+RAM floor2GiB and native OOM stop before activation.
+
+Runtime checkpoint: additive trust applied successfully to brokers1/2/3 without
+restart; old admin connection and all six ISR3 partitions verified after each.
+State topics/projector ACL apply performed9 exact mutations. Initial verification
+FAIL is a verifier defect: kafka-topics describe reports inherited broker
+retention.ms=86400000 as if it were an extra topic override. Independent
+kafka-configs describe confirms it is not a topic override. Fix verifier to
+compare exact dynamic topic config, record inherited values separately; no
+retention setting is changed/relaxed. Native Stream read-only ACL applied;
+market_cache started healthy, restart0/OOMfalse; no consumer handoff/projector
+activation until corrected topic verifier passes.
+
+Topic verifier correction:32 tests executed,31PASS/1 isolated-broker integration
+skip (no disposable broker), plus actual production read-only verify PASS with
+0 mutations, receipt8b09d37edb5c3d1e7b2c7d8615c3c7168012b694f788173defa3fc944dcffd32.
+The original FAIL receipt31a36759 is retained. Exact inherited-retention and
+real-extra-override regressions both pass. Existing mutation allowlist still
+forbids kafka-configs mutations. Native projector activation now permitted;
+producer/core, Query/Stream, TS and old SQLite writers remain unchanged at this
+checkpoint. Candidate service names are product-role names, not phase artifacts.
+
+Native startup caught a second provisioning gap hidden by plaintext shadow:
+Stage B's manually assigned `kn-projector-v3-b-data` reader requests coordinator
+metadata despite never joining/committing its group. Rebuild/cleaner use IDs
+under `kn-projector-v3-` as documented in kafka_state.rs/cleaner.rs. Main A/B
+groups and transactional writes already progress, but startup reports one
+GroupAuthorizationFailed per replica. Add only group DESCRIBE for the exact
+data-reader ID and own projector prefix; do not grant group READ/commit to
+manual readers or canonical WRITE. Update sealed plan/regression, idempotent
+apply then verify before accepting native recovery. No offset reset.
+
+Projector metadata ACL correction:33 tests,32PASS/1 isolated broker skip;
+actual idempotent apply PASS with exactly2 DESCRIBE additions, receipt
+9446f4e9588c320f2f741164a74423987a05e1778d00fa83ab6af96c34dc7d92.
+One new native projector restarted intentionally for recovery/auth verification;
+no old service restart or offset mutation. Retained-canonical catch-up continues.
+Before BAR bootstrap, found the shadow backpressure caller did not forward TLS:
+its factory defaults plaintext, which cannot read production broker metadata.
+Wire the existing publisher cert-root into that read-only client, with regression
+for TLS propagation/missing identity and blocked history on unreadable backlog.
+Only BAR Python artifact needs rebuilding; no provider/domain gate relaxation.
+
+BAR TLS/readback suite:40 executed,38PASS/2 test-only broker/Redis skips.
+Actual production TLS connects, and the backpressure probe correctly refuses
+history with GROUP_AUTHORIZATION_FAILED: existing phase8-producer cannot inspect
+new groups. Add only DESCRIBE on the exact core/A/B/metadata group names and
+canonical/bars topic metadata; no group READ/join/commit grant. Probe must then
+report the real backlog and remain closed during retained replay. Producer
+identity/private keys unchanged. This is the same declared least-privilege
+production packet, not a data reset or provider bypass.
+
+Runtime activation packet update: BAR backpressure now uses the actual core
+input `md.raw.realtime.v2` (not the older unused md.raw.stable.v1 topic).
+Retained canonical projector lag is now58 / state-bars9; no offset reset.
+Metadata-only ACL additions6 recorded in bar-backpressure-acls.json. Replica1/2
+native projector status errors={} after the intentional rolling recovery check.
+Python89eeb99 built in54.2s as sha256:d5e5412dfc3fa726913f81436b50893aaf063e8b443940280a55bba83e0f6b9c;
+only TLS backpressure changed versus accepted source, Rust remains7fe348060734.
+Prepared producer packet SHA86dfca5c68ac3322437b02558c374e54682e42f98854950970aec4b4992b6295,
+exact rollback77edf5fc54951467ef717437c556346d8a83cd71bcfbb8bdf1f620956151fb96.
+Next apply sequentially rust_core/2/3, native ingestors, BAR; preserve group/fence,
+Kafka state and private mounts, enables existing Rust provider-admission lane.
+History thresholds reuse tested shadow core20k / A50k / B50k, not unbounded.
+Start two native Query/Stream on private ports only; no TS handoff yet.
+
+Rollout incident,05:17:51-05:19:34UTC: first core with catalog11 beside old
+catalog9 ingestors quarantined input (progress canonical0/quarantines>0).
+Stopped the sequential rollout and restored rust_core to exact rollback image/
+config immediately; no Query/Stream/TS routing change. Root contract is strict
+raw.instrument_catalog_revision == binding.instrument_catalog_revision in Rust.
+Packet incorrectly allowed mixed producer/core revisions; this is an operator
+packet defect, not provider failure. Do not disable revision checks. Preserve
+quarantine evidence, audit the bounded interval and restore source continuity
+before certification. A producer catalog handoff must pause the three raw
+producers, drain the old raw group, stop three core workers, then activate the
+new core configs and producer configs as one bounded revision boundary, with
+normal data writes only and no reset. Rollback uses the same drain/revision order.
+Not a PASS or uninterrupted service claim; consumer fail-closed window must be
+reported. Full consumer handoff has NOT happened.
+
+Additional packet defects found and corrected in the same handoff: core2/3
+still mounted distinct historical core-002/003 files (not the shared directory
+assumed by the replacement), and lacked admission Redis URL/prefix/listen env.
+Both now use candidate files with all695 catalog11 bindings and complete
+shared admission settings. Startup retries before correction are NOT a zero-
+restart PASS. Core1/2/3 now publish canonical again. The guard stopped only new
+KN roles when TS MARK/INDEX failed40/min; native cache rebuilt from state topics
+without any offset reset/flush. Capture the incident, do not omit failed runs.
+
+Compatibility discovery: old SQLite projectors reject new universe canonical
+records outside catalog9 and stop the entire partition. This means keeping
+old writer image alone does not provide a functional rollback after catalog
+expansion. BAR history has been paused immediately. Before proceeding, prepare
+an additive legacy-reader catalogue union (old retained identities + candidate
+catalogue) for the6 old projector/2 old stream/2 old query roles, preserving their
+exact images, state/offsets, TLS, manifests and consumer entitlements. New-only
+products are NOT granted to old consumers. This temporary compatibility config
+keeps rollback usable until KN acceptance; it is retired with the old writers,
+not promoted as the new architecture. Exact original rollback captured first.
+No state deletion or skipping canonical offsets to bypass the poison record.
+
+Resume checkpoint 05:58UTC: all native roles are running; BAR history remains
+paused. Native hot matrix100/100 PASS on real canonical data after ingestor
+resnapshot (two replicas, two venues, five symbols, five hot feeds). Legacy
+projectors now accept the catalogue/acquisition union but are still catching up;
+the TS old path has degraded to3/60 with reconnect/request quota exhaustion.
+This is an incident, not a healthy rollback certificate. SDK2.0.4-only TS reader
+artifact4dba0ac1bb82 passed125/125 tests, source pin e4940dd in Trading System.
+Proceed with the already journalled paired TS reader handoff, preserving exact
+env/mounts and binding10. Stop reader before swapping four executor_network
+aliases, then recreate only market_data. Capture exact reverse network map and
+old image06e99200 first. Native and old names must never overlap on that network.
+No release/retirement until actual TS60 and rollback-return have passed.
+
+Paired handoff applied06:01UTC: TS reader now image4dba0ac1bb82, SDK2.0.4,
+binding/JWT10/env/mounts unchanged. Four network aliases moved without overlap;
+network state is persisted in both candidate and rollback-compatible Compose.
+TS recovered to60/60 by06:03 after the existing minute request quota expired;
+no quota was reset or relaxed. Actual heartbeat observation is running, distinct
+from final all-endpoint acceptance. Legacy projector lag readback24-82/partition
+confirms catch-up (not yet a rollback-return drill).
+A proposed extra producer DESCRIBE ACL on legacy stable-projector-v1 was rejected
+before execution by tool review; no ACL changed. Abandon this optional addition,
+retain the approved core/A/B history backpressure. Do not bypass the rejection.
+Next source-only packet regression rejects mismatched producer/core catalogue,
+missing admission env and mismatched catalogue/acquisition sets before a future
+rollout; inspect actual mounted files, not assumed shared paths. Audit quarantine
+read-only through existing admin identity, without offset reset or republishing
+old ticks into the active execution feed.
+
+06:13UTC paired handoff/rollback-return PASS: old V2 and KN each reached60/60
+and stayed READY for30s after fresh startup; no fallback. Actual KN heartbeat
+observation300s:29/29 samples60/60, fallback0, errors0. Evidence paired-handoff-
+apply.json, paired-rollback-return.json, ts-native-observation.json. This is
+read-plane handoff evidence, not final all-endpoint/load acceptance.
+Whole-stack sample306.94s (BAR paused) uses3.793 core INCLUDING Kafka3/Redis/
+producer/core/cache/projector/readers; legacy rollback overhead1.310 core and
+TS0.432 reported separately. It is not the final with-BAR/load envelope.
+BAR history resumed only after rollback returned healthy; existing core/A/B
+backpressure unchanged. No spool scan or import. Producer preflight16/16 unit
+checks PASS; actual3core/2ingestor mounted mappings/catalog11/712 pass. The
+preflight uses physical MARK/INDEX component identity, not logical product ID.
+Quarantine audit first pass PARTIAL27808 records (transaction control offsets
+must be accounted for); rerun uses read_committed EOF/positions to prove the
+bounded scan completed. Do not claim zero loss or replay stale ticks into live.
+
+Measurement scope addition within K5-T06: read-only external TS market-cache
+observer subscribes only to events.market.v2.* on existing projected-market
+Redis, verifies SET value via GET after publication, and reports event/close->
+cache-readable milliseconds separately from Redis GET time. This is actual
+availability after the server's SET, not the callback-entry proxy and not
+claimed to be TS pipeline ACK time. Bounded client0.5CPU/256MiB,300s, sampled
+per identity, no writes/flush/new Redis/DB/orders. Reuse existing identity/env
+without logging credentials; --rm cleanup. Add timestamp/key/percentile tests.
+
+Fast paired matrix132 reads:128PASS/4FAIL, only Binance BNB BAR5m/15m warmup
+on both replicas (DATA_STALE). Root cause at stable_bar_edge.run_forever:
+bootstrap_history walks640 bindings synchronously before run_cycle, starving
+live REST-owned Binance bars while universe cold history is loading. Shadow
+history_only+mirror hid this production scheduling interaction. Fix narrowly:
+KN writer processes at most one history binding per loop, services already-
+bootstrapped live bindings between turns, and wakes pending history without a
+60s sleep. Never let a live last-open mark an unbootstrapped history complete.
+No thread/state sharing, no provider quotas/SLA changes, no new service. Tests:
+quantum/resume, empty/short/history gap, live priority, cold binding barrier and
+legacy schedule unchanged. Build/roll BAR edge only after affected suite PASS;
+rollback d5e5412d with same checkpoint/mounts. Query/Stream/core/TS untouched.
+A single history fetch retains its existing bounded provider timeout/page/row
+limits; no claim of zero cold-start delay. Final acceptance waits for bootstrap.
+
+BAR cooperative bootstrap regression:71 executed,70PASS/1 isolated-broker skip
+(116.713s). Test container --rm removed. The first harness invocation omitted
+/tmp tmpfs; stopped that exact disposable client, then reran with bounded tmpfs;
+not a runtime OOM. Packet/watch/cache-observer tests19/19 PASS. Source unchanged
+outside BAR scheduling and read-only acceptance instrumentation. Runtime bootstrap
+has now reached recurring live BAR cycles; the patch prevents starvation on future
+cold starts rather than claiming the initial stall never happened.
+Actual TS Redis observer300s:60 product groups,0 readback errors; cache GET worst
+product p99 1.829ms. Event-age samples include quiet/republished values and are NOT
+transport-latency evidence; execution eligibility is reported separately. See
+`ts-cache-availability.json`. Quarantine bounded audit COMPLETE27808 records,
+including27800 catalog mismatch records preserved in Kafka; no zero-loss claim.
+Commit/build BAR-only immutable patch, preserving the same runtime/checkpoint,
+then fast read matrix before final load. No change to Query/Stream/provider quotas.
+
+Post-roll preflight: workload5 matrix88/88 and exact workload50 matrix132/132
+PASS, including the four prior warmup failures. Correct denominator: the first
+matrix was stage5, not stage50; `final-full-fast-matrix` is the132-read gate.
+Readback now verifies all three previously missing OKX1m opens1790486880000.
+BAR image643fed84df5a (source1b496d7) active; healthcheck revealed an inherited
+path defect: env/test point to unwritable removed `/var/lib/qdl-stable` mount.
+Repair only BAR heartbeat env/test to `/var/lib/qdl-kn/heartbeat/bar-edge.json`,
+inside its existing RW state mount. No new image, no weakening age180s. Exact
+before-health Compose retained. Bootstrap restart also revalidates provider-short
+histories (bounded re-fetch, no duplicate publish); do not label that recovery
+zero-cost. Existing checkpoint remains backward compatible. No state resets.
+
+Remote closure started: feature pushed through1b496d7; draft PR21 targets dev,
+not main. CI36301551122: SDK310 PASS; contract job stopped on formatting of two
+Rust test blocks; unit build cannot fetch locked vnai2.4.8/vnstock4.0.2 upstream.
+These are actual release blockers, not failed market contracts. Apply rustfmt
+only to the named test source; supply CI with the already verified immutable
+dependency artifact via authenticated registry, preserving poetry.lock and VN
+behavior. Do not bypass dependency verification/audit or mark CI green manually.
+No runtime code change is implied by either packaging correction.
+Coverage-aware diagnostic200:702 SCANNED,6disabled,4VN UNAVAILABLE, no retained
+internal gaps. Plain endpoint409 remains truthful because VN is V1-only; never
+call it full-catalog history complete. Reference70/70 PASS. Final50 load and
+universe480 production readback running; test-only clients removed by --rm.
+Retirement must also disable the legacy spool rebuild boot unit with exact unit
+backup: otherwise a host reboot could re-enable old writers/delete old spool.
+Native Docker restart plus tested Kafka-state rebuild remains the active path;
+rollback restores the old unit only with the old reader/writer packet.
+
+Final-production50 FAILED, retained verbatim: steady Binance QUOTE latency gate
+and TS59/60 for two heartbeat samples (BNBQUOTE last-batch age2.091s); zero
+request errors/stream errors, no order action/OOM. Whole interval416s native
+stack5.044CPU includes concurrent universe probe; rollback1.342CPU, TS0.436CPU.
+Operator orchestration error: universe480 preflight was still running with the
+same two alpha identities when final load began. It added unbudgeted cold load
+and20 RATE_LIMITED item results to universe (1000/1020 usable, not full PASS).
+Do not call this a capacity certificate or silently omit those attempts.
+Correction to initial diagnosis: actual TS env AND binary show QUOTE probe1s
+(max session2000ms /2000), not2s. No TS cadence/health patch is justified or made.
+Both preflight and acceptance must be serialized. Add final-run assertion that
+no labelled disposable probe is active; regression proves a competing client
+blocks before launch and Docker inspection failure is not treated as empty.
+Retest only failed universe target separately, then one replacement50 run with
+its existing four cold jobs/burst/reconnect unchanged. Do not reduce workload or
+relax thresholds. The all-scope successful reads remain inherited.
+Remote registry push returned permission_denied (token lacks write:packages),
+no dependency image published. Removed temporary registry auth config. Owner
+asked to extend token scope outside chat; continue runtime work meanwhile.
+
+Harness isolation + workload/packet regression54/54 PASS; Rust workspace fmt
+check PASS using the existing1.82 builder, no binary logic change. Remote native
+Kafka/Redis integration job PASS on1b496d7, SDK310 PASS. Contract job formatting
+failure now fixed locally; remote unit build still blocked only at withdrawn VN
+packages (no test cases ran in that job). No skipping those gates. Final probe
+clients have exited; failed universe items are retried in their own bounded
+20-product run, with previous failures kept. Only then a replacement final load.
+
+
+KN-5 production acceptance, 2026-09-27 07:20UTC: replacement final50 PASS,
+15,504 offered/completed requests,90 streams,0 read/stream errors,12/12 reconnect,
+30/30 final-BAR streams,0 missed polls/leaked tasks/order actions. Actual TS32/32
+samples60/60, fallback0, v2_error0; one STREAM_ENDED recovered within existing gate.
+Final-resource window446.163s: whole KN stack4.582vCPU (includes all3brokers,
+provider Redis/producers/core/BAR/native projection/cache/query/stream), old
+rollback path1.337vCPU, TS0.427vCPU separately. No restart delta/OOM. This is
+the declared50-logical-alpha workload, not arbitrary unbounded50-client demand.
+Exact prior universe20 failed-product recovery PASS20/20; original failures kept.
+Evidence root kn5-close-20260927/final-production50-replacement and
+replacement-resources.jsonl. Hot steady QUOTE p99 Binance46.529/OKX33.301ms;
+MARK/INDEX39.685/38.111ms; smaller TRADE/BAR/L2 cohorts report max, not p99.
+
+Retirement packet now eligible from actual paired rollback-return and final
+acceptance: stop only projector_v2, projector_v2_2..6, query_v2_1/2,
+stream_v2_active/passive in qdl_v2_stable_candidate; first archive exact inspect,
+legacy-compatible Compose and boot unit, then disable only legacy spool boot
+recovery. Preserve all images/volumes/SQLite/Redis/Kafka offsets and V1/TS/order
+path. Rollback starts exact retained old roles with union catalog, restores
+paired network/TS reader packet, then restores boot unit only for old ownership.
+No old writer may restart automatically outside this rollback. Verify native
+TS60 and unchanged unaffected restart counts after stop. No release tag yet.
+
+Packaging correction: PyPI project pages now confirm vnstock AND vnai are
+QUARANTINED (2026-09-24), not merely missing old wheels. Sources:
+https://pypi.org/project/vnstock/ and https://pypi.org/project/vnai/.
+Do not bypass security quarantine through retained dependency OCI/registry.
+No new quarantined package installed or published. Owner's token is fine-grained;
+GHCR's classic-PAT/Actions-token requirement was misdiagnosed as a missing scope.
+Withdraw that token-change request. Ask owner whether to omit the unused VN-stock
+SDK from new KN artifacts while leaving running DNSE/V1 unchanged; no silent
+provider capability removal. CIffe7d2e: contract/SDK/native-integration PASS;
+unit build still blocked by quarantine, therefore publication is NOT certified.
+
+Owner approved removing the quarantined VN-stock SDK from new KN artifacts;
+DNSE/Vietnam remain on unchanged running V1 until a separate VN migration.
+Implement packaging-only dependency removal plus explicit missing-SDK failure
+before poller thread/history work, regression no provider/cache/state writes,
+Poetry regenerated lock preserving unrelated versions, clean dependency build,
+full Python source suite and remote CI. Do not import quarantined code to test
+its availability; do not reuse old /opt/venv for the new artifact. Public V1
+running container is NOT recreated. Changed Python artifact requires affected
+native reader/BAR packaging smoke before publication, not synthetic C2 PASS.
+
+Retirement executed:10 exact legacy roles stopped, old boot-rebuild unit disabled;
+post-retirement90s TS9/9 samples60/60, fallback0, no native restart/OOM. No data
+or volume deletion. Production rollback offsets require readable-retention check
+before restarting; old consumers are no longer silently writing or accumulating CPU.
+Dependency boundary tests11/11 PASS; Poetry2.3.4 lock/check PASS. Nineteen unused
+VN SDK/chart transitive packages removed, all remaining versions unchanged.
+`packaging` is now explicit because the existing dependency verifier uses it.
+Missing VN SDK errors before starting a thread or returning empty history; no
+fake provider fallback. Initial test attempts had scratch UID/read-only log mount
+errors before test execution; corrected disposable mounts, no runtime affected.
+Clean-build candidate from this source, then full suite/CI and affected read-plane
+packaging smoke. Measured latency above remains evidence of pre-packaging images.
+
+Clean Python artifact built from4fe7e92 in68.2s: imagef7351c3bda08, no vnstock/
+vnai/vnstock-ezchart installed, no inherited /opt/venv. Full suite revealed an
+outdated catalogue assertion requiring active products for the two deliberately
+retired2026-09-25 futures. Correct only this test to assert the exact retired
+metadata/expiry and absence of live bindings; other orphan instruments still
+fail. Do not restore expired order books to satisfy a test. Packet generator's
+Python digest must use the clean artifact, never the quarantined-dependency base.
+Quiet suite first run was stopped by operator137 for diagnosis (NOT OOM); verbose
+trace shows YAML parsing, not runtime deadlock. Preserve logs and await all cases.
+
+Production load-window resource accounting refined to the actual client run,
+374.415s of matched cgroup samples:4.669vCPU native stack (previous4.582 was
+446s including setup margins). Both denominators retained. Legacy canonical
+rollback group is inactive, offsets captured; md.canonical.v2 retention6h,
+retention.bytes=-1. A rollback after roughly13:24UTC is NOT presumed valid;
+compare earliest readable offsets against saved per-partition offsets first.
+Metadata CLI initially used empty packet admin directory; corrected to existing
+approved read-only admin cert mount. No ACL or broker config changed.
+19 catalogue-retirement/packet tests PASS; known retired metadata is preserved,
+no expired binding re-enabled. Three other remote jobs now green; full unit suite
+continues. Actual source and operational notes remain on one feature checkout.
+
+Scoped artifact cleanup now planned from cleanup-inventory.json: remove only
+unreferenced qdl test/obsolete candidate image IDs, rechecking all containers
+before each removal. Exclude all active + exact rollback images; temporarily
+retain the published v2.1.0 image and Rust builder until green release CI.
+No container/volume/network/source deletion, no broad prune. Fresh KN artifact
+remains retained. Build cache cleanup waits until verification no longer needs it.
+The isolated inventory test PASS21.9s without diagnostic stack dumper; verbose
+full-suite diagnostic attempt139 is retained, not called PASS. Rerun the normal
+suite without injected dump timers and with corrected retired-metadata assertion.
+
+Fresh-artifact affected tests:60 discovered,31PASS/29missing-Redis skips in the
+no-network run. Closed those integration skips on a dedicated disposable Redis:
+40/40 query/readback tests PASS15.356s, including generation/fence/gap, cursor0,
+MARK/INDEX lineage and exact Lua/cache layout. Redis+client removed by --rm/stop;
+no shared keys touched. Wire this exact test into CI unit image on isolated
+Redis; the native integration job previously exercised Rust only, despite a
+Python docstring implying otherwise. This closes test wiring, not a new gate.
+Cleanup removed16 unreferenced image IDs: Docker image accounting24.50->21.44GB;
+BuildKit11.23GB remains until builds finish, no disk-free claim from shared-layer
+accounting. Published v2.1.0 image and Rust builder explicitly retained until
+release CI; active/rollback rows untouched. See cleanup-images-result.json.
+
+Clean-artifact rollout packet (owner blanket KN-5 approval, no new scope): image
+sha256:f7351c3bda080a6d1266d49480dc65d7e590375f178252f858f87a04b1a4d685
+from4fe7e92. Recreate query_kn_1 then query_kn_2, wait healthy individually;
+then only binance_bar_edge. Keep exact environment, mounts, TLS, aliases,
+groups, quotas and source data. Rust/cache/brokers/TS/V1/order path unchanged.
+Rollback Queryd5e5412d and BAR643fed84 with copied exact Compose. Source runtime
+code unchanged except missing-VN dependency diagnostic; remaining52 locked
+versions identical. Native Redis40/40 + boundary11/11 + entrypoint imports pass;
+final50 is inherited for unchanged core/read semantics, affected packaging smoke
+must validate both replicas + actual TS60 after roll. Full suite/CI still required
+before publish. No new300s C2 just for label/dependency exclusion.
+
+Clean-artifact real fast matrix PASS132/132, both Query replicas, no orders.
+Post-packaging TS observation kept raw:9samples, several59/60 during BOOK_DELTA
+SESSION_RESET, then60/60; NOT an all-ready PASS. Observer draft mistakenly
+required heartbeat age<15s while actual TS publication cadence is30s; discard
+that invented condition, preserve raw samples and assess real disconnections.
+Stream logs show resource-exhausted closures with growing per-subscription queue;
+inspect cause before final release, never waive it using earlier final50 PASS.
+Full suite also caught an obsolete Docker-stage string assertion: runtime venv
+now comes from verified-dependencies (default builder), not directly builder.
+Update test to require the verifier/default/receipt and non-root copy, not weaken
+the image check or change runtime logic.
+
+Release Docker regression3/3 PASS after test-only stage correction. Actual TS
+next6/6 samples60/60, fallback0, errors0, after the captured reconnect interval.
+No policy loosened; source heartbeat cadence30s confirms draft15s age test was
+invalid. Native Stream overflow counters89 then stable across90s, but the earlier
+backpressure/replay episode is retained and must be classified for release.
+README corrects active projection to Kafka-state/Redis (not SQLite), states
+VN-stock exclusion and exact whole-stack load-window denominator4.669vCPU.
+
+Full-suite second obsolete assertion expected36 L2 bindings before approved
+expiry retirement. Current32 are exact; add a negative check for BTC/ETH260925
+so the correction cannot reactivate the four expired book requirements.
+Stream counter timeline shows backpressure existed before clean-dependency
+rollout (overflow6 at06:24,43 at07:54); packaging is not established root cause.
+No stream/core/TS patch or quota relaxation has been made on that inference.
+
+Affected dependency/release/L2 regression7/7 PASS20.190s. Same retired-count
+assertion found in stable-edge baseline: corrected36->32 plus explicit retired
+native-symbol exclusion; no runtime catalogue mutation.
+
+Stable-edge catalogue + packet + dependency tests16/16 PASS2.093s. Full suite
+continues once (no repeated C2); three observed failures so far are stale test
+assertions above, each reproduced and corrected with explicit negative coverage.
+CI now includes the real isolated-Redis Python tests; no mandatory gate removed.
+Current production native Stream1/2 unchanged7fe34806; new Query/BARf7351c3b,
+TS4dba0ac1 still uses SDK2.0.4. V1, Kafka offsets/topology, state and order paths
+unchanged by packaging roll. Release remains pending full CI and post-roll
+consumer recovery classification, not claimed certified from process health.
+
+Read-only diagnosis packet:10s aggregate fsync/fdatasync syscall timing on the
+existing market_data_service main PID, no payload/path/secret tracing, no signal
+to the application and no config change. strace itself may add small observation
+overhead, so this is cause diagnosis, not a clean latency benchmark. Needed to
+test the source finding that synchronous FileCursorStore acknowledgement fsyncs
+the shared cursor file and directory from the consumer asyncio event loop.
+
+Remote full suite on679dc77 completed2407 cases,5fail/47skip. All five are
+now identified: Docker verified-stage string, two retired L2 counts, reference
+book count24->20 after the same retirement, and OpenAPI schema count69->71
+after explicit GapProductCoverage/GapScanCoverage addition. Snapshot-vs-generated
+equality already passes; do not remove schemas to satisfy the historical count.
+Correct the remaining two assertions with explicit schema/retired-identity checks.
+
+Read-only TS profile10s:1,259fsync calls blocked4.176849s (mean3.317ms),
+no syscall errors. Source FileCursorStore.save rewrites the full cursor JSON,
+fsyncs file and directory synchronously from StreamSession.acknowledge on the
+asyncio consumer loop. This proves a blocking hot-path contribution; it does not
+by itself prove the entire backpressure incident. No cursor durability weakened,
+no TS source/runtime mutation made. Evidence ts-cursor-fsync-profile.txt; strace
+detached at deadline, measured window is diagnostic not a release latency sample.
+
+Local normal full suite completed2407tests in2459.707s:2355pass,5fail,47skip.
+All five failures are the exact stale assertions also seen in remote CI, not
+additional runtime defects. Their corrected cases are run together below; do
+not relabel the failed full-run log as green.47skips remain explicitly reported;
+40isolated-Redis Query/BAR checks separately exercise the dependency-bound cases.
+No new image build is needed for assertion/docs/workflow-only corrections.
+
+Current KN-5 closure is NOT complete: prior final50 PASS remains valid for its
+bounded window, but recurring native stream backpressure and actual consumer
+recovery after packaging roll require closure, alongside green CI and remote
+release. Native latest TS heartbeat60/60 is not substituted for that evidence.
+The measured synchronous cursor persistence is the next narrow reader/SDK
+boundary to correct without weakening durable acknowledgement or execution
+eligibility. Do not change order/Risk strategy logic or reopen VN migration.
+
+All five corrected failed cases rerun together:5/5PASS on current source; full
+remote CI is required on the resulting commit before any merge/tag. Disposable
+unit/Redis/matrix clients removed, no qdl-kn5 test container left. Images16removed
+already recorded24.50->21.44GB accounting; BuildKit cache intentionally retained
+while KN-5 recovery/release remains open, not described as final cleanup complete.
+Host filesystem now196,916,957,184 used /113,977,679,872 available bytes; this is
+a timestamped observation, not bytes reclaimed attributable to cache deletion.
+Canonical checkout remains /home/bobby/data_layer, feature branch only, no extra
+Data Layer worktree. Owner's two earlier plan edits preserved unstaged. Published
+main/dev v2.1.0 unchanged; no v2.2.0 tag or claim of full release certification.
+
+
+#### KN-5 Cursor Persistence And Final Release Closure
+
+Status: IMPLEMENTING under owner active release goal (2026-09-27). Guide18.12/
+18.13 remains authority; no new phase. Scope: SDK2.0.5 additive async durable
+acknowledgement, bounded single-writer FileCursorStore, TS market-data reader
+only, affected runtime/acceptance and approved remote release flow. Preserve
+VN/V1, order/Risk/strategy/DB, manifest revision and all freshness/stream caps.
+One store admits at most64 operations, batches already queued acknowledgements
+without an artificial sleep, serializes file transactions and retains atomic
+replace + file/directory fsync. Callers complete only after durability. Snapshot
+reset/reconnect and async acknowledgement share a session lock; cancellation
+after admission drains its operation before releasing ownership. Shutdown drains
+accepted work, rejects new work; errors propagate and never advance an ack flag.
+Sync API stays compatible. Disk reads during reconnect also leave the event loop.
+
+Required tests: event-loop progress on blocked fsync; exact queue/concurrency
+bounds; same-key monotonicity, duplicate retry, generation replacement; multi-key
+no lost update; cancellation before/after admission and repeated cancellation;
+close during write; file/directory fsync and rename failures; actual subprocess
+crash/restart with old-or-new atomic checkpoint and duplicate-safe replay. TS
+consumer tests must prove cache commit precedes awaited durable ack, reconnect
+fencing still holds, and both venues retain current feed policy.
+After source gates: immutable SDK/TS-reader image, roll only market_data_service
+with exact current4dba0ac1 image/config rollback; Data Layer Python/Rust images
+need not change for SDK-only runtime behavior. Fast two-replica matrix then300s
+actual TS60/cache observation with matched stream metrics, cursor I/O, resources
+and controlled disconnect recovery. Inherit unaffected universe/reference/load
+evidence. No merge/tag until CI and runtime closure prove the release.
+
+Cursor implementation slice (2026-09-27): FileCursorStore now has a bounded
+64-operation admission queue and one serialized off-loop writer; ready writes
+share an atomic fsynced transaction, no debounce timer. Equal-value retries still
+fsync because rename success followed by directory-fsync failure is not a durable
+ack. Session async acknowledgement is fenced against reconnect/resnapshot and
+rejects superseded event tokens; repeated cancellation drains accepted I/O and
+session bookkeeping. Existing synchronous API remains available.
+
+Verification: isolated existing f7351c3b image, source read-only, network none,
+1CPU/768MiB, disposable --rm client. New persistence/session tests19 plus existing
+SDK stream suite26:45/45PASS. Includes real subprocess exit before/after rename,
+slow disk loop progress, multi-key batching, bounded admission, file/directory
+fsync/rename errors, cancellation/shutdown, generation and reconnect fencing.
+Two first-run test-fixture typos (CursorExpiredError constructor, ControlEvent
+code name) were corrected; their failed logs are not counted as passing runs.
+SDK version moves to2.0.5 for the additive API. TS adapter/wheel/image still needs
+wiring and runtime acceptance; no live consumer is claimed fixed yet. No runtime
+mutation, image build, or shared data write in this slice. Disposable client
+removed automatically; no new image/cache created. Existing active and rollback
+retention remains as above until final release closure. apply_patch remains
+unavailable (bubblewrap mountinfo); exact scripted edits used and diff inspected.
+
+Final SDK slice regression with version2.0.5:52/52PASS in15.147s (19 new,26
+existing stream/SDK,7 stable-release checks), no skips. Source-only evidence.
+
+Reader artifact packet,2026-09-27: SDK5af9a21/TS3e2a3b2,
+tradingsystem-market-data:v1.2.5-3e2a3b2-sdk2.0.5,
+sha256:aa9f737a90a22623d3d76490a0b1367880bd2ae32211ec8db9a164b379ae3dad.
+206/206 packaged TS/SDK tests PASS (Python3.10), no source adapter/SDK overlay.
+Earlier source-mounted187/187PASS. Initial build used bare image ID which Docker
+interprets as repository sha256; failed before build. Retried with inspected local
+base tag, build resolver recorded exact4dba0ac1 digest; network-free install.
+First packaged-test attempt failed nested read-only mount creation before tests;
+corrected separate /sdk-tests mount, all206 pass, --rm cleanup.
+
+Owner-approved narrow rollout: project trading_system service market_data,
+container market_data_service only, same existing packet env/mount/network/command;
+change only image4dba0ac1->aa9f737a. Exact current packet copied to separate rollback
+and SDK205 candidate files in private release root (0600). No other TS role,
+Data Layer role, authority, manifest/JWT revision10, Kafka/Redis/DB/alpha/order
+mutation. Rollback only market_data to4dba0ac1 with the copied config. Stop if
+startup/runtime matrix errors; do not mask cursor errors or raise quotas.
+After healthy startup run fast two-Query matrix then actual300s TS60/cache and
+stream backpressure observation. Acceptance/release still pending at this entry.
+
+Additional shutdown regression caught a real source edge in the new async API:
+cancelling session.aclose while it waits behind a durable acknowledgement returns
+before closing the transport; subsequent close sees _closed and returns early.
+Reproduced1/1FAIL before correction. Fix same scope: one retained close task,
+shield/drain it across repeated cancellation; FileCursorStore close also drains
+an admitted read on cancellation. This does not change feed/cursor contracts.
+Current TS60 observation remains diagnostic until final shutdown-corrected SDK
+artifact is verified; do not certify the first candidate as final silently.
+
+Shutdown correction regression:54/54PASS in the isolated existing runtime image;
+new cancelled-close checks cover both session transport and admitted disk reads.
+No runtime change from this follow-up yet; SDK2.0.5 remains unpublished candidate.
+
+Observed first cursor candidate aa9f737a (not final shutdown artifact): SDK205 fast
+matrix PASS132/132; actual TS300.002s external cache observer has60groups/0errors,
+30/30heartbeats60/60READY, fallback0/V2error0. Native stream1 over32metric windows:
+overflow+0,replayed+0,opened+0,delivered+90,893; queue peak156,893bytes/end0,
+RSS322,473,984 constant. Stream2 RSS127,524,864 constant, no restarts/OOM/closures.
+Worst per-binding external Redis GET p99=1.486ms, not event age or full SDK latency.
+Evidence sdk205-acceptance/*.json. Separate10s main-thread strace after acceptance
+has0fsync/fdatasync calls, vs1,259/4.176849s before; this proves removal of that
+blocking path, not an independently measured event-loop-lag percentile.
+
+Final shutdown-corrected candidate: SDK956045d / TS2286f58,
+wheel2d0cb3fa49fb9879a4b6417d492e10150255cf7e97c94b85eceafc0660aa01db,
+image sha256:f4c9b14d058b16cdaa2e1f6bc80d6551474da4b0fa0df39392ae1c960212dc82.
+Packaged208/208 TS+SDK tests PASS; existing base4dba0ac1 unchanged. Apply same
+market_data-only image packet, preserve env/mounts/rev10; rollback4dba0ac1 config.
+No other TS/DL role affected. Before final steady acceptance, bounded controlled
+reconnect may terminate only this reader's established TCP to native Stream8210
+in its own network namespace, one shot; preserve network/routes/Query/Redis and
+all other sockets. Record prior socket target, injection time, typed disconnect,
+cursor recovery and exact resulting runtime. No stream service restart or order
+mutation. Reconnect experiment is separate from steady300s performance window.
+Previous59/60 episodes and observer results retained, not erased by a retry.
+
+CI059c4ae full PASS; latest956045d run36309153900 in progress. Superseded5af9a21
+run36308932662 cancellation requested202 to avoid duplicate CI work. No dev/main
+merge/tag yet. No disposed test container left; both tiny build contexts only
+contain4 nonsecret source/artifact files, to remove once final build verified.
+
+Final readerf4c9b14d running after market_data-only replacement,208/208 packaged
+regressions. Controlled TCP disconnect at09:29:05UTC removed only reader connection
+to stream1:8210; ss emitted an ancillary RTNETLINK warning, but subsequent socket
+inspection proved old connection absent and new connection to stream2:8210.
+TS typed heartbeat became50/60 with exactly10 BAR SESSION_RESET routes, then60/60
+after the next final BAR/heartbeat publication. Scope failure was observable and
+fail-closed, not called uninterrupted60/60. Recovery receipt records seven sampled
+states50/50/50/50/50/50/60 and target socket; no config/service restart for injection.
+Final steady300s observation uses f4c9b14d, separate sdk205-final-acceptance path.
+
+Scoped cleanup removed superseded unreferenced aa9f737a reader image and two exact
+four-file SDK build contexts; activef4c9b14d, rollback4dba0ac1 and DL artifacts remain.
+Filesystem used197,929,615,360->197,928,341,504bytes (concurrent writes apply; not
+claimed exact reclaimed-image size). sdk205-cleanup.json records inventory/result.
+No volume/network/state deletion. All --rm unit/lock clients removed. BuildKit
+cleanup remains deferred to release; no broad prune.
+
+Consumer audit found execution_alpha's existing async feed/L2 wrappers still call
+the synchronous SDK acknowledgement API (orchestration/data_layer_v2.py1430/1512/
+2058). No alpha is activated by this goal. Before claiming hot-alpha SDK convergence,
+wire the shared read/ack facade to the additive async API with compatibility tests;
+source-only, no strategy/order mutation or alpha runtime activation. This is the
+same cursor boundary, not a new phase or a reason to rerun server299-product C2.
+Record its source/test work in ALPHA_RUNTIME_MIGRATION_ARCHITECTURE.md as well.
+
+Final SDK reader f4c9b14d steady acceptance09:31:14-09:36:27UTC completed:
+external Redis observation300.060s,60groups,0errors;30/30TS heartbeats60/60READY,
+no fallback/V2 errors. Stream2 (automatic failover target) delivered104,458 events,
+overflow/replay/opened deltas0, no closures; queue peak472,379bytes/end0,
+RSS134,262,784->135,122,944 (bounded short-window change, not a multi-day leak
+certificate). Stream1 idle:queue0,RSS322,514,944->322,519,040. No restart/OOM.
+Worst per-binding Redis GET p99=0.964ms; event-to-readable distributions remain
+separate in cache.json and include quiet event age (not new-event latency).
+Matched evidence sdk205-final-acceptance/{receipt,summary,cache,heartbeat}.json.
+CI956045d:contract/native-integration/Python3.10 PASS, unit-tests still running.
+No v2.2.0 publication yet. Current checkout feature956045d plus these evidence/docs;
+SDK/TS source committed as956045d/2286f58, runtime Query/BARf7351c3b,Rust7fe34806,
+TSf4c9b14d, TSmanifest10; legacy10roles remain stopped, VN/V1 unchanged.
+
+Alpha audit additionally confirms runtime/pyproject.toml and Dockerfile.numba
+still pin SDK2.0.1, despite newer shadow SDK evidence. Source branch
+fix/kn5-alpha-read-completion is clean; no alpha runtime service was activated.
+Next same-scope closure: update official shared alpha SDK artifact/pin and async
+read/ack facade (preserve sync compatibility), run targeted source tests on both
+venues, journal its own main architecture plan. Do not claim existing alpha
+image contains SDK2.0.5 or reuse TS certification as an alpha deployment claim.
+Final release still requires full CI, unified artifact receipt, approved remote
+integration/release and final scoped BuildKit/branch hygiene. Goal remains ACTIVE.
+
+Shutdown completion audit,2026-09-27: bounded isolated subprocess reproduced an
+SDK defect: asyncio.run cancels the private writer during a200ms disk write;
+thread finishes but batch futures remain unresolved and process exceeds3s. Child
+was killed, no runtime/state touched. Same cursor scope: protect accepted worker
+I/O and completion notification against global task cancellation, including reads.
+Add subprocess shutdown regression and retain fsync/error semantics; targeted
+suite before rebuilding any artifact. Existing runtime acceptance stays tied to
+956045d and is not silently relabeled as this new candidate.
+
+Shutdown closure source result:60/60 unittest PASS in80.193s in existing
+Data Layer f7351c3b image with read-only source/network none/1CPU1GiB. Includes
+22cursor tests (new subprocess matrix:write/queued/error/read/early shutdown),
+26stream tests,4wheel tests,8release tests. The first TS-image run had6 failures
+due to missing pandas (50passed); Data Layer image has no pytest, so corrected
+the runner to standard unittest without installing anything. Both failed
+invocations are environment mistakes, not passing evidence. All clients --rm.
+CI956045d ran2428 tests,47skip,one failure: wheel test still pinned2.0.4. Updated
+expected2.0.5; packaging test4/4PASS separately, included in60/60 above. Do not
+merge old red CI. New wheel a1a3af7d12188a70154a948f5bfa707135c1d674848e8dc892403eb2d2b14a88
+(source digest9ddc401d25b44296b303443653346f9029e163b70efe0dac96be15c2404c8cef)
+is an unpublished source candidate, not yet installed in TS/alpha. No runtime
+changed; active TSf4c9b14d and rollback4dba0ac1 retained. Alpha174test result is
+for previous wheel2d0cb3fa; must refresh/test its final artifact before commit.
+
+Artifact convergence follow-up: alpha49587c3 source-only174/174PASS with installed
+a1a3af7d wheel; Ruff PASS. TS c77d2a8 installed-wheel consumer/bridge/projector/
+slice-health219/219PASS. No alpha activation or strategy/order mutation. DL3ccb8ee
+pushed; CI36311629772 is running (old956045d fails only stale2.0.4 assertion).
+Build exactly one market-data reader from retained4dba0ac1 base, TS c77d2a8,
+SDK3ccb8ee/a1a3af7d, four-file private build context. Existing f4c9b14d remains
+active until packaged verification; do not relabel previous runtime receipt.
+
+Packaged candidate tradingsystem-market-data:v1.2.5-c77d2a8-sdk2.0.5 digest
+sha256:5b66c2cd68459cda3c0273256e7cf1ad9c5a0560875e57b88559056d35b6213e
+passes241/241 consumer/bridge/projector/health/cursor tests, no SDK/source adapter
+overlay. First mount placed tests at/ts-tests, so5path-relative fixture reads
+failed(236pass); rerun at/app/tests passed, no implementation changes for that.
+Approved image-only market_data_service roll: fromf4c9b14d to5b66c2cd, identical
+project trading_system/env/mounts/revision10/network. Exact rollback copied from
+ts-sdk205-final.compose.json. Only service market_data with --no-deps; no other
+TS/DL role, order path, DB, alpha or source authority mutation. Observe300s actual
+TS60/cache/stream metrics after readiness, inherit SDK fast132/132 and unaffected
+server/load evidence because this patch changes only accepted shutdown I/O.
+
+Final shutdown artifact5b66c2cd actual acceptance10:17:12-10:22:25UTC:
+300.004837s external TS Redis observer,60groups/0errors;30/30TS heartbeats60/60
+READY, fallback0/V2errors0. ActiveStream1 delivered110,453, overflow/replay/opened
+deltas0, closures0, queue peak111,642bytes/end0, RSS318,246,912 constant. Passive
+Stream2 queue0/RSS131,661,824 constant. No restart/OOM. Worst supported per-binding
+Redis GET p99=0.884ms (not full event-to-consumer latency); low-sample products
+retain null p99, never converted from max.12s read-only strace overlapped window:
+765fsync calls,0on main thread,0errors, syscall p50=3.488ms,p99=6.648ms,max8.339ms;
+not a complete checkpoint transaction or independently measured loop-lag percentile.
+Evidence sdk205-shutdown-acceptance/{receipt,summary,cache,heartbeat,cursor-fsync-summary}.json.
+
+Cleanup removed exact four-file build context only, filesystem used
+198,442,356,736->198,442,180,608bytes; no image/volume/state deletion in this slice.
+Disposable test/observer clients removed via --rm; immediate rollbackf4c9b14d
+and earlier4dba0ac1 retained until final release inventory. SDK3ccb8ee, TSc77d2a8,
+alpha49587c3 all pushed to feature branches; no dev/main merge or v2.2.0 tag yet.
+CI36311629772: contract/native/Python3.10 PASS, unit-tests still running.
+Source alpha is tested, not activated. Runtime exact TS5b66c2cd/manifest10,
+DL Query/BARf7351c3b and Rust7fe34806 unchanged, old10roles remain stopped.
+Remaining closure: full CI, certificate/release artifact reconciliation and remote
+release flow, final scoped cleanup; do not call goal complete before publication.
+
+Final requirements audit: goal explicitly asks matched event-loop delay and cursor
+persistence counters; syscall trace alone is not event-loop lag. Add bounded
+telemetry to existing TS market_plane health publication only: monotonic wakeup
+delay measured after scheduled sleep (exclude metrics Redis call time), numeric
+cursor counters from public SDK store metrics, no tokens/paths/prices. First
+sample has no timing observation. No new task/service, no feed/freshness/order
+behavior changes; cadence existing metrics interval. Tests inject timing and
+failure/cancellation, then image-only same reader packet with exact rollback.
+No broad C2 rerun; one matched TS60 observation for final artifact and counters.
+
+Telemetry packaged245/245PASS on TSimage7e7e2d026a9f301db0c32237063b4f518a6503e986e6206ad9a7e1a79b01ceea
+(source a9a92e5, same SDK3ccb8ee/a1a3af7d). Roll only market_data_service from
+5b66c2cd to7e7e2d with same env/mount/revision10; exact ts-release-reader-rollback
+packet retains5b66c2cd. Only telemetry changes versus accepted image; observe
+300s TS60 with existing health-key GET for loop delay/cursor counters, alongside
+cache and stream timeline. No change to other services or execution path.
+
+Final reader telemetry acceptance10:35:48-10:40:58UTC passed on7e7e2d02:
+300.000849s actual cache observer,60groups/0errors,29/29TS60READY; no fallback.
+29 unique10s timer samples: wake delay p50=1.077808ms,p95=2.511421ms,max=4.961793ms,
+p99 unavailable. Cursor delta29,995ACK/7,805commits/0errors;mean batch15.085426ms,
+pending sampled max17/end0,peak since start28 of64. Max batch406.205ms is since
+startup, not a claimed in-window percentile. Stream82,522events,0new overflow/
+replay/open/close, queue max167,390bytes/end0;bothRSSconstant,noOOM/restart.
+External cache GET worst supported route p99=0.905ms, separate from source age.
+No profiler overlapped this final window. Evidence sdk205-release-acceptance.
+
+Prepare v2.2.0 runtime certificate/endpoint report/release notes from immutable
+evidence above and inherited final50/reference/universe/coverage/rollback.
+Certificate PASS is bounded runtime acceptance, not assertion CI already green;
+publication stays gated by remote CI and dev/main release integration. Reconcile
+README/access guide SDK2.0.5 and final resource decision while retaining historical
+budget measurements. Do not change runtime/config/provider thresholds or rerun
+299product acceptance. No alpha execution or VN/V1 migration.
+
+Release packaging closure: publish the same SDK2.0.5 wheel/manifest/SBOM and
+endpoint report with GitHub v2.2.0 certificate. Existing release workflow builds
+SDK deterministically from tagged source using stdlib, verifies wheel hash equals
+certificate before gh release create. No package registry permission workaround,
+no vnstock/vnai fetch, no image rebuild or runtime mutation. Tag still requires
+main ancestry and runtime PASS, and operator flow still requires green CI.
+
+Release metadata checks:9/9 budget/contract tests PASS,15 evidence hashes and
+endpoint-report hash verified, both TS/alpha wheel hashes equal certificate.
+Rust02cd827->HEAD differs only in formatting under cfg(test)/integration tests;
+no production Rust implementation changed. Python4fe7e92->HEAD qdl/app/config/
+consumers has no committed runtime diff; current budget annotation only records
+measured acceptance and is not a runtime quota change. Packaging rehearsal builds
+exact a1a3af7d wheel, rejects wrong hash, verifies publication shell syntax.
+First rehearsal selector assumed every Actions step had a name; corrected to
+get(name), no workflow runtime failure. All disposable clients removed; exact
+5-file build context removed, disk used198,717,460,480->198,717,259,776bytes.
+CI36311629772 all4jobs PASS on source3ccb8ee. Final evidence/workflow commit needs
+its own remote checks before merge; no tag/publication done at this checkpoint.
+
+Release operational-pointer audit (2026-09-27): runbook still described SDK2.0.4
+and the early incomplete CPU receipt. Corrected to actual SDK2.0.5 reader7e7e2d,
+immediate rollback5b66c2cd, catalog11/712 and matched whole-stack4.668721vCPU.
+Explicitly marked ts-release-reader.compose.json as authoritative; historical
+ts-candidate/sdk205 packet names are not deployment defaults. Private packets
+read-only inspected: current and rollback image match certificate; no file/env/
+mount/runtime changes. CI36314203205 currently3PASS/unit running; no publication
+yet. Documentation consistency check verifies all exact image/packet references
+against private runtime files and immutable certificate. No new runtime test or
+image required because this change only corrects operational documentation.
+
+Scoped release cleanup packet (2026-09-27, before action): remove only superseded
+unreferenced images f4c9b14d058b (old SDK candidate),643fed84df5a (Python rc3),
+d5e5412dfc3f (Python rc2). Keep active TS7e7e2d02, immediate rollback5b66c2cd,
+active DL Pythonf7351c3b/Rust7fe34806, all container-referenced images and other
+projects unchanged. Recheck all container references immediately before removal;
+no force, no volume/network/container prune, no BuildKit broad prune. Record
+pre/post disk and unchanged running-container start/restart/image state outside
+Git, then append exact result here. CI final documentation commit remains running.
+
+Image cleanup executed:3/3 removed without force;disk used198,829,408,256 ->
+197,726,879,744bytes; all running image/start/restart tuples unchanged. Evidence
+release-scoped-image-cleanup.json. Additional BuildKit cleanup is restricted to
+48 currently reclaimable, non-shared, non-mutable cache IDs whose descriptions
+identify QDL/SDK build steps. Each prune uses exact ID filter, never whole-host
+prune; unrelated/in-use/shared cache remains. Verify active/rollback images and
+runtime unchanged afterward; record the actual count rather than assume every
+parent entry can be removed while children retain references.
+
+BuildKit cleanup result:9 scoped records removed,0 unexpected IDs, all runtime
+image/start/restart tuples unchanged. The first exact-filter spelling id== was
+rejected by this Buildx version before any deletion; corrected to id= and kept
+the failure in evidence. Remaining parent/shared/in-use records were not forced.
+Disk used198,264,659,968->197,405,405,184bytes during cache cleanup; this live
+host also writes market data, so filesystem deltas are observations, not exact
+sums of logical cache sizes. Evidence release-scoped-buildcache-cleanup.json.
+Active and explicit rollback artifacts retained; no volume/container/network
+or unrelated TS/Portal cache cleanup. Final source still awaits remote CI and
+release integration; no additional runtime test or source implementation change.
diff --git a/Dockerfile b/Dockerfile
index ea152a39..35363387 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,5 @@
+ARG QDL_DEPENDENCY_IMAGE=builder
+
FROM python:3.12-slim@sha256:2c941e860699f878900b0edc2403613c234d4b32eda3cc9fa7036991a2a63c4a AS builder
ENV PYTHONUNBUFFERED=1
@@ -17,14 +19,25 @@ RUN python -m venv /opt/venv && \
poetry install --no-root --only main --no-ansi && \
/opt/venv/bin/python -m pip install --no-cache-dir --upgrade "setuptools>=78.1.1"
+# An explicit pinned image preserves locked dependencies withdrawn upstream.
+FROM ${QDL_DEPENDENCY_IMAGE} AS verified-dependencies
+ARG QDL_DEPENDENCY_IMAGE
+USER root
+COPY poetry.lock scripts/verify_runtime_dependencies.py /tmp/qdl-build/
+RUN /opt/venv/bin/python -B /tmp/qdl-build/verify_runtime_dependencies.py \
+ --lock /tmp/qdl-build/poetry.lock --image "${QDL_DEPENDENCY_IMAGE}" \
+ --output /tmp/qdl-build/dependency-receipt.json
+
FROM python:3.12-slim@sha256:2c941e860699f878900b0edc2403613c234d4b32eda3cc9fa7036991a2a63c4a AS runtime
+ARG QDL_DEPENDENCY_IMAGE
ARG QDL_UID=10001
ARG QDL_GID=10001
ARG QDL_GIT_SHA=unknown
ARG QDL_RELEASE=development
-LABEL org.opencontainers.image.title="Quant Data Layer" \
+LABEL io.qdl.dependency-image="${QDL_DEPENDENCY_IMAGE}" \
+ org.opencontainers.image.title="Quant Data Layer" \
org.opencontainers.image.revision="${QDL_GIT_SHA}" \
org.opencontainers.image.version="${QDL_RELEASE}" \
org.opencontainers.image.source="https://github.com/BobbyAxerol/quant-data-layer"
@@ -48,7 +61,8 @@ RUN apt-get update && \
--home-dir /home/qdl --shell /usr/sbin/nologin qdl && \
install -d -o qdl -g qdl -m 0750 /home/qdl/.cache/matplotlib
-COPY --from=builder --chown=qdl:qdl /opt/venv /opt/venv
+COPY --from=verified-dependencies --chown=qdl:qdl /opt/venv /opt/venv
+COPY --from=verified-dependencies /tmp/qdl-build/dependency-receipt.json /opt/qdl/dependency-receipt.json
COPY --chown=qdl:qdl . /app
diff --git a/Dockerfile.qdl-rust-runtime b/Dockerfile.qdl-rust-runtime
index 1f189f00..96e1a310 100644
--- a/Dockerfile.qdl-rust-runtime
+++ b/Dockerfile.qdl-rust-runtime
@@ -24,6 +24,7 @@ RUN apt-get update -qq \
COPY Cargo.toml Cargo.lock rust-toolchain.toml ./
COPY rust ./rust
COPY generated/rust ./generated/rust
+ENV CARGO_BUILD_JOBS=1
RUN cargo build --release --locked \
-p qdl-kafka \
--bin qdl-realtime-core \
@@ -36,9 +37,17 @@ RUN cargo build --release --locked \
&& cargo build --release --locked \
-p qdl-core --bin qdl-parity-replay --bin qdl-binance-shadow \
&& cargo build --release --locked \
- -p qdl-venue-core --bin qdl-venue-core-certify
+ -p qdl-venue-core --bin qdl-venue-core-certify \
+ && cargo build --release --locked \
+ -p qdl-projector --bin qdl-projector \
+ -p qdl-stream-gateway --bin qdl-stream-gateway
FROM debian@sha256:abd67ffcfa541b485a3dff59865ab629aa048a6c613e639d36e7456b0b229241
+ARG QDL_GIT_SHA=unknown
+ARG QDL_RELEASE=development
+LABEL org.opencontainers.image.revision="${QDL_GIT_SHA}" \
+ org.opencontainers.image.version="${QDL_RELEASE}" \
+ org.opencontainers.image.title="Quant Data Layer Rust runtime"
RUN apt-get update -qq \
&& apt-get install -y --no-install-recommends ca-certificates libssl3 libzstd1 zlib1g \
&& rm -rf /var/lib/apt/lists/* \
@@ -54,5 +63,8 @@ COPY --from=builder /src/target/release/qdl-phase92-primary-rehearsal /usr/local
COPY --from=builder /src/target/release/qdl-parity-replay /usr/local/bin/qdl-parity-replay
COPY --from=builder /src/target/release/qdl-binance-shadow /usr/local/bin/qdl-binance-shadow
COPY --from=builder /src/target/release/qdl-venue-core-certify /usr/local/bin/qdl-venue-core-certify
+COPY --from=builder /src/target/release/qdl-projector /usr/local/bin/qdl-projector
+COPY --from=builder /src/target/release/qdl-stream-gateway /usr/local/bin/qdl-stream-gateway
+COPY config/v2/provider-admission-policy-v1.json /opt/qdl/config/v2/provider-admission-policy-v1.json
USER 10001:10001
ENTRYPOINT ["/usr/local/bin/qdl-kafka-smoke"]
diff --git a/README.md b/README.md
index 001c588b..6314bbd1 100644
--- a/README.md
+++ b/README.md
@@ -17,14 +17,60 @@ It currently serves:
- Redis Pub/Sub streams for live consumers.
- REST endpoints for warmup, recovery, diagnostics, and health checks.
+## KN Production Status (2026-09-27)
+
+The **new Kafka-native read path is serving Trading System**, with SDK2.0.5.
+Production final load passed: 50 logical alpha sessions, 15,504 requests,
+90 streams, 12 reconnects, actual TS60 READY in32/32 samples; no order actions.
+Ten old SQLite projector/query/stream roles are stopped, with state and exact
+rollback artifacts retained. The v2.2.0 runtime certificate is below; publication
+is established by green remote CI, the main-line tag and GitHub release, not
+by a healthy container alone. SDK cursor persistence is bounded and off-loop,
+with durable acknowledgement after successful fsync.
+
+```text
+Binance/OKX -> Rust ingestors + bounded BAR REST edge -> raw Kafka
+ -> Rust canonical core (identity, ordering, L2, quality) -> canonical Kafka
+ -> Rust projector Stage A -> compacted latest/bar Kafka state
+ -> Rust projector Stage B -> bounded Redis market cache -> Python V2 Query
+canonical Kafka -> native Rust Stream (snapshot / replay / subscribe / status)
+V2 Query + native Stream -> SDK -> TS market-cache / alpha bounded buffer
+```
+
+SQLite is not in this active read path. Cache loss rebuilds from Kafka state;
+consumer manifests, component freshness and execution eligibility remain strict.
+DNSE/VN stays V1; the quarantined vnstock/vnai SDK is excluded from new KN images.
+
+Actual consumer-call-to-validated-result latency, **milliseconds**, steady load:
+
+| Read | Binance p50 / p95 / p99 | OKX p50 / p95 / p99 |
+|---|---:|---:|
+| QUOTE (2,750 samples/venue) | 9.72 / 24.38 / 46.53 | 9.91 / 21.59 / 33.30 |
+| MARK/INDEX (4,125/venue) | 11.07 / 23.26 / 39.69 | 11.18 / 22.52 / 38.11 |
+| TRADE (55/venue; p99 unavailable) | 9.79 / 23.78 / - | 13.23 / 29.51 / - |
+| L2 snapshot (54/55; p99 unavailable) | 25.76 / 44.75 / - | 28.92 / 44.53 / - |
+| Final BAR latest (55/venue; p99 unavailable) | 15.31 / 29.55 / - | 18.58 / 36.15 / - |
+
+Cold history under this load: 2,500 rows3,189-5,144ms; 5,000 rows4,838-6,956ms
+(four reads, not a percentile). Full serving stack averaged4.669vCPU over the matched374.415-second load window,
+including brokers/provider Redis. A wider446-second window measured4.582vCPU;
+old rollback overhead1.337 and TS0.427 were measured separately.
+This does not certify arbitrary50 consumers, infinite history or multi-host HA.
+Retained-window diagnostic:702 scanned,6 disabled,4 VN unavailable; not full
+listing-history completeness. Provider-discontinuous Binance3d windows remain
+explicitly unavailable to strict full-history reads, never interpolated.
+
+See [current journal](./DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md#kn5-production-handoff-20260927)
+and [cutover/rollback runbook](./docs/runbooks/kn5-paired-cutover.md).
+
## Quick Links
- [Integration guide](./DATA_LAYER_SERVICE_ACCESS_GUIDE.md)
- [Fund-grade implementation tracker](./DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md)
- [Fund-grade architecture and migration guide](./upgrade/quant-data-layer-fund-grade-upgrade-architecture.md)
- [OKX V5 market-data implementation guide](./upgrade/OKX_MARKET_DATA_V5_GUIDE_QUANT_DATA_LAYER.md)
-- [V2.1.0 release notes](./upgrade/evidence/releases/v2.1.0/RELEASE_NOTES.md)
-- [V2.1.0 machine-readable certificate](./upgrade/evidence/releases/v2.1.0/certificate.json)
+- [V2.2.0 release notes](./upgrade/evidence/releases/v2.2.0/RELEASE_NOTES.md)
+- [V2.2.0 runtime certificate](./upgrade/evidence/releases/v2.2.0/certificate.json)
- [Contributing guide](./CONTRIBUTING.md)
- [Security policy](./SECURITY.md)
- [Code of conduct](./CODE_OF_CONDUCT.md)
@@ -65,11 +111,11 @@ Open pull requests into `dev`; merge `dev` into `main` only through a release pu
- **V2 stable data plane** — manifest-authorized, mTLS/JWT V2 query and signed-cursor stream for Binance USD-M and OKX Swap
- **Rust canonical core** — provider-neutral identity, decimal/unit normalization, event idempotency, sequencing, gap/resync and L2 book state
-- **Durable projection** — Kafka-compatible raw/canonical event planes with bounded SQLite/Redis projection, replay and typed freshness/quality state
+- **Durable projection** — Kafka raw/canonical and compacted state topics, native Rust projector, bounded rebuildable Redis market cache, replay and typed freshness/quality state
- **Execution-grade context** — final BAR, TRADE, QUOTE, top-100 BOOK_SNAPSHOT/BOOK_DELTA and strict MARK_INDEX_PRICE for declared consumer demand
- **Reference data** — bounded provider wrappers for funding, OI, long/short, taker flow, mark/index, contract metadata and native/continuous basis
- **Real-time streaming** — WebSocket multiplexer for Binance (spot & futures trade + kline) and DNSE (VN stock live quotes)
-- **Automatic failover** — DNSE as primary VN source, vnstock REST poller as secondary fallback
+- **VN compatibility** — unchanged V1 deployment only; the new KN image excludes quarantined vnstock/vnai and does not certify that fallback
- **Redis Pub/Sub distribution** — single upstream connection shared across many downstream consumers
- **Historical warmup (VN)** — Parquet-backed preload service for 1-minute OHLCV candle warmup
- **Binance derivatives REST wrappers** — OHLCV, funding, open interest, long/short ratios, taker ratio, depth, and basis bundle endpoints
@@ -78,7 +124,7 @@ Open pull requests into `dev`; merge `dev` into `main` only through a release pu
- **Alpha strategy example** — moving-average crossover strategy included as a reference implementation
- 🐳 **Docker-first** — full Docker Compose stack with networking, volumes, and log management
-## V2 Stable Architecture
+## Historical V2.1.0 Architecture (Retained Rollback)
```text
Binance USD-M WS/REST OKX Swap WS/REST
diff --git a/app/database/preload.py b/app/database/preload.py
index 4f02c796..44cb216a 100644
--- a/app/database/preload.py
+++ b/app/database/preload.py
@@ -366,7 +366,15 @@ def fetch_ohlcv_chunked(
- Retries each chunk with exponential backoff
- Mandatory delay between chunks to respect rate limits
"""
- from vnstock import Quote
+ try:
+ from vnstock import Quote
+ except ModuleNotFoundError as error:
+ if error.name != "vnstock":
+ raise
+ raise RuntimeError(
+ "VNSTOCK_UNAVAILABLE: VN-stock SDK is excluded from KN images; "
+ "use the retained V1 VN service"
+ ) from error
chunk_days = chunk_days or PRELOAD_CHUNK_DAYS
delay = delay or PRELOAD_DELAY
diff --git a/app/stream/vnstock_poller.py b/app/stream/vnstock_poller.py
index 3fe220fe..9d87b3bd 100644
--- a/app/stream/vnstock_poller.py
+++ b/app/stream/vnstock_poller.py
@@ -41,12 +41,19 @@ def __init__(
def start(self, poll_interval: float = None):
"""Start the background polling loop as a daemon thread."""
+ try:
+ from vnstock import Trading
+ except ModuleNotFoundError as error:
+ if error.name != "vnstock":
+ raise
+ raise RuntimeError(
+ "VNSTOCK_UNAVAILABLE: VN-stock SDK is excluded from KN images; "
+ "use the retained V1 VN service"
+ ) from error
interval = poll_interval or VNSTOCK_POLL_INTERVAL
self._running = True
def _poll():
- # Lazy import to avoid import errors if vnstock not in container
- from vnstock import Trading
if VNSTOCK_API_KEY:
try:
from vnstock import register_user
diff --git a/config/examples/consumer-endpoint-benchmark.json b/config/examples/consumer-endpoint-benchmark.json
new file mode 100644
index 00000000..390063a6
--- /dev/null
+++ b/config/examples/consumer-endpoint-benchmark.json
@@ -0,0 +1,29 @@
+{
+ "image": "qdl-v2-python:2.1.0-1c0844f",
+ "network": "executor_network",
+ "queries": ["https://query_v2_1:8200", "https://query_v2_2:8200"],
+ "stream_targets": ["stream_v2_active:8210", "stream_v2_passive:8210"],
+ "consumers": [{
+ "id": "trading-system.paper.stable",
+ "tls": {
+ "ca_file": "/path/to/trading-system/ca.crt",
+ "cert_file": "/path/to/trading-system/client.crt",
+ "key_file": "/path/to/trading-system/client.key"
+ },
+ "jwt": {
+ "private_key_file": "/path/to/trading-system-jwt/private.key",
+ "key_id": "stable-trading-system-rs256-v1",
+ "issuer": "https://identity.qdl.stable.internal",
+ "audience": "qdl-v2-stable",
+ "roles": ["market_data_reader", "historical_reader", "stream_consumer"]
+ }
+ }],
+ "limits": {
+ "rounds": 3,
+ "requests_per_second": 1,
+ "batch_size": 8,
+ "timeout_seconds": 30,
+ "max_seconds": 1800,
+ "stream_seconds": 0
+ }
+}
diff --git a/config/v2/active-demand-source-registry.yaml b/config/v2/active-demand-source-registry.yaml
index a64e3043..4fddf6b4 100644
--- a/config/v2/active-demand-source-registry.yaml
+++ b/config/v2/active-demand-source-registry.yaml
@@ -1,5 +1,5 @@
schema: qdl.v2.active-demand-source-registry.v1
-revision: 3
+revision: 4
owner_registry:
root: trading_system
path: config/_config/portfolio_account_config_setup.yaml
@@ -119,6 +119,14 @@ admission:
market: SWAP
feed: OPEN_INTEREST
max_slices: 128
+ - venue: OKX
+ market: SWAP
+ feed: LONG_SHORT_RATIO
+ max_slices: 128
+ - venue: OKX
+ market: SWAP
+ feed: TAKER_FLOW
+ max_slices: 128
- venue: OKX
market: SWAP
feed: MARK_PRICE
diff --git a/config/v2/captures/binance-usdm-exchangeinfo.filtered.json b/config/v2/captures/binance-usdm-exchangeinfo.filtered.json
index 3907de20..f56b3f4e 100644
--- a/config/v2/captures/binance-usdm-exchangeinfo.filtered.json
+++ b/config/v2/captures/binance-usdm-exchangeinfo.filtered.json
@@ -1 +1 @@
-{"serverTime":1787909815463,"symbols":[{"baseAsset":"BTC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"4529764","minPrice":"556.80","tickSize":"0.10"},{"filterType":"LOT_SIZE","maxQty":"1000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"120","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"50"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1567965300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BTCUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BTCUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["PoW"],"underlyingType":"COIN"},{"baseAsset":"ETH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"306177","minPrice":"39.86","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"10000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"20"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1574840700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ETHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ETHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1"],"underlyingType":"COIN"},{"baseAsset":"BNB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"6.600","tickSize":"0.010"},{"filterType":"LOT_SIZE","maxQty":"100000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1581321600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BNBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BNBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1"],"underlyingType":"COIN"},{"baseAsset":"DOGE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"30","minPrice":"0.002440","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"300000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1594371600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DOGEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DOGEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Meme"],"underlyingType":"COIN"},{"baseAsset":"SOL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"6857","minPrice":"0.4200","tickSize":"0.0100"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"80000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1600066800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SOLUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SOLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1"],"underlyingType":"COIN"}]}
+{"serverTime":1787909815463,"symbols":[{"baseAsset":"BTC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"4529764","minPrice":"556.80","tickSize":"0.10"},{"filterType":"LOT_SIZE","maxQty":"1000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"120","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"50"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1567965300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BTCUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BTCUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["PoW"],"underlyingType":"COIN"},{"baseAsset":"ETH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"306177","minPrice":"39.86","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"10000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"20"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1574840700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ETHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ETHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1"],"underlyingType":"COIN"},{"baseAsset":"BNB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"6.600","tickSize":"0.010"},{"filterType":"LOT_SIZE","maxQty":"100000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1581321600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BNBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BNBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1"],"underlyingType":"COIN"},{"baseAsset":"DOGE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"30","minPrice":"0.002440","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"300000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1594371600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DOGEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DOGEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Meme"],"underlyingType":"COIN"},{"baseAsset":"SOL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"6857","minPrice":"0.4200","tickSize":"0.0100"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"80000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1600066800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SOLUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SOLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1"],"underlyingType":"COIN"},{"baseAsset":"0G","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1758123900000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"0GUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"0GUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"1000BONK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"400000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1700661600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"1000BONKUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"1000BONKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"1000FLOKI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1683331200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"1000FLOKIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"1000FLOKIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"1000PEPE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000001","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"800000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1683244800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"1000PEPEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"1000PEPEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"1000SATS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1","minPrice":"0.00000001","tickSize":"0.00000001"},{"filterType":"LOT_SIZE","maxQty":"60000000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1702389600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"1000SATSUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":8,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"1000SATSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"1000SHIB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000157","tickSize":"0.000001"},{"filterType":"LOT_SIZE","maxQty":"800000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1620630000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"1000SHIBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"1000SHIBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"1INCH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1608879600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"1INCHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"1INCHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"2Z","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8000","multiplierUp":"1.2000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.20","maxMoveOrderLimit":10000,"onboardDate":1759408200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"2ZUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"2ZUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.2000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AAVE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"38702","minPrice":"0.010","tickSize":"0.010"},{"filterType":"LOT_SIZE","maxQty":"78000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"9000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1602831600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AAVEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AAVEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ACT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1731327300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ACTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ACTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ACU","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1768999500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ACUUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ACUUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ADA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00010","tickSize":"0.00010"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1580457600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ADAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ADAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AERO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1733321700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AEROUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AEROUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AEVO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1710336600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AEVOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AEVOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AGLD","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1690597800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AGLDUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AGLDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AIXBT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1734719400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AIXBTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AIXBTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ALGO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1592298000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ALGOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ALGOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ALLO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1762869600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ALLOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ALLOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ANIME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"300000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1737651600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ANIMEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ANIMEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"APE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.0010","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1647500400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"APEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"APEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"API3","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"10000","minPrice":"0.0010","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1645426800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"API3USDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"API3USDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"APR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1761215400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"APRUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"APRUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"APT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00100","tickSize":"0.00010"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1666076400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"APTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"APTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ARB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1679554800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ARBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ARBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ARKM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1690512300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ARKMUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ARKMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.010","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"500000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1632812400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ARUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ARUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Storage","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ARX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1782189900000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ARXUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ARXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"ASTER","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1758283200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ASTERUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ASTERUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ATH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"200000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1743608700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ATHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ATHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ATOM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1581077400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ATOMUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ATOMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1761737400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ATUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ATUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AUCTION","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.010000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"200000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1702645200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AUCTIONUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AUCTIONUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"A","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1748419200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AVAX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2403","minPrice":"0.0010","tickSize":"0.0010"},{"filterType":"LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1600844400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AVAXUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AVAXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AVNT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1757430000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AVNTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AVNTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AXS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.00010","tickSize":"0.00010"},{"filterType":"LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"110000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1605855600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AXSUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AXSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Metaverse","Crypto"],"underlyingType":"COIN"},{"baseAsset":"AZTEC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1770784200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"AZTECUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"AZTECUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BABY","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1743859800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BABYUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BABYUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BAND","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"783","minPrice":"0.0001","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1596006000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BANDUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BANDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BARD","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1758193200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BARDUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BARDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BASED","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1774864800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BASEDUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BASEDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BAT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1581581100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BATUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BATUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BCH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"4","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"20000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"20"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1576745700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BCHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BCHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Payment","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BEAT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1762949700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BEATUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BEATUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BERA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1738854000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BERAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BERAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BICO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"25000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1695904200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BICOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BICOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BIGTIME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"90000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"11000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1697121000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BIGTIMEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BIGTIMEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BILL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1778141700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BILLUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BILLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BIO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1735906500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BIOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BIOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"BLUR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1682553600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BLURUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BLURUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BOME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000001","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"700000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"130000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1710592200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BOMEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BOMEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BRETT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"140000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"14000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1724150100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BRETTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BRETTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BREV","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1767091500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BREVUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BREVUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"BSB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1774439100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"BSBUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"BSBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CAP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1782560700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CAPUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CAPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"CC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1761912000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CCUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CCUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CELO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1632639600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CELOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CELOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CFX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1676790000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CFXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CFXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CHIP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1776323700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CHIPUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CHIPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CHZ","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100","minPrice":"0.00001","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"60000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1611212400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CHZUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CHZUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"COAI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.7000","multiplierUp":"1.3000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.30","maxMoveOrderLimit":10000,"onboardDate":1758785400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"COAIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"COAIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.3000","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"COMP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.01","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"50000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1593507600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"COMPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"COMPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CRV","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1598943600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CRVUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CRVUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"CVX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"250000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"70000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1753270200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"CVXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"CVXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"DASH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.01","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"30000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1580803500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DASHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DASHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"DOOD","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"400000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1746797400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DOODUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DOODUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"DOS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1786460400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DOSUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DOSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"DOT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1598079600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DOTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DOTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"DYDX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1631170800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"DYDXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"DYDXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"EDEN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"14000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1759230000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"EDENUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"EDENUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"EDGE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1773928800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"EDGEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"EDGEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"EGLD","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"14295","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"250000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1600066800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"EGLDUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"EGLDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"EIGEN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0010000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1727762400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"EIGENUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"EIGENUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ENA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1712061000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ENAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ENAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ENJ","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"153","minPrice":"0.00001","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1601362800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ENJUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ENJUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ENSO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760432400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ENSOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ENSOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ENS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.010","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1638169200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ENSUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ENSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ESP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1770711000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ESPUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ESPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ETC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"400000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"40000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"20"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1579161600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ETCUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ETCUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ETHFI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0010000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1710775800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ETHFIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ETHFIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ETHW","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1701174600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ETHWUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ETHWUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"FARTCOIN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"15000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1500000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1734720300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"FARTCOINUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"FARTCOINUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"FIL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"6000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1602828000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"FILUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"FILUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Storage","Crypto"],"underlyingType":"COIN"},{"baseAsset":"FLOW","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1644390000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"FLOWUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"FLOWUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"FOGO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1768053600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"FOGOUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"FOGOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"F","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"200000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1750250700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"FUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"FUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GALA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"400000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1631862000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GALAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GALAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GAS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"60000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1698201900000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GASUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GASUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GIGGLE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.01000","tickSize":"0.01000"},{"filterType":"LOT_SIZE","maxQty":"50000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760003100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GIGGLEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GIGGLEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GLM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1708596000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GLMUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GLMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GMT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"60000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1647241200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GMTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GMTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GMX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.010000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"100000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"10000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1676530800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GMXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GMXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GPS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"80000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"11000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1739811600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GPSUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GPSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GRAM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1782979200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GRAMUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GRAMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"GRASS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1731079800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GRASSUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GRASSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GRT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100","minPrice":"0.00001","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1608274800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GRTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GRTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"GRVT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1785501900000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"GRVTUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"GRVTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"HBAR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00279","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1615964400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"HBARUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"HBARUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"HMSTR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"4000000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1727353800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"HMSTRUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"HMSTRUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"HOME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"100000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1749555000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"HOMEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"HOMEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"HUMA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1748264400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"HUMAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"HUMAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Payment","Crypto"],"underlyingType":"COIN"},{"baseAsset":"H","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8000","multiplierUp":"1.2000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.20","maxMoveOrderLimit":10000,"onboardDate":1750843800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"HUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"HUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.2000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"HYPE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00100","tickSize":"0.00100"},{"filterType":"LOT_SIZE","maxQty":"200000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1748601000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"HYPEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"HYPEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ICP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1627628400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ICPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ICPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"IMX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.0010","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1644476400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"IMXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"IMXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"INIT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"11000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1100000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1744785000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"INITUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"INITUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"INJ","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"500000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"40000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1660633200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"INJUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"INJUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"IOST","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1","minPrice":"0.00000010","tickSize":"0.00000010"},{"filterType":"LOT_SIZE","maxQty":"900000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1582272300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"IOSTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":8,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"IOSTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"IOTA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1581494400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"IOTAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"IOTAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"IRYS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1764172800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"IRYSUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"IRYSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"JELLYJELLY","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"15000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1743004800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"JELLYJELLYUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"JELLYJELLYUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"JTO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1702029600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"JTOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"JTOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"JUP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1706725800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"JUPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"JUPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"KAITO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1740056400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"KAITOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"KAITOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"KAT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"120000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"12000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1772427600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"KATUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"KATUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"KGEN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1759847400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"KGENUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"KGENUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"KITE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1761733800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"KITEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"KITEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"KMNO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1734721200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"KMNOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"KMNOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"KSM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"28450","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"100000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1602658800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"KSMUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"KSMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LAB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"13000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1100000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760711400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LABUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LABUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"11000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1100000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1749114000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LAYER","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1739288700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LAYERUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LAYERUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LDO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1663743600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LDOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LDOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LINEA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"300000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1756715400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LINEAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LINEAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LINK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"700000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"20"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1579248000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LINKUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":3,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LINKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LIT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"70000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1766511000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LITUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LITUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LPT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.010","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"500000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1636527600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LPTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LPTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LQTY","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1678258800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LQTYUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LQTYUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"LTC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.01","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"170000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"20"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1578557100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"LTCUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"LTCUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Payment","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MAGIC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"8000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1500000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1674457200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MAGICUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MAGICUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Metaverse","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MANA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1615705200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MANAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MANAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Metaverse","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MASK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.0040","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1626418800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MASKUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MASKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MEGA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1769775300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MEGAUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MEGAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MEME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000001","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"1100000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"110000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1699012800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MEMEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MEMEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MERL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8000","multiplierUp":"1.2000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.20","maxMoveOrderLimit":10000,"onboardDate":1748507400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MERLUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MERLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.2000","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"METIS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.0010","tickSize":"0.0010"},{"filterType":"LOT_SIZE","maxQty":"300000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1710232200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"METISUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"METISUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MET","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760185800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"METUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"METUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1733850000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["NFT","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MEW","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000001","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"2000000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1718632800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MEWUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MEWUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MINA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1675407600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MINAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MINAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MMT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1762257600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MMTUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MMTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MON","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760080500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MONUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MONUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MOODENG","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1729850400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MOODENGUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MOODENGUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MORPHO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1732717800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MORPHOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MORPHOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MOVE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1733752800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MOVEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MOVEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"MUBARAK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1742219100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"MUBARAKUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"MUBARAKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"NEAR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1000","minPrice":"0.0480","tickSize":"0.0010"},{"filterType":"LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1602748800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"NEARUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"NEARUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"NEIRO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1","minPrice":"0.00000001","tickSize":"0.00000001"},{"filterType":"LOT_SIZE","maxQty":"9000000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1726486200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"NEIROUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":8,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"NEIROUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"NEO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"300000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1581929100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"NEOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"NEOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"NIGHT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1765364400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"NIGHTUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"NIGHTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"NMR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.010000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"100000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"10000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1687435200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"NMRUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"NMRUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"NOT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000001","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"2000000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1715868000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"NOTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"NOTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ONDO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1705755600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ONDOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ONDOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ONE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000001","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"800000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"80000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1615964400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ONEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ONEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ONT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"14000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1581408300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ONTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ONTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ON","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1761294600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ONUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ONUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"OPG","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1776871800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"OPGUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"OPGUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"OPN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1771686000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"OPNUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"OPNUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"OP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1654066800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"OPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"OPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ORDER","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1758890700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ORDERUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ORDERUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ORDI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1699360200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ORDIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ORDIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"O","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1782301500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"OUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"OUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"PENDLE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"600000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1690511400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PENDLEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PENDLEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PENGU","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"200000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1734452100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PENGUUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PENGUUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PEOPLE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"100000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1640242800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PEOPLEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PEOPLEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PIEVERSE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"400000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1763119800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PIEVERSEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PIEVERSEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PIPPIN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.7000","multiplierUp":"1.3000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.30","maxMoveOrderLimit":10000,"onboardDate":1737713700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PIPPINUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PIPPINUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.3000","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PLUME","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"60000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1742562000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PLUMEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PLUMEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PNUT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"13000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1731328200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PNUTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PNUTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"POL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"15000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1726229700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"POLUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"POLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"POPCAT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"13000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1724331600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"POPCATUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"POPCATUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PROVE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1754413200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PROVEUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PROVEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PUMP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"900000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"90000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1752132600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PUMPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PUMPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"PYTH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1700663400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"PYTHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"PYTHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"QNT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.010000","tickSize":"0.010000"},{"filterType":"LOT_SIZE","maxQty":"10000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1666076400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"QNTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"QNTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"QTUM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"800000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"80000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1582185900000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"QTUMUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"QTUMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RAVE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1765726200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RAVEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RAVEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RECALL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760531400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RECALLUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RECALLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RENDER","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0010000","tickSize":"0.0010000"},{"filterType":"LOT_SIZE","maxQty":"1000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1721988000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RENDERUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RENDERUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RESOLV","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1749562200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RESOLVUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RESOLVUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1781791200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"REUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"REUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RIVER","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"600000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760712300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RIVERUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RIVERUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ROBO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"25000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1772181900000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ROBOUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ROBOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RSR","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"10","minPrice":"0.000001","tickSize":"0.000001"},{"filterType":"LOT_SIZE","maxQty":"500000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1603091100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RSRUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RSRUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"RVN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"200000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1614063600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"RVNUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"RVNUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SAHARA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"70000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1750939200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SAHARAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SAHARAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SAND","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00001","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1610953200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SANDUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SANDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Metaverse","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SAPIEN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1755711000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SAPIENUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SAPIENUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SEI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1692239400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SEIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SEIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SENT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"60000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8000","multiplierUp":"1.2000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.20","maxMoveOrderLimit":10000,"onboardDate":1763124300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SENTUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SENTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.2000","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SIGN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"80000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1745838000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SIGNUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SIGNUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SKY","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1757401200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SKYUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SKYUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SLX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1780299000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SLXUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SLXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"SNX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1597388400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SNXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SNXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SOON","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1747989000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SOONUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SOONUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SOPH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"70000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"11000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1748437200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SOPHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SOPHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SPACE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"12000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1769168700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SPACEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SPACEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SPK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1750150800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SPKUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SPKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SPX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1733834700000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SPXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SPXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SSV","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.010000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"300000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1677135600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SSVUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SSVUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"STABLE","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1762430400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"STABLEUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"STABLEUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"STRK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"40000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1708448400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"STRKUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"STRKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"STX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1676876400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"STXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"STXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SUI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1683072000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SUIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SUIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"S","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1737021600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SUSHI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1301","minPrice":"0.0001","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1599202800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SUSHIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SUSHIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"SYRUP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"1500000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"500000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1746606600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"SYRUPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"SYRUPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TAO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.01","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"20000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1712845800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TAOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TAOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"THETA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1000","minPrice":"0.0001","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1590566400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"THETAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"THETAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TIA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1698769800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TIAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TIAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TRB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"5138","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"60000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"4000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1599116400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TRBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TRBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TRIA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"70000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1770380100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TRIAUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TRIAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TRUMP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"3000000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1737205200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TRUMPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TRUMPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TRUST","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"9000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"900000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.7500","multiplierUp":"1.2500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.25","maxMoveOrderLimit":10000,"onboardDate":1762335000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TRUSTUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TRUSTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.25","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TRUTH","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"60000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1759320000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TRUTHUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TRUTHUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TRX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00132","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1579075500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TRXUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TRXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"TURBO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000001"},{"filterType":"LOT_SIZE","maxQty":"700000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"70000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1717083000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"TURBOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"TURBOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"UB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1757673000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"UBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"UBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"UMA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1683590400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"UMAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"UMAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"UNI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2684","minPrice":"0.0010","tickSize":"0.0010"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"100000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1600412400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"UNIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"UNIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"USELESS","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1755260100000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"USELESSUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"USELESSUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"VANA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"700000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"70000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1734355800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"VANAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"VANAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"VIRTUAL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1733833800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"VIRTUALUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"VIRTUALUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"VVV","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"2000","minPrice":"0.001000","tickSize":"0.001000"},{"filterType":"LOT_SIZE","maxQty":"50000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MARKET_LOT_SIZE","maxQty":"20000","minQty":"0.01","stepSize":"0.01"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1738138500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"VVVUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":2,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"VVVUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WAL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1743089400000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WALUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WALUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Storage","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WCT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.025000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1744714800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WCTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WCTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WET","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1765350000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WETUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WETUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Alpha","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WIF","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"6000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"600000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1705587300000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WIFUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WIFUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Meme","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WLD","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0001000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1690200000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WLDUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WLDUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["AI","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WLFI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"80000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1755937800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WLFIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WLFIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"WOO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"10000","minPrice":"0.00010","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"5000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1649314800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WOOUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WOOUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"W","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"70000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"7000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1712158200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"WUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"WUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"XLM","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"20000","minPrice":"0.00648","tickSize":"0.00001"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1579507200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"XLMUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":5,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"XLMUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"XPL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1755855000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"XPLUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"XPLUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"XRP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"0.0143","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9500","multiplierUp":"1.0500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.012500","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.05","maxMoveOrderLimit":10000,"onboardDate":1578298800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"XRPUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"XRPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.0500","underlyingSubType":["Payment","Crypto"],"underlyingType":"COIN"},{"baseAsset":"XTZ","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000100","tickSize":"0.000100"},{"filterType":"LOT_SIZE","maxQty":"4000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"400000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1580976000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"XTZUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"XTZUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"YB","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760107500000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"YBUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"YBUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"YFI","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200000","minPrice":"1","tickSize":"1"},{"filterType":"LOT_SIZE","maxQty":"250","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1598857200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"YFIUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":1,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"YFIUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"YGG","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"3000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1691206200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"YGGUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"YGGUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Gaming","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZAMA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"10000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1767949200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZAMAUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZAMAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZBT","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"800000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1760700600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZBTUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZBTUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZEC","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"100000","minPrice":"2.85","tickSize":"0.01"},{"filterType":"LOT_SIZE","maxQty":"15000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000","minQty":"0.001","stepSize":"0.001"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1580889600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZECUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":2,"quantityPrecision":3,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZECUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZEN","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"10000","minPrice":"0.001","tickSize":"0.001"},{"filterType":"LOT_SIZE","maxQty":"300000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1606201200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZENUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":3,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZENUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZETA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.000010","tickSize":"0.000010"},{"filterType":"LOT_SIZE","maxQty":"20000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"2000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1706862600000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZETAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":6,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZETAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-1","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZIL","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"300000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"30000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1592470800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZILUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZILUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["PoW","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZKP","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000100","tickSize":"0.0000100"},{"filterType":"LOT_SIZE","maxQty":"6000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"1300000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8000","multiplierUp":"1.2000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.20","maxMoveOrderLimit":10000,"onboardDate":1766311200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZKPUSDT","permissionSets":["GRID","COPY","RPI","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZKPUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.2000","underlyingSubType":["Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZK","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"80000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"8000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1718622000000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZKUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZKUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZORA","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0000010","tickSize":"0.0000010"},{"filterType":"LOT_SIZE","maxQty":"50000000","minQty":"1","stepSize":"1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"11000000","minQty":"1","stepSize":"1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.020000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1753441200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZORAUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":0,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZORAUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Layer-2","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZRO","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"200","minPrice":"0.0010000","tickSize":"0.0001000"},{"filterType":"LOT_SIZE","maxQty":"2000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"200000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.8500","multiplierUp":"1.1500"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.15","maxMoveOrderLimit":10000,"onboardDate":1718893800000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZROUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":7,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZROUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1500","underlyingSubType":["Infrastructure","Crypto"],"underlyingType":"COIN"},{"baseAsset":"ZRX","baseAssetPrecision":8,"contractType":"PERPETUAL","deliveryDate":4133404800000,"filters":[{"filterType":"PRICE_FILTER","maxPrice":"1000","minPrice":"0.0001","tickSize":"0.0001"},{"filterType":"LOT_SIZE","maxQty":"7000000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MARKET_LOT_SIZE","maxQty":"700000","minQty":"0.1","stepSize":"0.1"},{"filterType":"MAX_NUM_ORDERS","limit":200},{"filterType":"MIN_NOTIONAL","notional":"5"},{"filterType":"PERCENT_PRICE","multiplierDecimal":"4","multiplierDown":"0.9000","multiplierUp":"1.1000"},{"filterType":"POSITION_RISK_CONTROL","positionControlSide":"NONE"}],"liquidationFee":"0.015000","maintMarginPercent":"2.5000","marginAsset":"USDT","marketTakeBound":"0.10","maxMoveOrderLimit":10000,"onboardDate":1592989200000,"orderTypes":["LIMIT","MARKET","STOP","STOP_MARKET","TAKE_PROFIT","TAKE_PROFIT_MARKET","TRAILING_STOP_MARKET"],"pair":"ZRXUSDT","permissionSets":["GRID","COPY","DCA","PSB"],"pricePrecision":4,"quantityPrecision":1,"quoteAsset":"USDT","quotePrecision":8,"requiredMarginPercent":"5.0000","status":"TRADING","symbol":"ZRXUSDT","timeInForce":["GTC","IOC","FOK","GTX","GTD"],"triggerProtect":"0.1000","underlyingSubType":["DeFi","Crypto"],"underlyingType":"COIN"}]}
diff --git a/config/v2/captures/okx-instruments-swap.filtered.json b/config/v2/captures/okx-instruments-swap.filtered.json
index c1945b5a..7d41408d 100644
--- a/config/v2/captures/okx-instruments-swap.filtered.json
+++ b/config/v2/captures/okx-instruments-swap.filtered.json
@@ -1 +1 @@
-{"code":"0","data":[{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"BTC","expTime":"","floatPxLmtPct":"0.005","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"BTC-USDT","instId":"BTC-USDT-SWAP","instIdCode":10459,"instType":"SWAP","lever":"100","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"35000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.01","maxStopSz":"35000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.1","tradeQuoteCcyList":[],"uly":"BTC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"ETH","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"ETH-USDT","instId":"ETH-USDT-SWAP","instIdCode":10461,"instType":"SWAP","lever":"100","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"90000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"90000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"ETH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"SOL","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"SOL-USDT","instId":"SOL-USDT-SWAP","instIdCode":10530,"instType":"SWAP","lever":"100","listTime":"1611298800000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"39000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"39000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"SOL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"DOGE","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"DOGE-USDT","instId":"DOGE-USDT-SWAP","instIdCode":10502,"instType":"SWAP","lever":"50","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"24000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"24000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"DOGE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"BNB","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BNB-USDT","instId":"BNB-USDT-SWAP","instIdCode":111061,"instType":"SWAP","lever":"50","listTime":"1671778428049","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"130000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"130000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.1","tradeQuoteCcyList":[],"uly":"BNB-USDT","upcChg":[]}],"msg":""}
+{"code":"0","data":[{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"BTC","expTime":"","floatPxLmtPct":"0.005","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"BTC-USDT","instId":"BTC-USDT-SWAP","instIdCode":10459,"instType":"SWAP","lever":"100","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"35000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.01","maxStopSz":"35000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.1","tradeQuoteCcyList":[],"uly":"BTC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"ETH","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"ETH-USDT","instId":"ETH-USDT-SWAP","instIdCode":10461,"instType":"SWAP","lever":"100","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"90000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"90000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"ETH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"SOL","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"SOL-USDT","instId":"SOL-USDT-SWAP","instIdCode":10530,"instType":"SWAP","lever":"100","listTime":"1611298800000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"39000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"39000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"SOL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"DOGE","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"DOGE-USDT","instId":"DOGE-USDT-SWAP","instIdCode":10502,"instType":"SWAP","lever":"50","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"24000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"24000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"DOGE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"BNB","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BNB-USDT","instId":"BNB-USDT-SWAP","instIdCode":111061,"instType":"SWAP","lever":"50","listTime":"1671778428049","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"130000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"130000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.1","tradeQuoteCcyList":[],"uly":"BNB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"0G","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"0G-USDT","instId":"0G-USDT-SWAP","instIdCode":228366,"instType":"SWAP","lever":"20","listTime":"1758537000238","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"64000","maxPlatOICoinLmt":"","maxPlatOILmt":"4300000","maxPxLmtPct":"0.3","maxStopSz":"64000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"0G-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"1INCH","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"1INCH-USDT","instId":"1INCH-USDT-SWAP","instIdCode":10484,"instType":"SWAP","lever":"20","listTime":"1608863400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"87000","maxPlatOICoinLmt":"","maxPlatOILmt":"2300000","maxPxLmtPct":"0.3","maxStopSz":"87000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"1INCH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"2Z","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"2Z-USDT","instId":"2Z-USDT-SWAP","instIdCode":229769,"instType":"SWAP","lever":"20","listTime":"1759410600649","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7500","maxPlatOICoinLmt":"","maxPlatOILmt":"3800000","maxPxLmtPct":"0.3","maxStopSz":"7500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"2Z-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"A","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"A-USDT","instId":"A-USDT-SWAP","instIdCode":212240,"instType":"SWAP","lever":"10","listTime":"1748514600412","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"3200","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"3200","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"A-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"AAVE","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AAVE-USDT","instId":"AAVE-USDT-SWAP","instIdCode":10485,"instType":"SWAP","lever":"50","listTime":"1607580000000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"19000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"19000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"AAVE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ACT","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ACT-USDT","instId":"ACT-USDT-SWAP","instIdCode":184433,"instType":"SWAP","lever":"10","listTime":"1731582000644","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"710000","maxPlatOICoinLmt":"","maxPlatOILmt":"3300000","maxPxLmtPct":"0.3","maxStopSz":"710000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ACT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ACU","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ACU-USDT","instId":"ACU-USDT-SWAP","instIdCode":245693,"instType":"SWAP","lever":"10","listTime":"1769151600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5800","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"5800","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ACU-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"ADA","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ADA-USDT","instId":"ADA-USDT-SWAP","instIdCode":10483,"instType":"SWAP","lever":"50","listTime":"1582888608000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"12000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"12000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ADA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"AERO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AERO-USDT","instId":"AERO-USDT-SWAP","instIdCode":216936,"instType":"SWAP","lever":"20","listTime":"1751523300260","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"3800","maxPlatOICoinLmt":"","maxPlatOILmt":"10700000","maxPxLmtPct":"0.3","maxStopSz":"3800","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"AERO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"AEVO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AEVO-USDT","instId":"AEVO-USDT-SWAP","instIdCode":151594,"instType":"SWAP","lever":"10","listTime":"1710325520298","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"120000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"120000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"AEVO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"AGLD","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.06","instCategory":"1","instFamily":"AGLD-USDT","instId":"AGLD-USDT-SWAP","instIdCode":41191,"instType":"SWAP","lever":"20","listTime":"1631008650016","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"45000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"45000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"AGLD-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"AIXBT","expTime":"","floatPxLmtPct":"0.04","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"AIXBT-USDT","instId":"AIXBT-USDT-SWAP","instIdCode":191456,"instType":"SWAP","lever":"20","listTime":"1735887600188","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"21000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"21000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"380000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"AIXBT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ALGO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ALGO-USDT","instId":"ALGO-USDT-SWAP","instIdCode":10487,"instType":"SWAP","lever":"50","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"23000","maxPlatOICoinLmt":"","maxPlatOILmt":"10000000","maxPxLmtPct":"0.3","maxStopSz":"23000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ALGO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ALLO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ALLO-USDT","instId":"ALLO-USDT-SWAP","instIdCode":235639,"instType":"SWAP","lever":"20","listTime":"1762879500659","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6700","maxPlatOICoinLmt":"","maxPlatOILmt":"11900000","maxPxLmtPct":"0.3","maxStopSz":"6700","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"620000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ALLO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ANIME","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ANIME-USDT","instId":"ANIME-USDT-SWAP","instIdCode":194315,"instType":"SWAP","lever":"20","listTime":"1737644401356","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"230000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"230000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"360000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ANIME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"APE","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"APE-USDT","instId":"APE-USDT-SWAP","instIdCode":80553,"instType":"SWAP","lever":"20","listTime":"1647522059555","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1200000","maxPlatOICoinLmt":"","maxPlatOILmt":"5300000","maxPxLmtPct":"0.3","maxStopSz":"1200000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"APE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"API3","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"API3-USDT","instId":"API3-USDT-SWAP","instIdCode":54789,"instType":"SWAP","lever":"10","listTime":"1646297716213","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"18000","maxPlatOICoinLmt":"","maxPlatOILmt":"2800000","maxPxLmtPct":"0.3","maxStopSz":"18000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"API3-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"APR","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"APR-USDT","instId":"APR-USDT-SWAP","instIdCode":233018,"instType":"SWAP","lever":"20","listTime":"1761285601180","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"12000","maxPlatOICoinLmt":"","maxPlatOILmt":"5200000","maxPxLmtPct":"0.3","maxStopSz":"12000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"530000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"APR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"APT","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"APT-USDT","instId":"APT-USDT-SWAP","instIdCode":104900,"instType":"SWAP","lever":"50","listTime":"1666142328522","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"91000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"91000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"APT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"AR","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AR-USDT","instId":"AR-USDT-SWAP","instIdCode":114960,"instType":"SWAP","lever":"20","listTime":"1676357700186","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"38000","maxPlatOICoinLmt":"","maxPlatOILmt":"9800000","maxPxLmtPct":"0.3","maxStopSz":"38000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"AR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ARB","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ARB-USDT","instId":"ARB-USDT-SWAP","instIdCode":117782,"instType":"SWAP","lever":"50","listTime":"1679580094937","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"69000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"69000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ARB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ARKM","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ARKM-USDT","instId":"ARKM-USDT-SWAP","instIdCode":185260,"instType":"SWAP","lever":"20","listTime":"1732177800122","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"50000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"50000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ARKM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ARX","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ARX-USDT","instId":"ARX-USDT-SWAP","instIdCode":326513,"instType":"SWAP","lever":"20","listTime":"1782131400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6900","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"6900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"380000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ARX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ASTER","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ASTER-USDT","instId":"ASTER-USDT-SWAP","instIdCode":228297,"instType":"SWAP","lever":"50","listTime":"1758517200313","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"200000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"200000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"1800000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ASTER-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"AT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AT-USDT","instId":"AT-USDT-SWAP","instIdCode":233932,"instType":"SWAP","lever":"20","listTime":"1761818401453","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1400","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"1400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"390000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"AT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"ATH","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ATH-USDT","instId":"ATH-USDT-SWAP","instIdCode":162196,"instType":"SWAP","lever":"20","listTime":"1718250900308","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"17000","maxPlatOICoinLmt":"","maxPlatOILmt":"3500000","maxPxLmtPct":"0.3","maxStopSz":"17000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ATH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ATOM","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ATOM-USDT","instId":"ATOM-USDT-SWAP","instIdCode":10490,"instType":"SWAP","lever":"50","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"23000","maxPlatOICoinLmt":"","maxPlatOILmt":"20500000","maxPxLmtPct":"0.3","maxStopSz":"23000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"ATOM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"AUCTION","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AUCTION-USDT","instId":"AUCTION-USDT-SWAP","instIdCode":139330,"instType":"SWAP","lever":"20","listTime":"1701417300613","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"37000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"37000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"AUCTION-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"AVAX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AVAX-USDT","instId":"AVAX-USDT-SWAP","instIdCode":10491,"instType":"SWAP","lever":"50","listTime":"1600840800000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"27000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"27000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"AVAX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"AVNT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"AVNT-USDT","instId":"AVNT-USDT-SWAP","instIdCode":228369,"instType":"SWAP","lever":"20","listTime":"1758555000222","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"120000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"120000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"AVNT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"AXS","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.06","instCategory":"1","instFamily":"AXS-USDT","instId":"AXS-USDT-SWAP","instIdCode":26858,"instType":"SWAP","lever":"20","listTime":"1627462800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"190000","maxPlatOICoinLmt":"","maxPlatOILmt":"6700000","maxPxLmtPct":"0.3","maxStopSz":"190000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"AXS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"AZTEC","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"AZTEC-USDT","instId":"AZTEC-USDT-SWAP","instIdCode":248704,"instType":"SWAP","lever":"20","listTime":"1770805800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2800","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"2800","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"390000","posLmtPct":"25","preMktSwTime":"1770885600000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"AZTEC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BABY","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BABY-USDT","instId":"BABY-USDT-SWAP","instIdCode":205558,"instType":"SWAP","lever":"10","listTime":"1744282800387","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"34000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"34000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"BABY-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"BAND","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BAND-USDT","instId":"BAND-USDT-SWAP","instIdCode":10493,"instType":"SWAP","lever":"10","listTime":"1599473571000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"29000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"29000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"BAND-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"BARD","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.1","instCategory":"1","instFamily":"BARD-USDT","instId":"BARD-USDT-SWAP","instIdCode":227786,"instType":"SWAP","lever":"20","listTime":"1758196800496","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"57000","maxPlatOICoinLmt":"","maxPlatOILmt":"3100000","maxPxLmtPct":"0.3","maxStopSz":"57000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"BARD-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BASED","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BASED-USDT","instId":"BASED-USDT-SWAP","instIdCode":255498,"instType":"SWAP","lever":"20","listTime":"1774866600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"25000","maxPlatOICoinLmt":"","maxPlatOILmt":"10100000","maxPxLmtPct":"0.3","maxStopSz":"25000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BASED-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BAT","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BAT-USDT","instId":"BAT-USDT-SWAP","instIdCode":10494,"instType":"SWAP","lever":"20","listTime":"1598609571000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"12000","maxPlatOICoinLmt":"","maxPlatOILmt":"2300000","maxPxLmtPct":"0.3","maxStopSz":"12000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BAT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"BCH","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BCH-USDT","instId":"BCH-USDT-SWAP","instIdCode":10465,"instType":"SWAP","lever":"50","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8500","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"8500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.1","tradeQuoteCcyList":[],"uly":"BCH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BEAT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BEAT-USDT","instId":"BEAT-USDT-SWAP","instIdCode":235770,"instType":"SWAP","lever":"10","listTime":"1762964100610","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7000","maxPlatOICoinLmt":"","maxPlatOILmt":"17100000","maxPxLmtPct":"0.3","maxStopSz":"7000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"770000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BEAT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"BERA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BERA-USDT","instId":"BERA-USDT-SWAP","instIdCode":196524,"instType":"SWAP","lever":"20","listTime":"1738850401850","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"710000","maxPlatOICoinLmt":"","maxPlatOILmt":"4100000","maxPxLmtPct":"0.3","maxStopSz":"710000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"BERA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"BICO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BICO-USDT","instId":"BICO-USDT-SWAP","instIdCode":48267,"instType":"SWAP","lever":"20","listTime":"1639032617371","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"380000","maxPlatOICoinLmt":"","maxPlatOILmt":"6500000","maxPxLmtPct":"0.3","maxStopSz":"380000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BICO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BIGTIME","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BIGTIME-USDT","instId":"BIGTIME-USDT-SWAP","instIdCode":134576,"instType":"SWAP","lever":"10","listTime":"1697115300862","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"75000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"75000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"BIGTIME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"BILL","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BILL-USDT","instId":"BILL-USDT-SWAP","instIdCode":269426,"instType":"SWAP","lever":"20","listTime":"1778054400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"9300","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"9300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"380000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BILL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"BIO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BIO-USDT","instId":"BIO-USDT-SWAP","instIdCode":191474,"instType":"SWAP","lever":"20","listTime":"1735901100474","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"440000","maxPlatOICoinLmt":"","maxPlatOILmt":"5600000","maxPxLmtPct":"0.3","maxStopSz":"440000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BIO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BLUR","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BLUR-USDT","instId":"BLUR-USDT-SWAP","instIdCode":115030,"instType":"SWAP","lever":"20","listTime":"1676429700181","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"150000","maxPlatOICoinLmt":"","maxPlatOILmt":"4000000","maxPxLmtPct":"0.3","maxStopSz":"150000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BLUR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"BOME","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BOME-USDT","instId":"BOME-USDT-SWAP","instIdCode":170930,"instType":"SWAP","lever":"20","listTime":"1723717202042","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"25000","maxPlatOICoinLmt":"","maxPlatOILmt":"10300000","maxPxLmtPct":"0.3","maxStopSz":"25000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"660000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"BOME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100000","ctValCcy":"BONK","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BONK-USDT","instId":"BONK-USDT-SWAP","instIdCode":143864,"instType":"SWAP","lever":"20","listTime":"1704695217299","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"130000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"130000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"360000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000000001","tradeQuoteCcyList":[],"uly":"BONK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"BRETT","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BRETT-USDT","instId":"BRETT-USDT-SWAP","instIdCode":173473,"instType":"SWAP","lever":"10","listTime":"1725617701730","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6600","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"6600","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"BRETT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"BREV","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"BREV-USDT","instId":"BREV-USDT-SWAP","instIdCode":242410,"instType":"SWAP","lever":"20","listTime":"1767099600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"96000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"96000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"390000","posLmtPct":"25","preMktSwTime":"1767709200000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BREV-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"BSB","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"BSB-USDT","instId":"BSB-USDT-SWAP","instIdCode":255941,"instType":"SWAP","lever":"10","listTime":"1775124000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"9500","maxPlatOICoinLmt":"","maxPlatOILmt":"5400000","maxPxLmtPct":"0.3","maxStopSz":"9500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"BSB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"CAP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CAP-USDT","instId":"CAP-USDT-SWAP","instIdCode":333127,"instType":"SWAP","lever":"10","listTime":"1782477000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7300","maxPlatOICoinLmt":"","maxPlatOILmt":"8100000","maxPxLmtPct":"0.3","maxStopSz":"7300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"CAP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"CC","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"CC-USDT","instId":"CC-USDT-SWAP","instIdCode":234190,"instType":"SWAP","lever":"20","listTime":"1761919200291","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8600","maxPlatOICoinLmt":"","maxPlatOILmt":"10600000","maxPxLmtPct":"0.3","maxStopSz":"8600","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"CC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"CELO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CELO-USDT","instId":"CELO-USDT-SWAP","instIdCode":42683,"instType":"SWAP","lever":"20","listTime":"1632477785202","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"110000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"110000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"CELO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1615542951000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"CFX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CFX-USDT","instId":"CFX-USDT-SWAP","instIdCode":16650,"instType":"SWAP","lever":"20","listTime":"1615539600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"58000","maxPlatOICoinLmt":"","maxPlatOILmt":"11200000","maxPxLmtPct":"0.3","maxStopSz":"58000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"CFX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"CHIP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CHIP-USDT","instId":"CHIP-USDT-SWAP","instIdCode":262744,"instType":"SWAP","lever":"20","listTime":"1776780000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4700","maxPlatOICoinLmt":"","maxPlatOILmt":"9400000","maxPxLmtPct":"0.3","maxStopSz":"4700","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"730000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"CHIP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1615542951000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"CHZ","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CHZ-USDT","instId":"CHZ-USDT-SWAP","instIdCode":16651,"instType":"SWAP","lever":"50","listTime":"1615539600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"220000","maxPlatOICoinLmt":"","maxPlatOILmt":"6000000","maxPxLmtPct":"0.3","maxStopSz":"220000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"CHZ-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"COAI","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"COAI-USDT","instId":"COAI-USDT-SWAP","instIdCode":231795,"instType":"SWAP","lever":"10","listTime":"1760538601123","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"140000","maxPlatOICoinLmt":"","maxPlatOILmt":"4900000","maxPxLmtPct":"0.3","maxStopSz":"140000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"COAI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"COMP","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"COMP-USDT","instId":"COMP-USDT-SWAP","instIdCode":10498,"instType":"SWAP","lever":"20","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4400","maxPlatOICoinLmt":"","maxPlatOILmt":"6200000","maxPxLmtPct":"0.3","maxStopSz":"4400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"COMP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"CRV","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CRV-USDT","instId":"CRV-USDT-SWAP","instIdCode":10500,"instType":"SWAP","lever":"50","listTime":"1599214371000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"350000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"350000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"360000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"CRV-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"CVX","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"CVX-USDT","instId":"CVX-USDT-SWAP","instIdCode":163800,"instType":"SWAP","lever":"10","listTime":"1719303900750","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1900","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"1900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"CVX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"DASH","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"DASH-USDT","instId":"DASH-USDT-SWAP","instIdCode":234988,"instType":"SWAP","lever":"50","listTime":"1762398000994","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"140000","maxPlatOICoinLmt":"","maxPlatOILmt":"19400000","maxPxLmtPct":"0.3","maxStopSz":"140000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"DASH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"DOOD","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"DOOD-USDT","instId":"DOOD-USDT-SWAP","instIdCode":209986,"instType":"SWAP","lever":"20","listTime":"1747051200521","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1700","maxPlatOICoinLmt":"","maxPlatOILmt":"2900000","maxPxLmtPct":"0.3","maxStopSz":"1700","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"DOOD-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"DOS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"DOS-USDT","instId":"DOS-USDT-SWAP","instIdCode":403672,"instType":"SWAP","lever":"20","listTime":"1786363200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"3100","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"3100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"450000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"DOS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"DOT","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"DOT-USDT","instId":"DOT-USDT-SWAP","instIdCode":10504,"instType":"SWAP","lever":"50","listTime":"1598350371000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"90000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"90000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"1100000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"DOT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"DYDX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"DYDX-USDT","instId":"DYDX-USDT-SWAP","instIdCode":41286,"instType":"SWAP","lever":"20","listTime":"1631117510421","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"110000","maxPlatOICoinLmt":"","maxPlatOILmt":"8000000","maxPxLmtPct":"0.3","maxStopSz":"110000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"DYDX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"EDEN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"EDEN-USDT","instId":"EDEN-USDT-SWAP","instIdCode":229475,"instType":"SWAP","lever":"20","listTime":"1759231801710","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"79000","maxPlatOICoinLmt":"","maxPlatOILmt":"2700000","maxPxLmtPct":"0.3","maxStopSz":"79000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"EDEN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"EDGE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"EDGE-USDT","instId":"EDGE-USDT-SWAP","instIdCode":255755,"instType":"SWAP","lever":"20","listTime":"1775050200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"3200","maxPlatOICoinLmt":"","maxPlatOILmt":"15500000","maxPxLmtPct":"0.3","maxStopSz":"3200","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"400000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"EDGE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"EGLD","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"EGLD-USDT","instId":"EGLD-USDT-SWAP","instIdCode":10505,"instType":"SWAP","lever":"20","listTime":"1608620400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"29000","maxPlatOICoinLmt":"","maxPlatOILmt":"2600000","maxPxLmtPct":"0.3","maxStopSz":"29000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"EGLD-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"EIGEN","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"EIGEN-USDT","instId":"EIGEN-USDT-SWAP","instIdCode":176322,"instType":"SWAP","lever":"20","listTime":"1727764200682","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"75000","maxPlatOICoinLmt":"","maxPlatOILmt":"7300000","maxPxLmtPct":"0.3","maxStopSz":"75000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"EIGEN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ENA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ENA-USDT","instId":"ENA-USDT-SWAP","instIdCode":227622,"instType":"SWAP","lever":"50","listTime":"1758094200364","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"150000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"150000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"4400000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ENA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ENJ","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ENJ-USDT","instId":"ENJ-USDT-SWAP","instIdCode":150367,"instType":"SWAP","lever":"10","listTime":"1709288701407","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"15000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"15000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ENJ-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"ENS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ENS-USDT","instId":"ENS-USDT-SWAP","instIdCode":46126,"instType":"SWAP","lever":"20","listTime":"1636623946265","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"35000","maxPlatOICoinLmt":"","maxPlatOILmt":"9500000","maxPxLmtPct":"0.3","maxStopSz":"35000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"ENS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ENSO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ENSO-USDT","instId":"ENSO-USDT-SWAP","instIdCode":233767,"instType":"SWAP","lever":"50","listTime":"1761732001294","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"25000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"25000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ENSO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"ESP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"ESP-USDT","instId":"ESP-USDT-SWAP","instIdCode":248585,"instType":"SWAP","lever":"20","listTime":"1770739200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1400","maxPlatOICoinLmt":"","maxPlatOILmt":"2500000","maxPxLmtPct":"0.3","maxStopSz":"1400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"460000","posLmtPct":"25","preMktSwTime":"1770903300000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ESP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ETC","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ETC-USDT","instId":"ETC-USDT-SWAP","instIdCode":10469,"instType":"SWAP","lever":"50","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"970","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"970","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"ETC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ETHFI","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ETHFI-USDT","instId":"ETHFI-USDT-SWAP","instIdCode":152367,"instType":"SWAP","lever":"20","listTime":"1710764700945","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"64000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"64000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"380000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ETHFI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"ETHW","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ETHW-USDT","instId":"ETHW-USDT-SWAP","instIdCode":101387,"instType":"SWAP","lever":"10","listTime":"1663311331635","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"190000","maxPlatOICoinLmt":"","maxPlatOILmt":"3400000","maxPxLmtPct":"0.3","maxStopSz":"190000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ETHW-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"F","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"F-USDT","instId":"F-USDT-SWAP","instIdCode":233329,"instType":"SWAP","lever":"20","listTime":"1761379201201","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"23000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"23000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"F-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"FARTCOIN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"FARTCOIN-USDT","instId":"FARTCOIN-USDT-SWAP","instIdCode":189540,"instType":"SWAP","lever":"20","listTime":"1734685200393","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"390000","maxPlatOICoinLmt":"","maxPlatOILmt":"16700000","maxPxLmtPct":"0.3","maxStopSz":"390000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"360000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"FARTCOIN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"FIL","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"FIL-USDT","instId":"FIL-USDT-SWAP","instIdCode":10507,"instType":"SWAP","lever":"50","listTime":"1565431971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2800000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"2800000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"2000000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"FIL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100000","ctValCcy":"FLOKI","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"FLOKI-USDT","instId":"FLOKI-USDT-SWAP","instIdCode":115489,"instType":"SWAP","lever":"20","listTime":"1676876100607","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"11000","maxPlatOICoinLmt":"","maxPlatOILmt":"4100000","maxPxLmtPct":"0.3","maxStopSz":"11000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00000001","tradeQuoteCcyList":[],"uly":"FLOKI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"FLOW","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"FLOW-USDT","instId":"FLOW-USDT-SWAP","instIdCode":137141,"instType":"SWAP","lever":"10","listTime":"1699350900756","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"27000","maxPlatOICoinLmt":"","maxPlatOILmt":"3500000","maxPxLmtPct":"0.3","maxStopSz":"27000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"FLOW-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"FOGO","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"FOGO-USDT","instId":"FOGO-USDT-SWAP","instIdCode":243802,"instType":"SWAP","lever":"10","listTime":"1768059900000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"53000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"53000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1768487400000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"FOGO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"GALA","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GALA-USDT","instId":"GALA-USDT-SWAP","instIdCode":42682,"instType":"SWAP","lever":"50","listTime":"1632477789599","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1400000","maxPlatOICoinLmt":"","maxPlatOILmt":"8300000","maxPxLmtPct":"0.3","maxStopSz":"1400000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"GALA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"GAS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GAS-USDT","instId":"GAS-USDT-SWAP","instIdCode":135958,"instType":"SWAP","lever":"20","listTime":"1698141300695","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"5000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"GAS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"GIGGLE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GIGGLE-USDT","instId":"GIGGLE-USDT-SWAP","instIdCode":233316,"instType":"SWAP","lever":"50","listTime":"1761375601708","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"48000","maxPlatOICoinLmt":"","maxPlatOILmt":"5800000","maxPxLmtPct":"0.3","maxStopSz":"48000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"410000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"GIGGLE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"GLM","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GLM-USDT","instId":"GLM-USDT-SWAP","instIdCode":158496,"instType":"SWAP","lever":"20","listTime":"1715329501418","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4200","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"4200","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"GLM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"GMT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GMT-USDT","instId":"GMT-USDT-SWAP","instIdCode":81738,"instType":"SWAP","lever":"20","listTime":"1648803369890","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"780000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"780000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"390000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"GMT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"GMX","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GMX-USDT","instId":"GMX-USDT-SWAP","instIdCode":114226,"instType":"SWAP","lever":"20","listTime":"1675321542847","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"9000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"9000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"GMX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"GPS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GPS-USDT","instId":"GPS-USDT-SWAP","instIdCode":200413,"instType":"SWAP","lever":"20","listTime":"1741089600468","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"20000","maxPlatOICoinLmt":"","maxPlatOILmt":"3300000","maxPxLmtPct":"0.3","maxStopSz":"20000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"560000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"GPS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"GRAM","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GRAM-USDT","instId":"GRAM-USDT-SWAP","instIdCode":318896,"instType":"SWAP","lever":"50","listTime":"1781692200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"41000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"41000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"GRAM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"GRASS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GRASS-USDT","instId":"GRASS-USDT-SWAP","instIdCode":182059,"instType":"SWAP","lever":"20","listTime":"1730125800597","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"75000","maxPlatOICoinLmt":"","maxPlatOILmt":"7100000","maxPxLmtPct":"0.3","maxStopSz":"75000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"GRASS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"GRT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GRT-USDT","instId":"GRT-USDT-SWAP","instIdCode":10509,"instType":"SWAP","lever":"20","listTime":"1608458400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"15000","maxPlatOICoinLmt":"","maxPlatOILmt":"3300000","maxPxLmtPct":"0.3","maxStopSz":"15000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"GRT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"GRVT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"GRVT-USDT","instId":"GRVT-USDT-SWAP","instIdCode":386796,"instType":"SWAP","lever":"20","listTime":"1785423600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8800","maxPlatOICoinLmt":"","maxPlatOILmt":"8200000","maxPxLmtPct":"0.3","maxStopSz":"8800","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"GRVT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"H","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"H-USDT","instId":"H-USDT-SWAP","instIdCode":216935,"instType":"SWAP","lever":"10","listTime":"1751522400413","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"910","maxPlatOICoinLmt":"","maxPlatOILmt":"17600000","maxPxLmtPct":"0.3","maxStopSz":"910","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"860000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"H-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"HBAR","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"HBAR-USDT","instId":"HBAR-USDT-SWAP","instIdCode":129258,"instType":"SWAP","lever":"50","listTime":"1692165300823","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"16000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"16000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"HBAR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"HMSTR","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"HMSTR-USDT","instId":"HMSTR-USDT-SWAP","instIdCode":175743,"instType":"SWAP","lever":"10","listTime":"1727353800176","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"450000","maxPlatOICoinLmt":"","maxPlatOILmt":"2500000","maxPxLmtPct":"0.3","maxStopSz":"450000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"HMSTR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"HOME","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"HOME-USDT","instId":"HOME-USDT-SWAP","instIdCode":214392,"instType":"SWAP","lever":"20","listTime":"1749809700256","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"16000","maxPlatOICoinLmt":"","maxPlatOILmt":"5100000","maxPxLmtPct":"0.3","maxStopSz":"16000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"HOME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"HUMA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"HUMA-USDT","instId":"HUMA-USDT-SWAP","instIdCode":211893,"instType":"SWAP","lever":"20","listTime":"1748266200433","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2300","maxPlatOICoinLmt":"","maxPlatOILmt":"5800000","maxPxLmtPct":"0.3","maxStopSz":"2300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"HUMA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"HYPE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"HYPE-USDT","instId":"HYPE-USDT-SWAP","instIdCode":198413,"instType":"SWAP","lever":"50","listTime":"1740121200506","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"99000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"99000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"8900000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"HYPE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"ICP","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ICP-USDT","instId":"ICP-USDT-SWAP","instIdCode":21505,"instType":"SWAP","lever":"50","listTime":"1620982800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2300000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"2300000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"570000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"ICP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"IMX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"IMX-USDT","instId":"IMX-USDT-SWAP","instIdCode":46603,"instType":"SWAP","lever":"20","listTime":"1637218222034","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"39000","maxPlatOICoinLmt":"","maxPlatOILmt":"4300000","maxPxLmtPct":"0.3","maxStopSz":"39000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"IMX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"INIT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"INIT-USDT","instId":"INIT-USDT-SWAP","instIdCode":207523,"instType":"SWAP","lever":"10","listTime":"1745494200437","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2300","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"2300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"INIT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"INJ","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"INJ-USDT","instId":"INJ-USDT-SWAP","instIdCode":139329,"instType":"SWAP","lever":"50","listTime":"1701345300667","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"77000","maxPlatOICoinLmt":"","maxPlatOILmt":"14200000","maxPxLmtPct":"0.3","maxStopSz":"77000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"540000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"INJ-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"IOST","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"IOST-USDT","instId":"IOST-USDT-SWAP","instIdCode":10511,"instType":"SWAP","lever":"10","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4000","maxPlatOICoinLmt":"","maxPlatOILmt":"4900000","maxPxLmtPct":"0.3","maxStopSz":"4000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"IOST-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"IOTA","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"IOTA-USDT","instId":"IOTA-USDT-SWAP","instIdCode":10513,"instType":"SWAP","lever":"20","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"22000","maxPlatOICoinLmt":"","maxPlatOILmt":"2300000","maxPxLmtPct":"0.3","maxStopSz":"22000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"IOTA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"IRYS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"IRYS-USDT","instId":"IRYS-USDT-SWAP","instIdCode":288020,"instType":"SWAP","lever":"10","listTime":"1779880500000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2800","maxPlatOICoinLmt":"","maxPlatOILmt":"2700000","maxPxLmtPct":"0.3","maxStopSz":"2800","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"IRYS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"JELLYJELLY","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"JELLYJELLY-USDT","instId":"JELLYJELLY-USDT-SWAP","instIdCode":203463,"instType":"SWAP","lever":"10","listTime":"1743004470352","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"530","maxPlatOICoinLmt":"","maxPlatOILmt":"5200000","maxPxLmtPct":"0.3","maxStopSz":"530","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"JELLYJELLY-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"JTO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"JTO-USDT","instId":"JTO-USDT-SWAP","instIdCode":143865,"instType":"SWAP","lever":"50","listTime":"1704696900623","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"53000","maxPlatOICoinLmt":"","maxPlatOILmt":"11500000","maxPxLmtPct":"0.3","maxStopSz":"53000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"470000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"JTO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"JUP","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"JUP-USDT","instId":"JUP-USDT-SWAP","instIdCode":146691,"instType":"SWAP","lever":"50","listTime":"1706717100211","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"9000","maxPlatOICoinLmt":"","maxPlatOILmt":"16500000","maxPxLmtPct":"0.3","maxStopSz":"9000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"JUP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"KAITO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"KAITO-USDT","instId":"KAITO-USDT-SWAP","instIdCode":198342,"instType":"SWAP","lever":"50","listTime":"1740060000331","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"64000","maxPlatOICoinLmt":"","maxPlatOILmt":"17100000","maxPxLmtPct":"0.3","maxStopSz":"64000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"830000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"KAITO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"KAT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"KAT-USDT","instId":"KAT-USDT-SWAP","instIdCode":251546,"instType":"SWAP","lever":"20","listTime":"1772451000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"18000","maxPlatOICoinLmt":"","maxPlatOILmt":"3900000","maxPxLmtPct":"0.3","maxStopSz":"18000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1773840600000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"KAT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"KGEN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"KGEN-USDT","instId":"KGEN-USDT-SWAP","instIdCode":232383,"instType":"SWAP","lever":"10","listTime":"1760761801014","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1300","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"1300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"KGEN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"KITE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"KITE-USDT","instId":"KITE-USDT-SWAP","instIdCode":258273,"instType":"SWAP","lever":"10","listTime":"1775703600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5900","maxPlatOICoinLmt":"","maxPlatOILmt":"4700000","maxPxLmtPct":"0.3","maxStopSz":"5900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"KITE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"KMNO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"KMNO-USDT","instId":"KMNO-USDT-SWAP","instIdCode":212316,"instType":"SWAP","lever":"20","listTime":"1748575800335","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2300","maxPlatOICoinLmt":"","maxPlatOILmt":"3000000","maxPxLmtPct":"0.3","maxStopSz":"2300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"KMNO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"KSM","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"KSM-USDT","instId":"KSM-USDT-SWAP","instIdCode":10517,"instType":"SWAP","lever":"20","listTime":"1599559971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"22000","maxPlatOICoinLmt":"","maxPlatOILmt":"2900000","maxPxLmtPct":"0.3","maxStopSz":"22000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"KSM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"LA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"LA-USDT","instId":"LA-USDT-SWAP","instIdCode":214391,"instType":"SWAP","lever":"20","listTime":"1749808800320","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7100","maxPlatOICoinLmt":"","maxPlatOILmt":"4600000","maxPxLmtPct":"0.3","maxStopSz":"7100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"LA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"LAB","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.32","instCategory":"1","instFamily":"LAB-USDT","instId":"LAB-USDT-SWAP","instIdCode":234303,"instType":"SWAP","lever":"10","listTime":"1761998401879","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"14000","maxPlatOICoinLmt":"","maxPlatOILmt":"14500000","maxPxLmtPct":"0.3","maxStopSz":"14000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"610000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"LAB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"LAYER","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"LAYER-USDT","instId":"LAYER-USDT-SWAP","instIdCode":197092,"instType":"SWAP","lever":"20","listTime":"1739284200817","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"170000","maxPlatOICoinLmt":"","maxPlatOILmt":"3100000","maxPxLmtPct":"0.3","maxStopSz":"170000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"LAYER-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"LDO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"LDO-USDT","instId":"LDO-USDT-SWAP","instIdCode":114224,"instType":"SWAP","lever":"50","listTime":"1675321369323","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"72000","maxPlatOICoinLmt":"","maxPlatOILmt":"16400000","maxPxLmtPct":"0.3","maxStopSz":"72000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"LDO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"LINEA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"LINEA-USDT","instId":"LINEA-USDT-SWAP","instIdCode":225648,"instType":"SWAP","lever":"50","listTime":"1756735200376","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"38000","maxPlatOICoinLmt":"","maxPlatOILmt":"4900000","maxPxLmtPct":"0.3","maxStopSz":"38000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1757518500000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"LINEA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"LINK","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"LINK-USDT","instId":"LINK-USDT-SWAP","instIdCode":10519,"instType":"SWAP","lever":"50","listTime":"1582888608000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"42000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"42000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"LINK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"LIT","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"LIT-USDT","instId":"LIT-USDT-SWAP","instIdCode":241559,"instType":"SWAP","lever":"50","listTime":"1766547000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"27000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"27000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"2900000","posLmtPct":"25","preMktSwTime":"1767082200000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"LIT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"LPT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"LPT-USDT","instId":"LPT-USDT-SWAP","instIdCode":19721,"instType":"SWAP","lever":"20","listTime":"1619161200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"79000","maxPlatOICoinLmt":"","maxPlatOILmt":"5700000","maxPxLmtPct":"0.3","maxStopSz":"79000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"LPT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"LQTY","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"LQTY-USDT","instId":"LQTY-USDT-SWAP","instIdCode":144479,"instType":"SWAP","lever":"10","listTime":"1705053300717","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"14000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"14000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"LQTY-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"LTC","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"LTC-USDT","instId":"LTC-USDT-SWAP","instIdCode":10463,"instType":"SWAP","lever":"50","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7400","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"7400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"LTC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"MAGIC","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MAGIC-USDT","instId":"MAGIC-USDT-SWAP","instIdCode":114225,"instType":"SWAP","lever":"20","listTime":"1675321549791","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"130000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"130000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MAGIC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1615542952000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"MANA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MANA-USDT","instId":"MANA-USDT-SWAP","instIdCode":16652,"instType":"SWAP","lever":"20","listTime":"1615539600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"29000","maxPlatOICoinLmt":"","maxPlatOILmt":"2500000","maxPxLmtPct":"0.3","maxStopSz":"29000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MANA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1614841291000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"MASK","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.06","instCategory":"1","instFamily":"MASK-USDT","instId":"MASK-USDT-SWAP","instIdCode":15720,"instType":"SWAP","lever":"20","listTime":"1614841200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"20000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"20000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"MASK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ME","expTime":"","floatPxLmtPct":"0.04","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ME-USDT","instId":"ME-USDT-SWAP","instIdCode":187915,"instType":"SWAP","lever":"20","listTime":"1733844600107","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"170000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"170000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"MEGA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MEGA-USDT","instId":"MEGA-USDT-SWAP","instIdCode":266789,"instType":"SWAP","lever":"20","listTime":"1777550400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"31000","maxPlatOICoinLmt":"","maxPlatOILmt":"3700000","maxPxLmtPct":"0.3","maxStopSz":"31000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MEGA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"MEME","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MEME-USDT","instId":"MEME-USDT-SWAP","instIdCode":136870,"instType":"SWAP","lever":"20","listTime":"1699001700715","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"100000","maxPlatOICoinLmt":"","maxPlatOILmt":"2500000","maxPxLmtPct":"0.3","maxStopSz":"100000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"MEME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"MERL","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MERL-USDT","instId":"MERL-USDT-SWAP","instIdCode":156206,"instType":"SWAP","lever":"20","listTime":"1713522300606","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"340000","maxPlatOICoinLmt":"","maxPlatOILmt":"5500000","maxPxLmtPct":"0.3","maxStopSz":"340000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MERL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"MET","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"MET-USDT","instId":"MET-USDT-SWAP","instIdCode":230928,"instType":"SWAP","lever":"20","listTime":"1760084100254","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"33000","maxPlatOICoinLmt":"","maxPlatOILmt":"5900000","maxPxLmtPct":"0.3","maxStopSz":"33000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1761229800000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"MET-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"METIS","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"METIS-USDT","instId":"METIS-USDT-SWAP","instIdCode":142725,"instType":"SWAP","lever":"10","listTime":"1703757300614","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"9100","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"9100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"METIS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"MEW","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MEW-USDT","instId":"MEW-USDT-SWAP","instIdCode":155695,"instType":"SWAP","lever":"20","listTime":"1713169500531","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"33000","maxPlatOICoinLmt":"","maxPlatOILmt":"2400000","maxPxLmtPct":"0.3","maxStopSz":"33000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"MEW-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"MINA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MINA-USDT","instId":"MINA-USDT-SWAP","instIdCode":23554,"instType":"SWAP","lever":"20","listTime":"1623229200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"80000","maxPlatOICoinLmt":"","maxPlatOILmt":"7700000","maxPxLmtPct":"0.3","maxStopSz":"80000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MINA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"MMT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MMT-USDT","instId":"MMT-USDT-SWAP","instIdCode":234681,"instType":"SWAP","lever":"20","listTime":"1762259401259","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6300","maxPlatOICoinLmt":"","maxPlatOILmt":"6500000","maxPxLmtPct":"0.3","maxStopSz":"6300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"380000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"MMT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"MON","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"MON-USDT","instId":"MON-USDT-SWAP","instIdCode":230927,"instType":"SWAP","lever":"50","listTime":"1760083200427","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"110000","maxPlatOICoinLmt":"","maxPlatOILmt":"21200000","maxPxLmtPct":"0.3","maxStopSz":"110000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1764000300000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MON-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"MOODENG","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MOODENG-USDT","instId":"MOODENG-USDT-SWAP","instIdCode":176639,"instType":"SWAP","lever":"20","listTime":"1727938802849","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"39000","maxPlatOICoinLmt":"","maxPlatOILmt":"9500000","maxPxLmtPct":"0.3","maxStopSz":"39000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"400000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"MOODENG-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"MORPHO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MORPHO-USDT","instId":"MORPHO-USDT-SWAP","instIdCode":186041,"instType":"SWAP","lever":"20","listTime":"1732528800980","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6600","maxPlatOICoinLmt":"","maxPlatOILmt":"18200000","maxPxLmtPct":"0.3","maxStopSz":"6600","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"MORPHO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"MOVE","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MOVE-USDT","instId":"MOVE-USDT-SWAP","instIdCode":187846,"instType":"SWAP","lever":"20","listTime":"1733749202646","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"77000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"77000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"410000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"MOVE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"MUBARAK","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"MUBARAK-USDT","instId":"MUBARAK-USDT-SWAP","instIdCode":212925,"instType":"SWAP","lever":"20","listTime":"1748946600286","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2900","maxPlatOICoinLmt":"","maxPlatOILmt":"18300000","maxPxLmtPct":"0.3","maxStopSz":"2900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"MUBARAK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"NEAR","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"NEAR-USDT","instId":"NEAR-USDT-SWAP","instIdCode":10523,"instType":"SWAP","lever":"50","listTime":"1608544800000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7800","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"7800","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"3400000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"NEAR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"NEIRO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"NEIRO-USDT","instId":"NEIRO-USDT-SWAP","instIdCode":176640,"instType":"SWAP","lever":"20","listTime":"1727939701217","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"130000","maxPlatOICoinLmt":"","maxPlatOILmt":"3400000","maxPxLmtPct":"0.3","maxStopSz":"130000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00000001","tradeQuoteCcyList":[],"uly":"NEIRO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"NEO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"NEO-USDT","instId":"NEO-USDT-SWAP","instIdCode":10477,"instType":"SWAP","lever":"20","listTime":"1582888608000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5500","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"5500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"NEO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"NIGHT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.12","instCategory":"1","instFamily":"NIGHT-USDT","instId":"NIGHT-USDT-SWAP","instIdCode":239610,"instType":"SWAP","lever":"20","listTime":"1765279800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4000","maxPlatOICoinLmt":"","maxPlatOILmt":"6600000","maxPxLmtPct":"0.3","maxStopSz":"4000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"460000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"NIGHT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"NMR","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"NMR-USDT","instId":"NMR-USDT-SWAP","instIdCode":144154,"instType":"SWAP","lever":"20","listTime":"1704959700642","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5200","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"5200","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"NMR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"NOT","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"NOT-USDT","instId":"NOT-USDT-SWAP","instIdCode":159068,"instType":"SWAP","lever":"20","listTime":"1715862465350","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"210000","maxPlatOICoinLmt":"","maxPlatOILmt":"2700000","maxPxLmtPct":"0.3","maxStopSz":"210000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"NOT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"O","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"O-USDT","instId":"O-USDT-SWAP","instIdCode":319272,"instType":"SWAP","lever":"10","listTime":"1781713800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2300","maxPlatOICoinLmt":"","maxPlatOILmt":"5700000","maxPxLmtPct":"0.3","maxStopSz":"2300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"O-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ON","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"3","instFamily":"ON-USDT","instId":"ON-USDT-SWAP","instIdCode":347914,"instType":"SWAP","lever":"10","listTime":"1783329300000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"24","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.05","maxStopSz":"24","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"ON-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ONDO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ONDO-USDT","instId":"ONDO-USDT-SWAP","instIdCode":170039,"instType":"SWAP","lever":"50","listTime":"1722940203957","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"50000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"50000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"1600000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ONDO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"ONE","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ONE-USDT","instId":"ONE-USDT-SWAP","instIdCode":149035,"instType":"SWAP","lever":"10","listTime":"1708426039038","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"19000","maxPlatOICoinLmt":"","maxPlatOILmt":"15000000","maxPxLmtPct":"0.3","maxStopSz":"19000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"ONE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ONT","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ONT-USDT","instId":"ONT-USDT-SWAP","instIdCode":10526,"instType":"SWAP","lever":"20","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"44000","maxPlatOICoinLmt":"","maxPlatOILmt":"3000000","maxPxLmtPct":"0.3","maxStopSz":"44000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ONT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"OP","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"OP-USDT","instId":"OP-USDT-SWAP","instIdCode":86647,"instType":"SWAP","lever":"50","listTime":"1654055717137","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"410000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"410000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"600000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"OP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"OPG","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"OPG-USDT","instId":"OPG-USDT-SWAP","instIdCode":263389,"instType":"SWAP","lever":"20","listTime":"1776934800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8300","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"8300","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"OPG-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1771848000000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"OPN","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"OPN-USDT","instId":"OPN-USDT-SWAP","instIdCode":250452,"instType":"SWAP","lever":"20","listTime":"1771847700000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"16000","maxPlatOICoinLmt":"","maxPlatOILmt":"3300000","maxPxLmtPct":"0.3","maxStopSz":"16000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"pre_quote","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1772782200000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"OPN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ORDER","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ORDER-USDT","instId":"ORDER-USDT-SWAP","instIdCode":229478,"instType":"SWAP","lever":"20","listTime":"1759245300953","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5400","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"5400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ORDER-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"ORDI","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ORDI-USDT","instId":"ORDI-USDT-SWAP","instIdCode":122045,"instType":"SWAP","lever":"20","listTime":"1684662900862","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"130000","maxPlatOICoinLmt":"","maxPlatOILmt":"17600000","maxPxLmtPct":"0.3","maxStopSz":"130000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"490000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"ORDI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"PENDLE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PENDLE-USDT","instId":"PENDLE-USDT-SWAP","instIdCode":227627,"instType":"SWAP","lever":"50","listTime":"1758093984811","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"12000","maxPlatOICoinLmt":"","maxPlatOILmt":"12400000","maxPxLmtPct":"0.3","maxStopSz":"12000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"PENDLE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"PENGU","expTime":"","floatPxLmtPct":"0.04","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PENGU-USDT","instId":"PENGU-USDT-SWAP","instIdCode":189005,"instType":"SWAP","lever":"50","listTime":"1734450902264","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"110000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"110000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"730000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"PENGU-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"PEOPLE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.06","instCategory":"1","instFamily":"PEOPLE-USDT","instId":"PEOPLE-USDT-SWAP","instIdCode":47664,"instType":"SWAP","lever":"20","listTime":"1638427889758","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"38000","maxPlatOICoinLmt":"","maxPlatOILmt":"13400000","maxPxLmtPct":"0.3","maxStopSz":"38000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"PEOPLE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10000000","ctValCcy":"PEPE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PEPE-USDT","instId":"PEPE-USDT-SWAP","instIdCode":120775,"instType":"SWAP","lever":"50","listTime":"1683086101049","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"16000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"16000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"6800000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000000001","tradeQuoteCcyList":[],"uly":"PEPE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"PIEVERSE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PIEVERSE-USDT","instId":"PIEVERSE-USDT-SWAP","instIdCode":236488,"instType":"SWAP","lever":"20","listTime":"1763263801177","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1600","maxPlatOICoinLmt":"","maxPlatOILmt":"24200000","maxPxLmtPct":"0.3","maxStopSz":"1600","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"390000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"PIEVERSE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"PIPPIN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PIPPIN-USDT","instId":"PIPPIN-USDT-SWAP","instIdCode":238836,"instType":"SWAP","lever":"20","listTime":"1764687600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"73000","maxPlatOICoinLmt":"","maxPlatOILmt":"5600000","maxPxLmtPct":"0.3","maxStopSz":"73000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"PIPPIN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"PLUME","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PLUME-USDT","instId":"PLUME-USDT-SWAP","instIdCode":209300,"instType":"SWAP","lever":"20","listTime":"1746689400330","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"59000","maxPlatOICoinLmt":"","maxPlatOILmt":"4200000","maxPxLmtPct":"0.3","maxStopSz":"59000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"PLUME-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"PNUT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PNUT-USDT","instId":"PNUT-USDT-SWAP","instIdCode":184109,"instType":"SWAP","lever":"20","listTime":"1731382200304","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"23000","maxPlatOICoinLmt":"","maxPlatOILmt":"5900000","maxPxLmtPct":"0.3","maxStopSz":"23000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"PNUT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"POL","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"POL-USDT","instId":"POL-USDT-SWAP","instIdCode":175501,"instType":"SWAP","lever":"50","listTime":"1727166600128","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"49000","maxPlatOICoinLmt":"","maxPlatOILmt":"20200000","maxPxLmtPct":"0.3","maxStopSz":"49000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"360000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"POL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"POPCAT","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"POPCAT-USDT","instId":"POPCAT-USDT-SWAP","instIdCode":172607,"instType":"SWAP","lever":"20","listTime":"1724922000651","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"14000","maxPlatOICoinLmt":"","maxPlatOILmt":"2700000","maxPxLmtPct":"0.3","maxStopSz":"14000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"POPCAT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"PROVE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PROVE-USDT","instId":"PROVE-USDT-SWAP","instIdCode":232285,"instType":"SWAP","lever":"20","listTime":"1760700601003","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"2000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"43000","maxPlatOICoinLmt":"","maxPlatOILmt":"2400000","maxPxLmtPct":"0.3","maxStopSz":"43000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"PROVE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"PUMP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PUMP-USDT","instId":"PUMP-USDT-SWAP","instIdCode":218603,"instType":"SWAP","lever":"50","listTime":"1752514200381","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"55000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"55000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"4600000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"PUMP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"PYTH","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"PYTH-USDT","instId":"PYTH-USDT-SWAP","instIdCode":138497,"instType":"SWAP","lever":"50","listTime":"1700492100712","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"27000","maxPlatOICoinLmt":"","maxPlatOILmt":"9700000","maxPxLmtPct":"0.3","maxStopSz":"27000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"PYTH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"QNT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"3","instFamily":"QNT-USDT","instId":"QNT-USDT-SWAP","instIdCode":301398,"instType":"SWAP","lever":"10","listTime":"1780655400000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"530","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"530","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"QNT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"QTUM","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"QTUM-USDT","instId":"QTUM-USDT-SWAP","instIdCode":10479,"instType":"SWAP","lever":"20","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4400","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"4400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"QTUM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"RAVE","expTime":"","floatPxLmtPct":"0.04","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"RAVE-USDT","instId":"RAVE-USDT-SWAP","instIdCode":240513,"instType":"SWAP","lever":"20","listTime":"1765785600000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6500","maxPlatOICoinLmt":"","maxPlatOILmt":"6300000","maxPxLmtPct":"0.3","maxStopSz":"6500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"fix_price","optType":"","posLmtAmt":"650000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"RAVE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"RE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"RE-USDT","instId":"RE-USDT-SWAP","instIdCode":318802,"instType":"SWAP","lever":"20","listTime":"1781692200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7100","maxPlatOICoinLmt":"","maxPlatOILmt":"5700000","maxPxLmtPct":"0.3","maxStopSz":"7100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"720000","posLmtPct":"25","preMktSwTime":"1781792400000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"RE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"RECALL","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"RECALL-USDT","instId":"RECALL-USDT-SWAP","instIdCode":233933,"instType":"SWAP","lever":"10","listTime":"1761819300976","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6500","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"6500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"RECALL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"RENDER","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"RENDER-USDT","instId":"RENDER-USDT-SWAP","instIdCode":170252,"instType":"SWAP","lever":"20","listTime":"1723105800136","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"26000","maxPlatOICoinLmt":"","maxPlatOILmt":"13800000","maxPxLmtPct":"0.3","maxStopSz":"26000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"370000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"RENDER-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"RESOLV","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"RESOLV-USDT","instId":"RESOLV-USDT-SWAP","instIdCode":213805,"instType":"SWAP","lever":"10","listTime":"1749565800438","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"67000","maxPlatOICoinLmt":"","maxPlatOILmt":"3900000","maxPxLmtPct":"0.3","maxStopSz":"67000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"RESOLV-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"RIVER","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"RIVER-USDT","instId":"RIVER-USDT-SWAP","instIdCode":243614,"instType":"SWAP","lever":"20","listTime":"1767942000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"43000","maxPlatOICoinLmt":"","maxPlatOILmt":"8800000","maxPxLmtPct":"0.3","maxStopSz":"43000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"RIVER-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"ROBO","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ROBO-USDT","instId":"ROBO-USDT-SWAP","instIdCode":251233,"instType":"SWAP","lever":"10","listTime":"1772206200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"10000","maxPlatOICoinLmt":"","maxPlatOILmt":"3600000","maxPxLmtPct":"0.3","maxStopSz":"10000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ROBO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"RSR","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.06","instCategory":"1","instFamily":"RSR-USDT","instId":"RSR-USDT-SWAP","instIdCode":10528,"instType":"SWAP","lever":"20","listTime":"1599646371000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"45000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"45000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"RSR-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"RVN","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"RVN-USDT","instId":"RVN-USDT-SWAP","instIdCode":19722,"instType":"SWAP","lever":"20","listTime":"1619161200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"160000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"160000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"RVN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"S","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"S-USDT","instId":"S-USDT-SWAP","instIdCode":193995,"instType":"SWAP","lever":"20","listTime":"1737450000523","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"18000","maxPlatOICoinLmt":"","maxPlatOILmt":"3800000","maxPxLmtPct":"0.3","maxStopSz":"18000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"S-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SAHARA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SAHARA-USDT","instId":"SAHARA-USDT-SWAP","instIdCode":216072,"instType":"SWAP","lever":"20","listTime":"1750941000359","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"67000","maxPlatOICoinLmt":"","maxPlatOILmt":"4400000","maxPxLmtPct":"0.3","maxStopSz":"67000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"SAHARA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1617354221000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SAND","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SAND-USDT","instId":"SAND-USDT-SWAP","instIdCode":18136,"instType":"SWAP","lever":"50","listTime":"1617354000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"43000","maxPlatOICoinLmt":"","maxPlatOILmt":"7200000","maxPxLmtPct":"0.3","maxStopSz":"43000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SAND-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SAPIEN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SAPIEN-USDT","instId":"SAPIEN-USDT-SWAP","instIdCode":235077,"instType":"SWAP","lever":"10","listTime":"1762429500524","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1900","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"1900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SAPIEN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10000000","ctValCcy":"SATS","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SATS-USDT","instId":"SATS-USDT-SWAP","instIdCode":141681,"instType":"SWAP","lever":"10","listTime":"1702889700612","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"43000","maxPlatOICoinLmt":"","maxPlatOILmt":"3100000","maxPxLmtPct":"0.3","maxStopSz":"43000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000000000001","tradeQuoteCcyList":[],"uly":"SATS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SEI","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SEI-USDT","instId":"SEI-USDT-SWAP","instIdCode":236302,"instType":"SWAP","lever":"50","listTime":"1763105401238","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"100000","maxPlatOICoinLmt":"","maxPlatOILmt":"12600000","maxPxLmtPct":"0.3","maxStopSz":"100000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SEI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"SENT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"SENT-USDT","instId":"SENT-USDT-SWAP","instIdCode":236363,"instType":"SWAP","lever":"50","listTime":"1763132401716","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"14000","maxPlatOICoinLmt":"","maxPlatOILmt":"5900000","maxPxLmtPct":"0.3","maxStopSz":"14000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1769085000000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SENT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1620551348000","ctMult":"1","ctType":"linear","ctVal":"1000000","ctValCcy":"SHIB","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SHIB-USDT","instId":"SHIB-USDT-SWAP","instIdCode":21073,"instType":"SWAP","lever":"50","listTime":"1620550800000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000000","maxMktAmt":"","maxMktSz":"33000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"33000","maxTriggerSz":"100000000000.0000000000000000","maxTwapSz":"100000000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"1300000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000000001","tradeQuoteCcyList":[],"uly":"SHIB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"SIGN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SIGN-USDT","instId":"SIGN-USDT-SWAP","instIdCode":208012,"instType":"SWAP","lever":"20","listTime":"1745839800340","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2900","maxPlatOICoinLmt":"","maxPlatOILmt":"3300000","maxPxLmtPct":"0.3","maxStopSz":"2900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"SIGN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"SKY","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SKY-USDT","instId":"SKY-USDT-SWAP","instIdCode":226759,"instType":"SWAP","lever":"20","listTime":"1757590200404","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1700","maxPlatOICoinLmt":"","maxPlatOILmt":"4300000","maxPxLmtPct":"0.3","maxStopSz":"1700","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SKY-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SLX","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SLX-USDT","instId":"SLX-USDT-SWAP","instIdCode":294874,"instType":"SWAP","lever":"20","listTime":"1780291800000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"23000","maxPlatOICoinLmt":"","maxPlatOILmt":"8100000","maxPxLmtPct":"0.3","maxStopSz":"23000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"820000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SLX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"SNX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SNX-USDT","instId":"SNX-USDT-SWAP","instIdCode":10529,"instType":"SWAP","lever":"20","listTime":"1598004771000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"30000","maxPlatOICoinLmt":"","maxPlatOILmt":"3300000","maxPxLmtPct":"0.3","maxStopSz":"30000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"SNX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SOON","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SOON-USDT","instId":"SOON-USDT-SWAP","instIdCode":211603,"instType":"SWAP","lever":"20","listTime":"1747999800456","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"3900","maxPlatOICoinLmt":"","maxPlatOILmt":"8100000","maxPxLmtPct":"0.3","maxStopSz":"3900","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"SOON-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"SOPH","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SOPH-USDT","instId":"SOPH-USDT-SWAP","instIdCode":212107,"instType":"SWAP","lever":"10","listTime":"1748439000413","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8400","maxPlatOICoinLmt":"","maxPlatOILmt":"3100000","maxPxLmtPct":"0.3","maxStopSz":"8400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"SOPH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"SPACE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SPACE-USDT","instId":"SPACE-USDT-SWAP","instIdCode":245724,"instType":"SWAP","lever":"20","listTime":"1769173200000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"18000","maxPlatOICoinLmt":"","maxPlatOILmt":"6100000","maxPxLmtPct":"0.3","maxStopSz":"18000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"SPACE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"SPK","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SPK-USDT","instId":"SPK-USDT-SWAP","instIdCode":214785,"instType":"SWAP","lever":"20","listTime":"1750156200346","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6000","maxPlatOICoinLmt":"","maxPlatOILmt":"3700000","maxPxLmtPct":"0.3","maxStopSz":"6000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"SPK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"SPX","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SPX-USDT","instId":"SPX-USDT-SWAP","instIdCode":218934,"instType":"SWAP","lever":"20","listTime":"1752728400453","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"17000","maxPlatOICoinLmt":"","maxPlatOILmt":"3900000","maxPxLmtPct":"0.3","maxStopSz":"17000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"SPX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"SSV","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SSV-USDT","instId":"SSV-USDT-SWAP","instIdCode":138636,"instType":"SWAP","lever":"20","listTime":"1700711700717","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"26000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"26000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"SSV-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"STABLE","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"STABLE-USDT","instId":"STABLE-USDT-SWAP","instIdCode":239503,"instType":"SWAP","lever":"20","listTime":"1765200600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"2400","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"2400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"STABLE-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"STRK","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"STRK-USDT","instId":"STRK-USDT-SWAP","instIdCode":149046,"instType":"SWAP","lever":"50","listTime":"1708433700141","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1100000","maxPlatOICoinLmt":"","maxPlatOILmt":"16900000","maxPxLmtPct":"0.3","maxStopSz":"1100000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"STRK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"STX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"STX-USDT","instId":"STX-USDT-SWAP","instIdCode":115562,"instType":"SWAP","lever":"20","listTime":"1676969758164","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"6500","maxPlatOICoinLmt":"","maxPlatOILmt":"9700000","maxPxLmtPct":"0.3","maxStopSz":"6500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"STX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"SUI","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SUI-USDT","instId":"SUI-USDT-SWAP","instIdCode":120850,"instType":"SWAP","lever":"50","listTime":"1683258900891","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"420000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"420000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"3500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"SUI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"SUSHI","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SUSHI-USDT","instId":"SUSHI-USDT-SWAP","instIdCode":10536,"instType":"SWAP","lever":"50","listTime":"1599041571000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"70000","maxPlatOICoinLmt":"","maxPlatOILmt":"4900000","maxPxLmtPct":"0.3","maxStopSz":"70000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"SUSHI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"SYRUP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"SYRUP-USDT","instId":"SYRUP-USDT-SWAP","instIdCode":216937,"instType":"SWAP","lever":"20","listTime":"1751524200291","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4100","maxPlatOICoinLmt":"","maxPlatOILmt":"4300000","maxPxLmtPct":"0.3","maxStopSz":"4100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"SYRUP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"TAO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TAO-USDT","instId":"TAO-USDT-SWAP","instIdCode":174952,"instType":"SWAP","lever":"50","listTime":"1726808400182","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"98000","maxPlatOICoinLmt":"","maxPlatOILmt":"46100000","maxPxLmtPct":"0.3","maxStopSz":"98000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.1","tradeQuoteCcyList":[],"uly":"TAO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"THETA","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"THETA-USDT","instId":"THETA-USDT-SWAP","instIdCode":10539,"instType":"SWAP","lever":"20","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4200","maxPlatOICoinLmt":"","maxPlatOILmt":"2500000","maxPxLmtPct":"0.3","maxStopSz":"4200","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"THETA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"TIA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TIA-USDT","instId":"TIA-USDT-SWAP","instIdCode":136595,"instType":"SWAP","lever":"50","listTime":"1698776700675","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"64000","maxPlatOICoinLmt":"","maxPlatOILmt":"8900000","maxPxLmtPct":"0.3","maxStopSz":"64000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"TIA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"TRB","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TRB-USDT","instId":"TRB-USDT-SWAP","instIdCode":10540,"instType":"SWAP","lever":"20","listTime":"1599559971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8000","maxPlatOICoinLmt":"","maxPlatOILmt":"18600000","maxPxLmtPct":"0.3","maxStopSz":"8000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"TRB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"TRIA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TRIA-USDT","instId":"TRIA-USDT-SWAP","instIdCode":247790,"instType":"SWAP","lever":"10","listTime":"1770276600000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"8000","maxPlatOICoinLmt":"","maxPlatOILmt":"2800000","maxPxLmtPct":"0.3","maxStopSz":"8000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"TRIA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"TRUMP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TRUMP-USDT","instId":"TRUMP-USDT-SWAP","instIdCode":193761,"instType":"SWAP","lever":"50","listTime":"1737264604112","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1000000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"1000000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"6400000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"TRUMP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"TRUST","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TRUST-USDT","instId":"TRUST-USDT-SWAP","instIdCode":234940,"instType":"SWAP","lever":"10","listTime":"1762342200957","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4100","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"4100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"TRUST-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"TRUTH","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TRUTH-USDT","instId":"TRUTH-USDT-SWAP","instIdCode":238320,"instType":"SWAP","lever":"10","listTime":"1764329400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4100","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"4100","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"TRUTH-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1000","ctValCcy":"TRX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TRX-USDT","instId":"TRX-USDT-SWAP","instIdCode":10473,"instType":"SWAP","lever":"50","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"1000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"1000000","maxMktAmt":"","maxMktSz":"770","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"770","maxTriggerSz":"1000000.0000000000000000","maxTwapSz":"1000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"TRX-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10000","ctValCcy":"TURBO","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"TURBO-USDT","instId":"TURBO-USDT-SWAP","instIdCode":141070,"instType":"SWAP","lever":"20","listTime":"1702547700612","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"750","maxPlatOICoinLmt":"","maxPlatOILmt":"3600000","maxPxLmtPct":"0.3","maxStopSz":"750","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0000001","tradeQuoteCcyList":[],"uly":"TURBO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"UB","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"UB-USDT","instId":"UB-USDT-SWAP","instIdCode":265560,"instType":"SWAP","lever":"20","listTime":"1777383000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"1000","maxPlatOICoinLmt":"","maxPlatOILmt":"6300000","maxPxLmtPct":"0.3","maxStopSz":"1000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"2100000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"UB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"UMA","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.06","instCategory":"1","instFamily":"UMA-USDT","instId":"UMA-USDT-SWAP","instIdCode":10541,"instType":"SWAP","lever":"10","listTime":"1599214371000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"97000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"97000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"UMA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"UNI","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"UNI-USDT","instId":"UNI-USDT-SWAP","instIdCode":10543,"instType":"SWAP","lever":"50","listTime":"1600317000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"32000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"32000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"500000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"UNI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"USELESS","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"USELESS-USDT","instId":"USELESS-USDT-SWAP","instIdCode":220516,"instType":"SWAP","lever":"10","listTime":"1753437600380","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"13000","maxPlatOICoinLmt":"","maxPlatOILmt":"37000000","maxPxLmtPct":"0.3","maxStopSz":"13000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"USELESS-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"VANA","expTime":"","floatPxLmtPct":"0.04","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"VANA-USDT","instId":"VANA-USDT-SWAP","instIdCode":188993,"instType":"SWAP","lever":"20","listTime":"1734408000582","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"34000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"34000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"VANA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"VIRTUAL","expTime":"","floatPxLmtPct":"0.04","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"VIRTUAL-USDT","instId":"VIRTUAL-USDT-SWAP","instIdCode":188034,"instType":"SWAP","lever":"20","listTime":"1733911200140","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"60000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"60000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"VIRTUAL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"VVV","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"VVV-USDT","instId":"VVV-USDT-SWAP","instIdCode":342909,"instType":"SWAP","lever":"20","listTime":"1783058400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"12000","maxPlatOICoinLmt":"","maxPlatOILmt":"18400000","maxPxLmtPct":"0.3","maxStopSz":"12000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"VVV-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"W","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"W-USDT","instId":"W-USDT-SWAP","instIdCode":154132,"instType":"SWAP","lever":"20","listTime":"1712147100572","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"950000","maxPlatOICoinLmt":"","maxPlatOILmt":"5100000","maxPxLmtPct":"0.3","maxStopSz":"950000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"W-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"WAL","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"WAL-USDT","instId":"WAL-USDT-SWAP","instIdCode":209298,"instType":"SWAP","lever":"10","listTime":"1746687600526","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5400","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"5400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"WAL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"WCT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"WCT-USDT","instId":"WCT-USDT-SWAP","instIdCode":206314,"instType":"SWAP","lever":"20","listTime":"1744716600433","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"13000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"13000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"WCT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"WET","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"WET-USDT","instId":"WET-USDT-SWAP","instIdCode":239628,"instType":"SWAP","lever":"20","listTime":"1765296000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7600","maxPlatOICoinLmt":"","maxPlatOILmt":"2700000","maxPxLmtPct":"0.3","maxStopSz":"7600","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"WET-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"WIF","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"WIF-USDT","instId":"WIF-USDT-SWAP","instIdCode":155700,"instType":"SWAP","lever":"50","listTime":"1713173100603","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"270000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"270000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"490000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"WIF-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"WLD","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"WLD-USDT","instId":"WLD-USDT-SWAP","instIdCode":127411,"instType":"SWAP","lever":"50","listTime":"1690199721595","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"360000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"360000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"6900000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"WLD-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"WLFI","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.05","instCategory":"1","instFamily":"WLFI-USDT","instId":"WLFI-USDT-SWAP","instIdCode":224581,"instType":"SWAP","lever":"50","listTime":"1755954000424","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"150000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"150000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"700000","posLmtPct":"25","preMktSwTime":"1756733400000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"WLFI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"WOO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"WOO-USDT","instId":"WOO-USDT-SWAP","instIdCode":114961,"instType":"SWAP","lever":"10","listTime":"1676357700337","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"29000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"29000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"WOO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"XLM","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"XLM-USDT","instId":"XLM-USDT-SWAP","instIdCode":10481,"instType":"SWAP","lever":"50","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"0.1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"5700","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"5700","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.1","openType":"call_auction","optType":"","posLmtAmt":"1900000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"XLM-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"XPL","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.05","instCategory":"1","instFamily":"XPL-USDT","instId":"XPL-USDT-SWAP","instIdCode":225095,"instType":"SWAP","lever":"50","listTime":"1756378800384","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"97000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"97000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"910000","posLmtPct":"25","preMktSwTime":"1758806400000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"XPL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"XRP","expTime":"","floatPxLmtPct":"0.01","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.02","instCategory":"1","instFamily":"XRP-USDT","instId":"XRP-USDT-SWAP","instIdCode":10471,"instType":"SWAP","lever":"100","listTime":"1573557408000","longPosRemainingQuota":"","lotSz":"0.01","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"16000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.02","maxStopSz":"16000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"0.01","openType":"call_auction","optType":"","posLmtAmt":"250000","posLmtPct":"30","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"XRP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"XTZ","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"XTZ-USDT","instId":"XTZ-USDT-SWAP","instIdCode":10549,"instType":"SWAP","lever":"20","listTime":"1587463971000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"22000","maxPlatOICoinLmt":"","maxPlatOILmt":"4600000","maxPxLmtPct":"0.3","maxStopSz":"22000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"XTZ-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"YB","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"YB-USDT","instId":"YB-USDT-SWAP","instIdCode":231478,"instType":"SWAP","lever":"20","listTime":"1760252400368","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"33000","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"33000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1760527800000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"YB-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"0.0001","ctValCcy":"YFI","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"YFI-USDT","instId":"YFI-USDT-SWAP","instIdCode":10551,"instType":"SWAP","lever":"20","listTime":"1599041571000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"46000","maxPlatOICoinLmt":"","maxPlatOILmt":"2900000","maxPxLmtPct":"0.3","maxStopSz":"46000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"1","tradeQuoteCcyList":[],"uly":"YFI-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1628240523000","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"YGG","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"YGG-USDT","instId":"YGG-USDT-SWAP","instIdCode":27541,"instType":"SWAP","lever":"10","listTime":"1628240400000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"520000","maxPlatOICoinLmt":"","maxPlatOILmt":"4000000","maxPxLmtPct":"0.3","maxStopSz":"520000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"YGG-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ZAMA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"ZAMA-USDT","instId":"ZAMA-USDT-SWAP","instIdCode":243639,"instType":"SWAP","lever":"20","listTime":"1767969000000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"21000","maxPlatOICoinLmt":"","maxPlatOILmt":"19900000","maxPxLmtPct":"0.3","maxStopSz":"21000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"540000","posLmtPct":"25","preMktSwTime":"1770039300000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ZAMA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ZBT","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.025","instCategory":"1","instFamily":"ZBT-USDT","instId":"ZBT-USDT-SWAP","instIdCode":232342,"instType":"SWAP","lever":"10","listTime":"1760700600342","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"85000","maxPlatOICoinLmt":"","maxPlatOILmt":"2100000","maxPxLmtPct":"0.3","maxStopSz":"85000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"1760707800000","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ZBT-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.01","ctValCcy":"ZEC","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZEC-USDT","instId":"ZEC-USDT-SWAP","instIdCode":234991,"instType":"SWAP","lever":"50","listTime":"1762398900578","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"100000","maxPlatOICoinLmt":"","maxPlatOILmt":"","maxPxLmtPct":"0.3","maxStopSz":"100000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"10000000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.01","tradeQuoteCcyList":[],"uly":"ZEC-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"0.1","ctValCcy":"ZEN","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZEN-USDT","instId":"ZEN-USDT-SWAP","instIdCode":234440,"instType":"SWAP","lever":"50","listTime":"1762149601773","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"17000","maxPlatOICoinLmt":"","maxPlatOILmt":"7200000","maxPxLmtPct":"0.3","maxStopSz":"17000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.001","tradeQuoteCcyList":[],"uly":"ZEN-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ZETA","expTime":"","floatPxLmtPct":"0.025","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZETA-USDT","instId":"ZETA-USDT-SWAP","instIdCode":146706,"instType":"SWAP","lever":"20","listTime":"1706757900607","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"36000","maxPlatOICoinLmt":"","maxPlatOILmt":"3100000","maxPxLmtPct":"0.3","maxStopSz":"36000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ZETA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"100","ctValCcy":"ZIL","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZIL-USDT","instId":"ZIL-USDT-SWAP","instIdCode":10557,"instType":"SWAP","lever":"20","listTime":"1599646371000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"22000","maxPlatOICoinLmt":"","maxPlatOILmt":"3600000","maxPxLmtPct":"0.3","maxStopSz":"22000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ZIL-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ZK","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZK-USDT","instId":"ZK-USDT-SWAP","instIdCode":162969,"instType":"SWAP","lever":"20","listTime":"1718699100579","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"110000","maxPlatOICoinLmt":"","maxPlatOILmt":"3900000","maxPxLmtPct":"0.3","maxStopSz":"110000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ZK-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ZKP","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZKP-USDT","instId":"ZKP-USDT-SWAP","instIdCode":243374,"instType":"SWAP","lever":"20","listTime":"1767793500000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"7400","maxPlatOICoinLmt":"","maxPlatOILmt":"2000000","maxPxLmtPct":"0.3","maxStopSz":"7400","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ZKP-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ZORA","expTime":"","floatPxLmtPct":"0.02","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZORA-USDT","instId":"ZORA-USDT-SWAP","instIdCode":230935,"instType":"SWAP","lever":"10","listTime":"1760095801229","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"81000","maxPlatOICoinLmt":"","maxPlatOILmt":"3200000","maxPxLmtPct":"0.3","maxStopSz":"81000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.000001","tradeQuoteCcyList":[],"uly":"ZORA-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"","ctMult":"1","ctType":"linear","ctVal":"1","ctValCcy":"ZRO","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZRO-USDT","instId":"ZRO-USDT-SWAP","instIdCode":163161,"instType":"SWAP","lever":"20","listTime":"1718886300653","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"21000","maxPlatOICoinLmt":"","maxPlatOILmt":"11300000","maxPxLmtPct":"0.3","maxStopSz":"21000","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"fix_price","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.0001","tradeQuoteCcyList":[],"uly":"ZRO-USDT","upcChg":[]},{"alias":"","auctionEndTime":"","baseCcy":"","category":"1","contTdSwTime":"1611916860000","ctMult":"1","ctType":"linear","ctVal":"10","ctValCcy":"ZRX","expTime":"","floatPxLmtPct":"0.015","freq":"","futureSettlement":false,"groupId":"4","initPxLmtPct":"0.04","instCategory":"1","instFamily":"ZRX-USDT","instId":"ZRX-USDT-SWAP","instIdCode":10558,"instType":"SWAP","lever":"20","listTime":"1598004771000","longPosRemainingQuota":"","lotSz":"1","maxIcebergSz":"100000000.0000000000000000","maxLmtAmt":"20000000","maxLmtSz":"100000000","maxMktAmt":"","maxMktSz":"4500","maxPlatOICoinLmt":"","maxPlatOILmt":"2100000","maxPxLmtPct":"0.3","maxStopSz":"4500","maxTriggerSz":"100000000.0000000000000000","maxTwapSz":"100000000.0000000000000000","method":"","minSz":"1","openType":"call_auction","optType":"","posLmtAmt":"350000","posLmtPct":"25","preMktSwTime":"","quoteCcy":"","rpiMinLevel":"2","rpiMinPxBand":"20","ruleType":"normal","seriesId":"","settleCcy":"USDT","shortPosRemainingQuota":"","state":"live","stk":"","tickSz":"0.00001","tradeQuoteCcyList":[],"uly":"ZRX-USDT","upcChg":[]}],"msg":""}
diff --git a/config/v2/captures/provenance.json b/config/v2/captures/provenance.json
index 02e3a3d2..c6611b8f 100644
--- a/config/v2/captures/provenance.json
+++ b/config/v2/captures/provenance.json
@@ -2,11 +2,20 @@
"captured_at_utc": "2026-08-29T05:06:21Z",
"captures": [
{
+ "appended_captures": [
+ {
+ "captured_at_utc": "2026-09-26T10:19:40Z",
+ "full_response_sha256": "f06f2a50f6273cc9c6334f8c6be318690803dbd23c16c4af1bd6acb0f9b21029",
+ "note": "verbatim rows of new universe symbols appended; earlier rows unchanged",
+ "symbols_added": 250,
+ "universe_revision": 1
+ }
+ ],
"captured_at_utc": "2026-08-29T05:06:21Z",
"endpoint": "https://fapi.binance.com/fapi/v1/exchangeInfo",
"filtered_capture": "config/v2/captures/binance-usdm-exchangeinfo.filtered.json",
- "filtered_capture_bytes": 6208,
- "filtered_capture_sha256": "7f7c387ed491887bd87803c68d2bb48a553d69a82490309bf16e26414a71f702",
+ "filtered_capture_bytes": 316769,
+ "filtered_capture_sha256": "f44322f960a78ce03a36242e2a00006a33838d3bc0ddd63a2a1f2dde0f999107",
"full_response_bytes": 1090684,
"full_response_sha256": "160c4857ad00a29a1156bbd0b2993a01cce6c227420a2e1a0d1a77b2c7b97a08",
"market": "USDM",
@@ -24,11 +33,20 @@
"venue": "BINANCE"
},
{
+ "appended_captures": [
+ {
+ "captured_at_utc": "2026-09-26T10:19:40Z",
+ "full_response_sha256": "9ba6abcda0b51fff7406d55a4d86e4ac23aa4cbcc7fa8138e4cdc124e327eace",
+ "note": "verbatim rows of new universe symbols appended; earlier rows unchanged",
+ "symbols_added": 250,
+ "universe_revision": 1
+ }
+ ],
"captured_at_utc": "2026-08-29T05:06:21Z",
"endpoint": "https://www.okx.com/api/v5/public/instruments?instType=SWAP",
"filtered_capture": "config/v2/captures/okx-instruments-swap.filtered.json",
- "filtered_capture_bytes": 5257,
- "filtered_capture_sha256": "506de7a36ec11912eb8d039ff245a8a42fe359a79b65ff9a2a1bc30dde74cfe0",
+ "filtered_capture_bytes": 274835,
+ "filtered_capture_sha256": "1f2f3a040600d175ca61bdb1b4b7fe5f5121a0e67e7077948368b43c1392ed38",
"full_response_bytes": 483705,
"full_response_sha256": "afa3702b14306fe75c5616259a758836dc236927a6d6c178df64247cdbc9f3f7",
"market": "SWAP",
diff --git a/config/v2/kn-v220-candidate-budget.json b/config/v2/kn-v220-candidate-budget.json
new file mode 100644
index 00000000..61aeda56
--- /dev/null
+++ b/config/v2/kn-v220-candidate-budget.json
@@ -0,0 +1,270 @@
+{
+ "schema": "qdl.kn.v220.candidate-budget.v1",
+ "frozen_at": "2026-09-23",
+ "refrozen": "2026-09-23 after Astra KN-1 review F5: the BAR cache row is sized contract-complete; the earlier 275 B compact row omitted coordinates, quality and provenance",
+ "source": "DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md#kn-plan-phase-1 (K1.4); guide upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-resources-and-latency",
+ "note": "Historical planning and allocator sections retain their original scope/status. Final deployed resource acceptance is in production_acceptance and the v2.2.0 certificate. Inherited latency/workload thresholds are unchanged; no threshold was relaxed to pass.",
+ "inherits": {
+ "path": "config/v2/v211-target-acceptance-budget.json",
+ "sha256": "473ea6b12f0d56278c3830ca6484e9129c4e9646de0021e3505395debf01baa8",
+ "unchanged": ["stages", "latency_ms", "latency_scope", "sample_rule", "requests", "streams", "cold", "startup", "probes", "final", "trading_system"]
+ },
+ "latency_quantities": {
+ "rule": "Owner rule 2026-09-18: every endpoint benchmark reports all four, with unit, measurement point and sample count.",
+ "request_latency": "SDK call in the consumer container until the decoded, validated result is usable; cold and warm connections reported separately",
+ "durable_event_age": "age of the served record at response time from the source/component/BAR-close timestamp named in the response",
+ "delivery_lag": "provider event (BAR: close time) to canonical publish; host receive and Kafka commit as sub-spans",
+ "end_to_end_cache": "provider event (BAR: close time) to the state being applied at the alpha/TS client"
+ },
+ "throughput_challenge": {
+ "canonical_events_per_s": 3000,
+ "rule": "canonical records from real capture or live, not raw frames or synthetic tiny events; accelerated replay is never reported as live freshness",
+ "measured_quiet_rate_per_s": 835,
+ "measured_burst_raw_per_s": 2749
+ },
+ "cpu": {
+ "steady_state_vcpu_max": 5.0,
+ "denominator": ["kafka1", "kafka2", "kafka3", "ingestors", "rust_core", "binance_bar_edge", "stream", "projector", "query", "control_redis", "market_cache"],
+ "excluded_and_reported_separately": ["trading_system", "alpha", "test_clients", "builds", "rollback_stack", "shadow_candidates"],
+ "baseline_measured": {
+ "evidence": "kn1-20260923/sizing/runtime.json",
+ "window": "60 samples x 10 s, 2026-09-23 18:21Z, quiet market, backlog drained",
+ "data_layer_vcpu_mean": 5.1,
+ "data_layer_vcpu_p95": 6.106,
+ "brokers_vcpu_mean": 2.0,
+ "note": "the running design already exceeds the 5.0 budget at a quiet rate; KN must remove work, not only stay equal"
+ },
+ "target_allocation_vcpu_unverified": {
+ "brokers": 2.0,
+ "ingestors": 0.4,
+ "rust_core": 0.9,
+ "binance_bar_edge": 0.05,
+ "stream_gateway_total": 0.4,
+ "projector_total": 0.4,
+ "query_total": 0.4,
+ "control_redis": 0.05,
+ "market_cache": 0.1,
+ "sum": 4.7,
+ "status": "hypothesis to verify in KN-2..KN-5; not a result - except projector_total, which is measured (projector_measured)",
+ "projector_measured": {
+ "status": "measured in the isolated KN-3 slice 10 full-flow run (real canonical capture + legacy import, 2 replicas, docker stats every 5 s); not production and not a soak",
+ "evidence": "/home/bobby/.local/state/qdl-v2/kn3-20260924/evidence: resources-cold-and-live.txt (sha256 d31d3d70dd2863005e2430df1878f9eb81c9e8db41f5b5e0ae8b5363b5d61ab2), resources-whole-run.txt (48cde5dfdf30ea85eee8fee80552fc11604bda5ac830a31de8c32a4a55458511)",
+ "replicas": 2,
+ "allocation_vcpu_per_replica": 0.5,
+ "allocation_rule": "each replica is allocated 0.5 vCPU (its CPU cap): the cold build is CPU-bound at that cap. projector_total counts the steady draw of both replicas at the 3,000/s challenge (0.376, rounded up to 0.4) against steady_state_vcpu_max; counting the two per-replica allocations instead (1.0) would make the sum 5.3, above 5.0",
+ "superseded": "projector 0.3 for both replicas (KN-1 hypothesis) is not met: 0.376 measured at the 3,000/s challenge",
+ "challenge_3000_per_s": {"window": "live 3,000/s real-capture challenge, 10 samples per replica", "two_replicas_vcpu_mean": 0.376, "replica_a_vcpu_mean": 0.125, "replica_b_vcpu_mean": 0.251, "replica_a_vcpu_max": 0.327, "replica_b_vcpu_max": 0.396},
+ "whole_run": {"samples": [809, 825], "replica_vcpu_p95": [0.337, 0.391], "replica_vcpu_max": [0.53, 0.522], "replica_rss_max_mib": [100.2, 173.3]},
+ "cold_build": {"samples": 24, "replica_a_vcpu_mean": 0.051, "replica_b_vcpu_mean": 0.426, "replica_a_vcpu_max": 0.506, "replica_b_vcpu_max": 0.522, "note": "CPU-bound at the 0.5 cap per replica (206 products READY in 162-179 s)"}
+ }
+ },
+ "shadow_exception": {
+ "max_actual_vcpu": 1.5,
+ "expires": "KN-5 exit",
+ "stop_conditions": ["host idle below 5 % for 60 s", "TS ready routes drop", "old projector group lag grows for 5 minutes"]
+ }
+ },
+ "kafka": {
+ "evidence": "kn1-20260923/sizing/kafka.json",
+ "canonical_retention_avg_bytes_per_s_per_broker": 374308,
+ "raw_retention_avg_bytes_per_s_per_broker": 308162,
+ "canonical_retention_ms": 21600000,
+ "partition_count": 6,
+ "partition_change_allowed": false,
+ "stream_reader_fetch_wait_ms_start": 10,
+ "note": "canonical carries the full raw envelope header and is larger than raw; removing it is out of KN scope (KD13)"
+ },
+ "payload_bytes_measured": {
+ "evidence": "kn1-20260923/sizing/payloads.json",
+ "canonical_protobuf_mean": {"TRADE": 546, "QUOTE": 570, "MARK_INDEX_PRICE": 685, "BAR": 709, "BOOK": 2160},
+ "book_canonical_max": 56495,
+ "public_json_row": {"BAR": 1932, "TRADE": 1415, "QUOTE": 1473, "MARK_INDEX_PRICE": 1350, "BOOK_SNAPSHOT_okx_doge": 39503},
+ "bar_compact_row": 255,
+ "bar_contract_complete_row": {"evidence": "kn1-20260923/sizing-r2/payloads.json (2,000 real final OKX DOGE 1m bars)", "lpk_derived_canonical_plus_state_trailer_mean": 682, "canonical_plus_state_trailer_mean": 735, "every_field_json_mean": 1662, "shared_key_decode_mismatches": 0, "superseded": "the R1 546 B identity-stripped row relied on a per-product header copied from one row; not lossless across schema/source/provider transitions (Astra R2)"}
+ },
+ "market_cache": {
+ "process": "separate Redis process and config from the control/quota/admission Redis (KD10)",
+ "image": "same redis image digest as stable_redis",
+ "bar_row_encoding": "contract-complete and lossless: the canonical EventEnvelope protobuf without only the LPK-derived fields (instrument uid, venue, market, bar interval), behind a 48-byte state trailer (source offset u64, materializer epoch u64, canonical content SHA-256). Those four are restored from the product's LPK, which is the cache key, so no header is stored; every other field (schema name/version, provider, source id/role, native symbol, instrument id/revision, values, revision, final, supersedes, times, sequences, quality, provenance) stays in the row. A row whose uid/venue/market/interval differ from its key is refused; decode is verified against the stored hash. Mixed-history test: schema, source, provider, role, symbol and instrument transitions plus a correction decode byte-exact with one key.",
+ "bar_layout": "per-product hash buckets of 112 opens in listpack encoding; open time in integer milliseconds (owner decision, Astra KN-3 review R1: changed together in the Rust writer, Python readback, flow checker, budget and tests). The bucket size is a sizing parameter: bucket bytes land in allocator size classes, so bytes/row moved between 743.1 and 850.0 across the measured sizes on the real mix (707 to 854 on the earlier DOGE sample). 112 is the lowest real-mix point and leaves about 1 % before the next allocator size class, so a mix with slightly larger rows can cross it",
+ "required_config": {"hash-max-listpack-entries": 128, "hash-max-listpack-value": 2048, "maxmemory-policy": "noeviction", "save": "", "appendonly": "no"},
+ "measured_bytes_per_bar_row": {
+ "real_mix_kn3": {
+ "evidence": "/home/bobby/.local/state/qdl-v2/kn3-20260924/evidence: bucket-size-sweep.txt (sha256 5375a0d20bee5379cf2f6b54f7f9ccdb7690bbca9d2c3c24e9c9ce033ad1daca), cache-sizing-cold.txt (9395fdc0a6e5fec37e702349b48d1ed0c8d6876a986e474607f147a66bcd16b7), cache-encoding.txt (3628b77a6f6b78da706941815016da57d6ad3a8f1feb9d828cc6fdf3f5183d61); KN-3 slice 10 isolated full-flow run on a real canonical capture plus the legacy import",
+ "sample": "one-variable bucket sweep over 280,762 real rows of 45 products, OKX + Binance, all intervals; Redis 7.2 stable_redis image digest; every bucket listpack",
+ "lpk_state_listpack_bucket112": 743.1,
+ "lpk_state_listpack_by_bucket": {"58": 817.2, "64": 769.0, "72": 794.7, "80": 772.5, "88": 745.5, "96": 850.0, "100": 819.4, "104": 788.2, "108": 759.0, "112": 743.1, "116": 816.9, "120": 816.6, "128": 768.6},
+ "size_class_margin_bucket112": "about 1 % before the next allocator size class",
+ "whole_cache_bucket116": {"bar_rows": 938061, "dataset_bytes_per_row": 823.7, "used_memory_bytes_per_row": 825.2, "binance_bucket_bytes_per_row": 836.2, "okx_bucket_bytes_per_row": 786.1, "binance_rows": 475896, "okx_rows": 462165, "encoding": "listpack only", "note": "all BAR products of the full flow at bucket 116, measured before the bucket change; not re-measured at 112"}
+ },
+ "doge_1m_kn1": {
+ "evidence": "kn1-20260923/sizing-r2/redis-buckets.json and redis-listpack2048.json (Redis 7.2.14, stable_redis image digest; 2,000 real final OKX DOGE 1m bars; max row 694 B); sizing-f5/redis-listpack512.json for the 512 result",
+ "status": "earlier single-product sample (OKX DOGE 1m only); kept for provenance, superseded for sizing by real_mix_kn3 (824 B/row whole cache at 116 vs 707.4 here)",
+ "lpk_state_listpack_bucket116": 707.4,
+ "lpk_state_listpack_bucket58": 708.1,
+ "lpk_state_listpack_by_bucket": {"40": 714.9, "48": 853.8, "56": 732.7, "58": 708.1, "64": 769.4, "72": 795.9, "80": 717.9, "96": 848.8, "112": 738.1, "116": 707.4, "120": 815.9, "128": 766.7}
+ },
+ "canonical_state_best_bucket64": 769.5,
+ "every_field_json_listpack_bucket64": 1793.7,
+ "canonical_hash_plus_zset": 935.6,
+ "public_json_hash_plus_zset": 2191.2,
+ "superseded_r1_identity_header_bucket64_not_lossless": 641.7,
+ "superseded_compact_listpack_bucket120_not_contract_complete": 275.2,
+ "with_hash_max_listpack_value_512": "every contract-complete encoding converts to hashtable; 512 is not a valid setting for this row"
+ },
+ "sizing": {
+ "demanded_bar_products": 141,
+ "demanded_rows_max": 1400500,
+ "retained_opens_cap_rule": "demanded rows + 2064 headroom per product (10,000 -> 12,064; VN 500 -> 2,564)",
+ "rows_at_cap": 1691524,
+ "bar_rows_bytes_at_cap": 1197000000,
+ "bytes_per_row_basis": "KN-1 figures: every byte figure in this block is rows_at_cap x measured_bytes_per_bar_row.doge_1m_kn1.lpk_state_listpack_bucket116 (707.4). The real mix costs more (real_mix_kn3: 743.1 at bucket 112, 823.7 whole cache at 116); the measured full-cap sizing and the adopted limits are sizing_measured_kn3_r1",
+ "other_structures_bytes": {"evidence": "kn1-20260923/sizing-f5/redis-keys.json (MEMORY USAGE of one string key per value size, LPK-length key)", "bar_identity_headers": 0, "latest_state_keys": 2100184, "empty_redis_baseline": 978880, "latest_rule": "67 demanded latest products (TRADE 11, QUOTE 10, MARK_INDEX_PRICE 10, BOOK_SNAPSHOT 18, BOOK_DELTA 18) at the largest observed canonical size + 48 B trailer; book 56,495 B bounds both book feeds", "header_rule": "none: the LPK-derived fields come from the key itself (R2); the R1 per-product header is withdrawn"},
+ "steady_bytes_at_cap": 1200000000,
+ "retained_today_rows": 933977,
+ "steady_bytes_today": 664000000,
+ "staging_rebuild": "per-product generation swap: a product is rebuilt into staging keys and published on its own, counted with the product's old generation until its keys are physically reclaimed, so the peak is steady plus two largest products (12,064 rows each: one staging, one old awaiting reclaim). A full staging generation beside the ready one would need about 2,400 MB, above maxmemory; that alternative needs an owner-approved RAM increase and is not taken by default.",
+ "largest_product_bytes": 8534000,
+ "peak_bytes_during_rebuild": 1217000000,
+ "rebuild_concurrency": "one product in staging at a time, and the next product starts only after the previous old generation is reclaimed; each additional concurrent product adds up to 2 x largest_product_bytes. A reader pinned to a swapped product detects the change and retries within its bound (contract section 5)",
+ "headroom_below_maxmemory_bytes": 72000000,
+ "fit_sensitivity": "fits only with the LPK row at an allocator-aligned bucket: at 64 opens (769.4 B/row) the cap is 1,305 MB and the full canonical row's best (769.5) also exceeds maxmemory. Headroom is 5.6 %. KN-3 sets each product's bucket size from its measured row size and re-measures every product before promotion",
+ "maxmemory_bytes": 1288490188,
+ "container_memory_limit_bytes": 1610612736,
+ "status": "KN-1 hypothesis (DOGE 1m row sample), superseded for KN-3 by sizing_measured_kn3_r1 below; kept unchanged for provenance"
+ },
+ "sizing_measured_kn3_r1": {
+ "status": "owner-approved candidate (Astra KN-3 review R1: bucket 112 and a higher cap after the recovery fixes). Measured at 1,537,810 rows (90.5 % of the cap): used_memory 1,162,574,104 B and the warm-rebuild peak 1,183,558,488 B are measurements; steady_bytes_at_cap and peak_bytes_during_rebuild at the full cap are extrapolated with the measured 756.0 B/row (Astra KN-3 review R2 wording). The production value is applied only by the production packet, never silently",
+ "evidence": "/home/bobby/.local/state/qdl-v2/kn3-20260924-r1/evidence (SHA256SUMS c8f2fde4b80f1c898f358cf33d8586c0f95804f6b9a28c9076f5fa80279cd88b): cold-build-full-cap.json, warm-rebuild-summary.json, synthetic-fill.json, generation-accounting.json",
+ "method": "isolated flow, bucket 112 projector, 2 replicas: real canonical capture + legacy import of 938,667 real rows, plus 599,143 synthetic rows (copies of each product's own rows re-timed to earlier opens, real row sizes, lineage kn3-synthetic-fill) up to the D15 cap where opens >= 0 allow it (long intervals cannot reach 12,064 opens after 1970)",
+ "rows_measured": 1537810,
+ "used_memory_measured_bytes": 1162574104,
+ "warm_rebuild_peak_measured_bytes": 1183558488,
+ "used_memory_rss_measured_bytes": 1154244608,
+ "bytes_per_row_all_structures": 756.0,
+ "rows_at_cap": 1699216,
+ "rows_at_cap_rule": "D15 on the current bundle: 140 x 12,064 + 1 x 4,064 + 3 x 2,064",
+ "steady_bytes_at_cap": 1284607296,
+ "at_cap_figures": "extrapolated: rows_at_cap x bytes_per_row_all_structures; peak = that + the measured warm-rebuild delta",
+ "warm_rebuild_peak_delta_measured_bytes": 20991944,
+ "warm_rebuild_rule": "rolling per-product rebuild (D21): one product in staging per replica, next staging after reclaim; measured peak = steady + 20,991,944 B over 206 products with 2 replicas (max 2 staged), 2,747 s, every product READY throughout, final memory = steady",
+ "peak_bytes_during_rebuild": 1305599240,
+ "maxmemory_bytes": 1500000000,
+ "headroom_below_maxmemory_bytes": 194400760,
+ "container_memory_limit_bytes": 1879048192,
+ "container_note": "1.75 GiB; Redis maxmemory is not the whole process memory (RSS 1,154 MB at 1,537,810 rows, fragmentation 0.98), so the container keeps about 570 MB above maxmemory",
+ "cpu_note": "the market cache reached its 0.5 vCPU cap during cold builds (mean 0.436); steady 0.1 is unchanged"
+ }
+ },
+ "native_stream_profiles": {
+ "decision": "Astra KN-2 R2, 2026-09-24: owner permits measured RAM increases after optimization; no runtime cap is changed by this file",
+ "measured_kn2": {"max_subscriptions": 384, "max_replay_rpcs": 32, "container_memory_mib": 256, "budgeted_mib": 247, "tested_subscriptions": 292, "observed_rss_mib": 127, "status": "isolated captured-provider fanout evidence, not production capacity"},
+ "capacity_candidate": {"max_subscriptions": 1024, "max_replay_rpcs": 32, "container_memory_mib": 384, "budgeted_mib": 307, "headroom_mib": 77, "status": "approved planning envelope, unmeasured at this concurrency; apply only in the relevant bounded phase packet"},
+ "rule": "Do not shrink target consumer demand to fit 256 MiB. Measure after reuse/optimization, reclaim superseded roles only after safe cutover, and report peak old-plus-new footprint. 320 MiB is an arithmetic fit with only 13 MiB headroom, not a capacity certificate. Decode factor eight is empirical, not a universal heap bound."
+ },
+ "retention": {
+ "bar_retained_opens_served": "the demanded rows of each product (10,000 for alpha crypto, 500 VN, 1,000 TS 1m inside the 10,000)",
+ "bar_retained_opens_headroom": 2064,
+ "bar_revision_audit": "append-only revision facts kept for every open inside the retained window; below the durable retention floor a tombstone is published",
+ "tombstone_lifetime_ms": 604800000,
+ "rebuild_horizon": "a cache generation offline longer than the tombstone lifetime never overlays a cache that may have missed deletes: every product is rebuilt from the state topics into a fresh generation and swapped one at a time (Astra KN-3 R1 D21; a partition with no served product is built as a whole)",
+ "state_topics": {
+ "md.latest.v2": {"cleanup.policy": "compact", "key": "logical product key", "partitions": 6, "replication_factor": 3, "min.insync.replicas": 2, "delete.retention.ms": 604800000, "segment.ms": 3600000, "segment.bytes": 134217728},
+ "md.bars.v2": {"cleanup.policy": "compact", "key": "binding|open_time_ms|revision", "partitions": 6, "replication_factor": 3, "min.insync.replicas": 2, "delete.retention.ms": 604800000, "min.compaction.lag.ms": 3600000, "segment.ms": 3600000, "segment.bytes": 134217728},
+ "segments": "Owner decision, Astra KN-3 review R1 (2026-09-24), state topics only (never md.canonical.v2): segment.ms 3,600,000 (= md.bars.v2 min.compaction.lag.ms) and segment.bytes 134,217,728. The active segment is never compacted; with the broker defaults (7 d / 1 GiB) a partition could hold up to 1 GiB of superseded facts and tombstones. KN-3 slice 10 (kn3-20260924/evidence/compaction-slope.txt) measured md.bars.v2 1,414,806,714 B after expiry tombstones -> 545,833,261 B once segments rolled and compacted. Cleaner lag and disk are still measured, not certified by this setting.",
+ "approval": "topic creation and ACLs are a separate KN-3 runtime packet"
+ },
+ "demand_only": "only products with manifest demand are materialized; provider wrappers keep serving bounded on-demand history outside the cache"
+ },
+ "universe_d48": {"status": "sizing for owner decision; no cap, maxmemory or retention is changed by this block", "products": 500, "interval": "1d", "universe_revision": 1, "rows_now": 497453, "rows_now_basis": "sum over 500 products of min(listing age in days, 12,064) at revision 1 (Binance 255,448, OKX 242,005; max age 2,473/2,604 d, median 740/683 d)", "bytes_per_row": 756.0, "bytes_now": 376000000, "growth_rows_per_year": 182500, "growth_bytes_per_year": 138000000, "rows_plus_3_years": 1044953, "bytes_plus_3_years": 790000000, "rows_at_d15_cap": 6032000, "bytes_at_d15_cap": 4560000000, "with_current_cache": "measured shadow cache before the universe 651 MB (2026-09-26) + 376 MB now = about 1.03 GB against maxmemory 1.5 GB; reaches about 1.29 GB in 3 years if the execution products stay at today's rows", "streams": "none: the universe is read with the daily batch warmup (deep_momentum polls daily); the 60-stream identity quota stays for execution QUOTE/L2/TRADE/MARK", "decision_needed": "retention for universe products: keep D15 (10,000 served + 2,064) or bound them (e.g. 2,500 served + 500), and when to raise maxmemory; measured before load, not assumed"},
+ "kn5_current_demand_measurement": {
+ "status": "MEASURED_CURRENT_DEMAND_NOT_FULL_RETENTION_CAP",
+ "evidence": "/home/bobby/.local/state/qdl-v2/kn5-astra-20260926/acceptance/cache-inventory.json",
+ "sha256": "4538c87600d1f2ecaea976db4071b798912968a8885d3e4017ed71f15a765b62",
+ "bar_rows": 1525787,
+ "daily_products": 510,
+ "additional_daily_products": 500,
+ "used_memory_bytes": 1171251296,
+ "rss_bytes": 1169522688,
+ "peak_used_memory_bytes": 1175775800,
+ "evicted_keys": 0,
+ "bytes_per_row_whole_cache": 767.637,
+ "steady_bytes_at_full_cap_extrapolated": 5934771209,
+ "shadow_maxmemory_bytes": 6500000000,
+ "shadow_container_limit_bytes": 7516192768,
+ "shadow_only": true,
+ "limits": [
+ "row mix and future depth affect allocator size classes",
+ "native per-product rebuild evidence inherited, not a new full-cap rebuild",
+ "all production memory settings unchanged",
+ "old stack and build/client resources excluded from this Redis measurement; report separately"
+ ]
+ },
+ "whole_cache_d48": {
+ "status": "FROZEN_ALLOCATOR_ENVELOPE_RUNTIME_ACCEPTANCE_PENDING",
+ "scope": "Execution/VN baseline PLUS 500 additional D48 daily BAR products, not universe alone. Source-only arithmetic; no runtime limit change.",
+ "served_rows_per_d48_product": 10000,
+ "retained_headroom_per_product": 2064,
+ "additional_d48_products": 500,
+ "baseline_rows_at_cap": 1699216,
+ "additional_rows_at_cap": 6032000,
+ "total_rows_at_cap": 7731216,
+ "bytes_per_row_basis": 756.0,
+ "bytes_per_row_is_measurement_on": "KN3 mixed capture/synthetic fill at 1,537,810 rows, not KN5 universe",
+ "steady_bytes_at_cap_extrapolated": 5844799296,
+ "staging_delta_bytes_inherited_measurement": 20991944,
+ "peak_bytes_at_cap_extrapolated": 5865791240,
+ "existing_candidate_maxmemory_bytes": 1500000000,
+ "existing_cap_fits_full_retention": false,
+ "excluded_unmeasured": [
+ "allocator/RSS fragmentation for expanded symbol mix",
+ "client output buffers and large batch replies",
+ "state-topic revision/tombstone disk growth",
+ "shadow plus old/new runtime overlap"
+ ],
+ "decision": "Keep 10,000 served rows. The kn5_full_capacity_allocator block supersedes this older extrapolation for the candidate memory envelope; production changes only in K5.3. Native replay, output buffers under actual load and post-cutover full-stack CPU remain separate gates. No silent truncation.",
+ "warmup_certification": "Coverage depends on listing/provider history. 10,000 is a supported limit, not invented 10,000 historical days for newly listed instruments."
+ },
+ "kn5_full_capacity_allocator": {
+ "status": "MEASURED_TEST_ONLY_ALLOCATOR_ENVELOPE",
+ "evidence": "/home/bobby/.local/state/qdl-v2/kn5-close-20260927/full-capacity.json",
+ "sha256": "ea682b78580480303e4582da70237aa2e7cfd770810e26cf735722ffca8b9a70",
+ "method": "synthetic layout fill using padded real canonical row size upper bounds",
+ "market_data_certificate": false,
+ "full_cap_rows": 7769216,
+ "products": 644,
+ "rows_per_product": 12064,
+ "conservative_scope": "All 644 catalog BAR products including disabled legacy at 12,064 each; exceeds demanded rows. 4 staging/retired product copies for 2 Stage-B owners.",
+ "steady_used_bytes": 6970460232,
+ "with_staging_used_bytes": 7013770760,
+ "with_staging_rss_bytes": 6757109760,
+ "evicted_keys": 0,
+ "padded_value_bytes_by_venue": {
+ "BINANCE": 819,
+ "OKX": 799
+ },
+ "candidate_maxmemory_bytes": 8000000000,
+ "candidate_container_memory_bytes": 9663676416,
+ "headroom_below_maxmemory_bytes": 986229240,
+ "headroom_above_maxmemory_bytes": 1663676416,
+ "previous_7gb_result": "TYPED_NOEVICTION_REFUSAL_DURING_STAGING_NOT_CONTAINER_OOM",
+ "production_mutation": false,
+ "limitations": [
+ "allocator/layout capacity only, not native Kafka replay or market correctness",
+ "future canonical payloads over the measured padded bound require resizing",
+ "no provider history was invented or served",
+ "Reserve headroom for latest values, client output buffers, allocator growth; monitor peak/RSS, no unbounded payload growth guarantee."
+ ]
+ },
+ "production_acceptance": {
+ "status": "MEASURED_BOUNDED_PRODUCTION_WORKLOAD",
+ "certificate": "upgrade/evidence/releases/v2.2.0/certificate.json",
+ "whole_stack_mean_vcpu": 4.668720898130555,
+ "matched_window_seconds": 374.414891175,
+ "whole_stack_gate_vcpu": 5.0,
+ "cache_maxmemory_bytes": 8000000000,
+ "cache_container_limit_bytes": 9663676416,
+ "sample_scope": "50 logical alpha workload plus actual TS60; synthetic full-cap allocator test is separate",
+ "resource_evidence_sha256": "bddbed2898452de60a876014c6303fa607f89e4242347eea0ddb6d51ef804e15"
+ }
+}
diff --git a/config/v2/provider-admission-policy-kn-bar-edge-v1.json b/config/v2/provider-admission-policy-kn-bar-edge-v1.json
new file mode 100644
index 00000000..77eb30da
--- /dev/null
+++ b/config/v2/provider-admission-policy-kn-bar-edge-v1.json
@@ -0,0 +1,108 @@
+{
+ "schema": "qdl.provider_admission.policy.v1",
+ "revision": 1,
+ "lanes": [
+ {
+ "lane": {
+ "provider": "BINANCE",
+ "market": "USDM",
+ "endpoint_family": "KLINES"
+ },
+ "policy": {
+ "token_capacity": 60,
+ "refill_tokens": 10,
+ "refill_interval_ns": 1000000000,
+ "max_inflight": 4,
+ "reserved_realtime_inflight": 1,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "BINANCE",
+ "market": "SPOT",
+ "endpoint_family": "KLINES"
+ },
+ "policy": {
+ "token_capacity": 150,
+ "refill_tokens": 25,
+ "refill_interval_ns": 1000000000,
+ "max_inflight": 4,
+ "reserved_realtime_inflight": 1,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "OKX",
+ "market": "SWAP",
+ "endpoint_family": "HISTORY_CANDLES"
+ },
+ "policy": {
+ "token_capacity": 5,
+ "refill_tokens": 5,
+ "refill_interval_ns": 2000000000,
+ "max_inflight": 2,
+ "reserved_realtime_inflight": 1,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "OKX",
+ "market": "SWAP",
+ "endpoint_family": "CANDLES"
+ },
+ "policy": {
+ "token_capacity": 5,
+ "refill_tokens": 5,
+ "refill_interval_ns": 2000000000,
+ "max_inflight": 2,
+ "reserved_realtime_inflight": 1,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "OKX",
+ "market": "SPOT",
+ "endpoint_family": "HISTORY_CANDLES"
+ },
+ "policy": {
+ "token_capacity": 5,
+ "refill_tokens": 5,
+ "refill_interval_ns": 2000000000,
+ "max_inflight": 2,
+ "reserved_realtime_inflight": 1,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "OKX",
+ "market": "SPOT",
+ "endpoint_family": "CANDLES"
+ },
+ "policy": {
+ "token_capacity": 5,
+ "refill_tokens": 5,
+ "refill_interval_ns": 2000000000,
+ "max_inflight": 2,
+ "reserved_realtime_inflight": 1,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ }
+ ]
+}
diff --git a/config/v2/provider-admission-policy-kn-reference-v1.json b/config/v2/provider-admission-policy-kn-reference-v1.json
new file mode 100644
index 00000000..a7eedd76
--- /dev/null
+++ b/config/v2/provider-admission-policy-kn-reference-v1.json
@@ -0,0 +1,57 @@
+{
+ "schema": "qdl.provider_admission.policy.v1",
+ "revision": 2,
+ "lanes": [
+ {
+ "lane": {
+ "provider": "BINANCE",
+ "market": "USDM",
+ "endpoint_family": "REFERENCE_NATIVE_BASIS"
+ },
+ "policy": {
+ "token_capacity": 1,
+ "refill_tokens": 1,
+ "refill_interval_ns": 1000000000,
+ "max_inflight": 1,
+ "reserved_realtime_inflight": 0,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "OKX",
+ "market": "SWAP",
+ "endpoint_family": "REFERENCE_CONTRACT_STATISTICS"
+ },
+ "policy": {
+ "token_capacity": 1,
+ "refill_tokens": 1,
+ "refill_interval_ns": 1000000000,
+ "max_inflight": 1,
+ "reserved_realtime_inflight": 0,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ },
+ {
+ "lane": {
+ "provider": "OKX",
+ "market": "FUTURES",
+ "endpoint_family": "REFERENCE_CONTRACT_STATISTICS"
+ },
+ "policy": {
+ "token_capacity": 1,
+ "refill_tokens": 1,
+ "refill_interval_ns": 1000000000,
+ "max_inflight": 1,
+ "reserved_realtime_inflight": 0,
+ "max_lease_ns": 30000000000,
+ "default_cooldown_ns": 60000000000,
+ "idle_ttl_ns": 600000000000
+ }
+ }
+ ]
+}
diff --git a/config/v2/stable-acquisition-bindings.yaml b/config/v2/stable-acquisition-bindings.yaml
index 0bf9dfc7..42c086b6 100644
--- a/config/v2/stable-acquisition-bindings.yaml
+++ b/config/v2/stable-acquisition-bindings.yaml
@@ -1,5 +1,5 @@
schema: qdl.v2.stable-acquisition-bindings.v1
-revision: 17
+revision: 19
topics:
raw: md.raw.realtime.v2
canonical: md.canonical.v2
@@ -35,25 +35,25 @@ bindings:
business_websocket_url: null
enabled: false
market_websocket_url: wss://stream.binance.com:9443/ws
-- binding_id: binance-usdm-bnbusdt-bar-12h
+- binding_id: binance-usdm-0gusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/12h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-15m
+- binding_id: binance-usdm-1000bonkusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/15m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-1d
+- binding_id: binance-usdm-1000flokiusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -62,242 +62,205 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-1h
+- binding_id: binance-usdm-1000pepeusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/1h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-1m
- mode: RUST_NATIVE
+- binding_id: binance-usdm-1000satsusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_bar
- native_channel: bnbusdt@kline_1m
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
- websocket_url: wss://fstream.binance.com/public/ws
+ websocket_url: null
business_websocket_url: null
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-bnbusdt-bar-1w
+ market_websocket_url: null
+- binding_id: binance-usdm-1000shibusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/1w
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-2h
+- binding_id: binance-usdm-1inchusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/2h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-30m
+- binding_id: binance-usdm-2zusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/30m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-3d
+- binding_id: binance-usdm-aaveusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/3d
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-3m
+- binding_id: binance-usdm-actusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/3m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-4h
+- binding_id: binance-usdm-acuusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/4h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-5m
+- binding_id: binance-usdm-adausdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/5m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-6h
+- binding_id: binance-usdm-aerousdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/6h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-bar-8h
+- binding_id: binance-usdm-aevousdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/8h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-bnbusdt-book_delta
- mode: RUST_NATIVE
+- binding_id: binance-usdm-agldusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: bnbusdt@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-bnbusdt-book_snapshot
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-aixbtusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: bnbusdt@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-bnbusdt-mark_index_price
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-algousdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_mark_index
- native_channel: bnbusdt@markPrice@1s
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
- websocket_url: wss://fstream.binance.com/public/ws
+ websocket_url: null
business_websocket_url: null
- mark_index:
- provider_protocol: BINANCE_MARK_PRICE
- index_native_symbol: null
- component_quiet_after_ms:
- BOTH: 5000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-bnbusdt-quote
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-allousdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_bbo
- native_channel: bnbusdt@bookTicker
- sequence_policy: MONOTONIC
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-bnbusdt-trade
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-animeusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_trade
- native_channel: bnbusdt@trade
- sequence_policy: MONOTONIC
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-260925-book_delta
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-apeusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: btcusdt_260925@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-260925-book_snapshot
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-api3usdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: btcusdt_260925@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-261225-book_delta
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-aprusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: btcusdt_261225@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-261225-book_snapshot
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-aptusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: btcusdt_261225@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-bar-12h
+ market_websocket_url: null
+- binding_id: binance-usdm-arbusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/12h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-15m
+- binding_id: binance-usdm-arkmusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/15m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-1d
+- binding_id: binance-usdm-arusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -306,168 +269,223 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-1h
+- binding_id: binance-usdm-arxusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/1h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-1m
- mode: RUST_NATIVE
+- binding_id: binance-usdm-asterusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_bar
- native_channel: btcusdt@kline_1m
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
- websocket_url: wss://fstream.binance.com/public/ws
+ websocket_url: null
business_websocket_url: null
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-bar-1w
+ market_websocket_url: null
+- binding_id: binance-usdm-athusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/1w
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-2h
+- binding_id: binance-usdm-atomusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/2h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-30m
+- binding_id: binance-usdm-atusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/30m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-3d
+- binding_id: binance-usdm-auctionusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/3d
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-3m
+- binding_id: binance-usdm-ausdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/3m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-4h
+- binding_id: binance-usdm-avaxusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/4h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-5m
+- binding_id: binance-usdm-avntusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/5m
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-6h
+- binding_id: binance-usdm-axsusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/6h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-bar-8h
+- binding_id: binance-usdm-aztecusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
- native_channel: rest-klines/8h
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-btcusdt-book_delta
- mode: RUST_NATIVE
+- binding_id: binance-usdm-babyusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: btcusdt@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-book_snapshot
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-bandusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: btcusdt@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-mark_index_price
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-bardusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_mark_index
- native_channel: btcusdt@markPrice@1s
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
- websocket_url: wss://fstream.binance.com/public/ws
+ websocket_url: null
business_websocket_url: null
- mark_index:
- provider_protocol: BINANCE_MARK_PRICE
- index_native_symbol: null
- component_quiet_after_ms:
- BOTH: 5000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-quote
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-basedusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_bbo
- native_channel: btcusdt@bookTicker
- sequence_policy: MONOTONIC
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-btcusdt-trade
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-batusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_trade
- native_channel: btcusdt@trade
- sequence_policy: MONOTONIC
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-dogeusdt-bar-12h
+ market_websocket_url: null
+- binding_id: binance-usdm-bchusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-beatusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-berausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-bicousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-bigtimeusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-billusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-biousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-blurusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-bnbusdt-bar-12h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -476,7 +494,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-15m
+- binding_id: binance-usdm-bnbusdt-bar-15m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -485,7 +503,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-1d
+- binding_id: binance-usdm-bnbusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -494,7 +512,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-1h
+- binding_id: binance-usdm-bnbusdt-bar-1h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -503,16 +521,16 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-1m
+- binding_id: binance-usdm-bnbusdt-bar-1m
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_bar
- native_channel: dogeusdt@kline_1m
+ native_channel: bnbusdt@kline_1m
sequence_policy: NONE
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-dogeusdt-bar-1w
+- binding_id: binance-usdm-bnbusdt-bar-1w
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -521,7 +539,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-2h
+- binding_id: binance-usdm-bnbusdt-bar-2h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -530,7 +548,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-30m
+- binding_id: binance-usdm-bnbusdt-bar-30m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -539,7 +557,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-3d
+- binding_id: binance-usdm-bnbusdt-bar-3d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -548,7 +566,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-3m
+- binding_id: binance-usdm-bnbusdt-bar-3m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -557,7 +575,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-4h
+- binding_id: binance-usdm-bnbusdt-bar-4h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -566,7 +584,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-5m
+- binding_id: binance-usdm-bnbusdt-bar-5m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -575,7 +593,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-6h
+- binding_id: binance-usdm-bnbusdt-bar-6h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -584,7 +602,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-bar-8h
+- binding_id: binance-usdm-bnbusdt-bar-8h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -593,11 +611,11 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-dogeusdt-book_delta
+- binding_id: binance-usdm-bnbusdt-book_delta
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: dogeusdt@depth@100ms
+ native_channel: bnbusdt@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -608,11 +626,11 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-dogeusdt-book_snapshot
+- binding_id: binance-usdm-bnbusdt-book_snapshot
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: dogeusdt@depth@100ms
+ native_channel: bnbusdt@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -623,71 +641,79 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-dogeusdt-mark_index_price
+- binding_id: binance-usdm-bnbusdt-mark_index_price
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_mark_index
- native_channel: dogeusdt@markPrice@1s
+ native_channel: bnbusdt@markPrice@1s
sequence_policy: NONE
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
mark_index:
provider_protocol: BINANCE_MARK_PRICE
index_native_symbol: null
component_quiet_after_ms:
BOTH: 5000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-dogeusdt-quote
+- binding_id: binance-usdm-bnbusdt-quote
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_bbo
- native_channel: dogeusdt@bookTicker
+ native_channel: bnbusdt@bookTicker
sequence_policy: MONOTONIC
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-dogeusdt-trade
+- binding_id: binance-usdm-bnbusdt-trade
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_trade
- native_channel: dogeusdt@trade
+ native_channel: bnbusdt@trade
sequence_policy: MONOTONIC
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-260925-book_delta
- mode: RUST_NATIVE
+- binding_id: binance-usdm-bomeusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: ethusdt_260925@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-260925-book_snapshot
- mode: RUST_NATIVE
+ market_websocket_url: null
+- binding_id: binance-usdm-brettusdt-bar-1d
+ mode: PYTHON_REST
runtime: BINANCE
- provider_kind: binance_usdm_book
- native_channel: ethusdt_260925@depth@100ms
- sequence_policy: CONTIGUOUS
- websocket_url: wss://fstream.binance.com/public/ws
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
business_websocket_url: null
- l2:
- provider_protocol: BINANCE_DIFF_DEPTH
- depth_per_side: 100
- rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
- snapshot_refresh_seconds: 30
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-261225-book_delta
+ market_websocket_url: null
+- binding_id: binance-usdm-brevusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-bsbusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-btcusdt-261225-book_delta
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: ethusdt_261225@depth@100ms
+ native_channel: btcusdt_261225@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -697,11 +723,11 @@ bindings:
rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
snapshot_refresh_seconds: 30
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-261225-book_snapshot
+- binding_id: binance-usdm-btcusdt-261225-book_snapshot
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: ethusdt_261225@depth@100ms
+ native_channel: btcusdt_261225@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -711,7 +737,7 @@ bindings:
rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
snapshot_refresh_seconds: 30
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-bar-12h
+- binding_id: binance-usdm-btcusdt-bar-12h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -720,7 +746,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-15m
+- binding_id: binance-usdm-btcusdt-bar-15m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -729,7 +755,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-1d
+- binding_id: binance-usdm-btcusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -738,7 +764,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-1h
+- binding_id: binance-usdm-btcusdt-bar-1h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -747,16 +773,16 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-1m
+- binding_id: binance-usdm-btcusdt-bar-1m
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_bar
- native_channel: ethusdt@kline_1m
+ native_channel: btcusdt@kline_1m
sequence_policy: NONE
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-bar-1w
+- binding_id: binance-usdm-btcusdt-bar-1w
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -765,7 +791,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-2h
+- binding_id: binance-usdm-btcusdt-bar-2h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -774,7 +800,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-30m
+- binding_id: binance-usdm-btcusdt-bar-30m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -783,7 +809,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-3d
+- binding_id: binance-usdm-btcusdt-bar-3d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -792,7 +818,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-3m
+- binding_id: binance-usdm-btcusdt-bar-3m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -801,7 +827,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-4h
+- binding_id: binance-usdm-btcusdt-bar-4h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -810,7 +836,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-5m
+- binding_id: binance-usdm-btcusdt-bar-5m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -819,7 +845,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-6h
+- binding_id: binance-usdm-btcusdt-bar-6h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -828,7 +854,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-bar-8h
+- binding_id: binance-usdm-btcusdt-bar-8h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -837,11 +863,11 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-ethusdt-book_delta
+- binding_id: binance-usdm-btcusdt-book_delta
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: ethusdt@depth@100ms
+ native_channel: btcusdt@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -852,11 +878,11 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-book_snapshot
+- binding_id: binance-usdm-btcusdt-book_snapshot
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: ethusdt@depth@100ms
+ native_channel: btcusdt@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -867,39 +893,138 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-mark_index_price
+- binding_id: binance-usdm-btcusdt-mark_index_price
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_mark_index
- native_channel: ethusdt@markPrice@1s
+ native_channel: btcusdt@markPrice@1s
sequence_policy: NONE
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
mark_index:
provider_protocol: BINANCE_MARK_PRICE
index_native_symbol: null
component_quiet_after_ms:
BOTH: 5000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-quote
+- binding_id: binance-usdm-btcusdt-quote
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_bbo
- native_channel: ethusdt@bookTicker
+ native_channel: btcusdt@bookTicker
sequence_policy: MONOTONIC
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-ethusdt-trade
+- binding_id: binance-usdm-btcusdt-trade
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_trade
- native_channel: ethusdt@trade
+ native_channel: btcusdt@trade
sequence_policy: MONOTONIC
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-solusdt-bar-12h
+- binding_id: binance-usdm-capusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ccusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-celousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-cfxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-chipusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-chzusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-coaiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-compusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-crvusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-cvxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-dashusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-dogeusdt-bar-12h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -908,7 +1033,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-15m
+- binding_id: binance-usdm-dogeusdt-bar-15m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -917,7 +1042,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-1d
+- binding_id: binance-usdm-dogeusdt-bar-1d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -926,7 +1051,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-1h
+- binding_id: binance-usdm-dogeusdt-bar-1h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -935,16 +1060,16 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-1m
+- binding_id: binance-usdm-dogeusdt-bar-1m
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_bar
- native_channel: solusdt@kline_1m
+ native_channel: dogeusdt@kline_1m
sequence_policy: NONE
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-solusdt-bar-1w
+- binding_id: binance-usdm-dogeusdt-bar-1w
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -953,7 +1078,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-2h
+- binding_id: binance-usdm-dogeusdt-bar-2h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -962,7 +1087,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-30m
+- binding_id: binance-usdm-dogeusdt-bar-30m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -971,7 +1096,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-3d
+- binding_id: binance-usdm-dogeusdt-bar-3d
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -980,7 +1105,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-3m
+- binding_id: binance-usdm-dogeusdt-bar-3m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -989,7 +1114,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-4h
+- binding_id: binance-usdm-dogeusdt-bar-4h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -998,7 +1123,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-5m
+- binding_id: binance-usdm-dogeusdt-bar-5m
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -1007,7 +1132,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-6h
+- binding_id: binance-usdm-dogeusdt-bar-6h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -1016,7 +1141,7 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-bar-8h
+- binding_id: binance-usdm-dogeusdt-bar-8h
mode: PYTHON_REST
runtime: BINANCE
provider_kind: binance_usdm_rest_bar
@@ -1025,11 +1150,11 @@ bindings:
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: binance-usdm-solusdt-book_delta
+- binding_id: binance-usdm-dogeusdt-book_delta
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: solusdt@depth@100ms
+ native_channel: dogeusdt@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -1040,11 +1165,11 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-solusdt-book_snapshot
+- binding_id: binance-usdm-dogeusdt-book_snapshot
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_book
- native_channel: solusdt@depth@100ms
+ native_channel: dogeusdt@depth@100ms
sequence_policy: CONTIGUOUS
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
@@ -1055,442 +1180,4842 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-solusdt-mark_index_price
+- binding_id: binance-usdm-dogeusdt-mark_index_price
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_mark_index
- native_channel: solusdt@markPrice@1s
+ native_channel: dogeusdt@markPrice@1s
sequence_policy: NONE
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
mark_index:
provider_protocol: BINANCE_MARK_PRICE
index_native_symbol: null
component_quiet_after_ms:
BOTH: 5000
- market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-solusdt-quote
+- binding_id: binance-usdm-dogeusdt-quote
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_bbo
- native_channel: solusdt@bookTicker
+ native_channel: dogeusdt@bookTicker
sequence_policy: MONOTONIC
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: binance-usdm-solusdt-trade
+- binding_id: binance-usdm-dogeusdt-trade
mode: RUST_NATIVE
runtime: BINANCE
provider_kind: binance_usdm_trade
- native_channel: solusdt@trade
+ native_channel: dogeusdt@trade
sequence_policy: MONOTONIC
websocket_url: wss://fstream.binance.com/public/ws
business_websocket_url: null
market_websocket_url: wss://fstream.binance.com/market/ws
-- binding_id: dnse-fpt-bar-1m
- mode: PYTHON_VENDOR_SDK
- runtime: DNSE
- provider_kind: dnse_bar
- native_channel: ohlcv/1m
+- binding_id: binance-usdm-doodusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: dnse-fpt-trade
- mode: PYTHON_VENDOR_SDK
- runtime: DNSE
- provider_kind: dnse_trade
- native_channel: trades
+- binding_id: binance-usdm-dosusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: dnse-vn30f1m-bar-1m
- mode: PYTHON_VENDOR_SDK
- runtime: DNSE
- provider_kind: dnse_bar
- native_channel: ohlcv/1m
+- binding_id: binance-usdm-dotusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: dnse-vn30f1m-trade
- mode: PYTHON_VENDOR_SDK
- runtime: DNSE
- provider_kind: dnse_trade
- native_channel: trades
+- binding_id: binance-usdm-dydxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
sequence_policy: NONE
websocket_url: null
business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-btc-usd-261225-book_delta
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+- binding_id: binance-usdm-edenusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-btc-usd-261225-book_snapshot
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+- binding_id: binance-usdm-edgeusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-btc-usd-270326-book_delta
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_book
- native_channel: books
+- binding_id: binance-usdm-egldusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-eigenusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-enausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-enjusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ensousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ensusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-espusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-etcusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethfiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-261225-book_delta
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_book
+ native_channel: ethusdt_261225@depth@100ms
sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
l2:
- provider_protocol: OKX_PUBLIC_BOOKS
+ provider_protocol: BINANCE_DIFF_DEPTH
depth_per_side: 100
- rest_snapshot_url: null
+ rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
+ snapshot_refresh_seconds: 30
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethusdt-261225-book_snapshot
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_book
+ native_channel: ethusdt_261225@depth@100ms
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ l2:
+ provider_protocol: BINANCE_DIFF_DEPTH
+ depth_per_side: 100
+ rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
+ snapshot_refresh_seconds: 30
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethusdt-bar-12h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/12h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-15m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/15m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-1h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-1m
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_bar
+ native_channel: ethusdt@kline_1m
+ sequence_policy: NONE
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethusdt-bar-1w
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1w
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-2h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/2h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-30m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/30m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-3d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/3d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-3m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/3m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-4h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/4h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-5m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/5m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-6h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/6h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-bar-8h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/8h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ethusdt-book_delta
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_book
+ native_channel: ethusdt@depth@100ms
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ l2:
+ provider_protocol: BINANCE_DIFF_DEPTH
+ depth_per_side: 100
+ rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethusdt-book_snapshot
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_book
+ native_channel: ethusdt@depth@100ms
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ l2:
+ provider_protocol: BINANCE_DIFF_DEPTH
+ depth_per_side: 100
+ rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethusdt-mark_index_price
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_mark_index
+ native_channel: ethusdt@markPrice@1s
+ sequence_policy: NONE
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+ mark_index:
+ provider_protocol: BINANCE_MARK_PRICE
+ index_native_symbol: null
+ component_quiet_after_ms:
+ BOTH: 5000
+- binding_id: binance-usdm-ethusdt-quote
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_bbo
+ native_channel: ethusdt@bookTicker
+ sequence_policy: MONOTONIC
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethusdt-trade
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_trade
+ native_channel: ethusdt@trade
+ sequence_policy: MONOTONIC
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-ethwusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-fartcoinusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-filusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-flowusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-fogousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-fusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-galausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-gasusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-giggleusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-glmusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-gmtusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-gmxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-gpsusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-gramusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-grassusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-grtusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-grvtusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-hbarusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-hmstrusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-homeusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-humausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-husdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-hypeusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-icpusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-imxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-initusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-injusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-iostusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-iotausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-irysusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-jellyjellyusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-jtousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-jupusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-kaitousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-katusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-kgenusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-kiteusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-kmnousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ksmusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-labusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-lausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-layerusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ldousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-lineausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-linkusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-litusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-lptusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-lqtyusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ltcusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-magicusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-manausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-maskusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-megausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-memeusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-merlusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-metisusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-metusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-meusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-mewusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-minausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-mmtusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-monusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-moodengusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-morphousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-moveusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-mubarakusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-nearusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-neirousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-neousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-nightusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-nmrusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-notusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ondousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-oneusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ontusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-onusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-opgusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-opnusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-opusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-orderusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ordiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-pendleusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-penguusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-peopleusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-pieverseusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-pippinusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-plumeusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-pnutusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-polusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-popcatusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-proveusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-pumpusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-pythusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-qntusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-qtumusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-raveusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-recallusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-renderusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-resolvusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-reusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-riverusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-robousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-rsrusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-rvnusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-saharausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-sandusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-sapienusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-seiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-sentusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-signusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-skyusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-slxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-snxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-12h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/12h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-15m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/15m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-1h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-1m
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_bar
+ native_channel: solusdt@kline_1m
+ sequence_policy: NONE
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-solusdt-bar-1w
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1w
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-2h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/2h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-30m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/30m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-3d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/3d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-3m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/3m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-4h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/4h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-5m
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/5m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-6h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/6h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-bar-8h
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/8h
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-solusdt-book_delta
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_book
+ native_channel: solusdt@depth@100ms
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ l2:
+ provider_protocol: BINANCE_DIFF_DEPTH
+ depth_per_side: 100
+ rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-solusdt-book_snapshot
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_book
+ native_channel: solusdt@depth@100ms
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ l2:
+ provider_protocol: BINANCE_DIFF_DEPTH
+ depth_per_side: 100
+ rest_snapshot_url: https://fapi.binance.com/fapi/v1/depth
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-solusdt-mark_index_price
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_mark_index
+ native_channel: solusdt@markPrice@1s
+ sequence_policy: NONE
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+ mark_index:
+ provider_protocol: BINANCE_MARK_PRICE
+ index_native_symbol: null
+ component_quiet_after_ms:
+ BOTH: 5000
+- binding_id: binance-usdm-solusdt-quote
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_bbo
+ native_channel: solusdt@bookTicker
+ sequence_policy: MONOTONIC
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-solusdt-trade
+ mode: RUST_NATIVE
+ runtime: BINANCE
+ provider_kind: binance_usdm_trade
+ native_channel: solusdt@trade
+ sequence_policy: MONOTONIC
+ websocket_url: wss://fstream.binance.com/public/ws
+ business_websocket_url: null
+ market_websocket_url: wss://fstream.binance.com/market/ws
+- binding_id: binance-usdm-soonusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-sophusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-spaceusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-spkusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-spxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ssvusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-stableusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-strkusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-stxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-suiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-susdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-sushiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-syrupusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-taousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-thetausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-tiausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-trbusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-triausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-trumpusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-trustusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-truthusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-trxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-turbousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ubusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-umausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-uniusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-uselessusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-vanausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-virtualusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-vvvusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-walusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-wctusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-wetusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-wifusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-wldusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-wlfiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-woousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-wusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-xlmusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-xplusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-xrpusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-xtzusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-ybusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-yfiusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-yggusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zamausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zbtusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zecusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zenusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zetausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zilusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zkpusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zkusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zorausdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zrousdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: binance-usdm-zrxusdt-bar-1d
+ mode: PYTHON_REST
+ runtime: BINANCE
+ provider_kind: binance_usdm_rest_bar
+ native_channel: rest-klines/1d
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: dnse-fpt-bar-1m
+ mode: PYTHON_VENDOR_SDK
+ runtime: DNSE
+ provider_kind: dnse_bar
+ native_channel: ohlcv/1m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: dnse-fpt-trade
+ mode: PYTHON_VENDOR_SDK
+ runtime: DNSE
+ provider_kind: dnse_trade
+ native_channel: trades
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: dnse-vn30f1m-bar-1m
+ mode: PYTHON_VENDOR_SDK
+ runtime: DNSE
+ provider_kind: dnse_bar
+ native_channel: ohlcv/1m
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: dnse-vn30f1m-trade
+ mode: PYTHON_VENDOR_SDK
+ runtime: DNSE
+ provider_kind: dnse_trade
+ native_channel: trades
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-futures-btc-usd-261225-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-btc-usd-261225-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-btc-usd-270326-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-btc-usd-270326-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-eth-usd-261225-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-eth-usd-261225-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-eth-usd-270326-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-futures-eth-usd-270326-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ market_websocket_url: null
+- binding_id: okx-spot-btcusdt-bar-1m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ enabled: false
+ market_websocket_url: null
+- binding_id: okx-spot-btcusdt-quote
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bbo
+ native_channel: bbo-tbt
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ enabled: false
+ market_websocket_url: null
+- binding_id: okx-spot-btcusdt-trade
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_trade
+ native_channel: trades
+ sequence_policy: MONOTONIC
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ enabled: false
+ market_websocket_url: null
+- binding_id: okx-swap-0g-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-1inch-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-2z-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-a-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-aave-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-act-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-acu-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ada-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-aero-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-aevo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-agld-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-aixbt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-algo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-allo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-anime-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ape-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-api3-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-apr-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-apt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ar-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-arb-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-arkm-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-arx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-aster-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-at-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ath-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-atom-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-auction-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-avax-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-avnt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-axs-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-aztec-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-baby-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-band-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bard-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-based-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bat-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bch-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-beat-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bera-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bico-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bigtime-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bill-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bio-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-blur-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-12h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle12Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-15m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle15m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-1d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-1h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-1m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-1w
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Wutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-2d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-2h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-30m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle30m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-3d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-3m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-4h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle4H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-5m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle5m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-bar-6h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle6Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-mark_index_price
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_mark_index
+ native_channel: mark-price
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+ mark_index:
+ provider_protocol: OKX_MARK_INDEX
+ index_native_symbol: BNB-USDT
+ component_quiet_after_ms:
+ MARK: 15000
+ INDEX: 70000
+- binding_id: okx-swap-bnb-usdt-swap-quote
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bbo
+ native_channel: bbo-tbt
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bnb-usdt-swap-trade
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_trade
+ native_channel: trades
+ sequence_policy: MONOTONIC
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-bome-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bonk-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-brett-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-brev-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-bsb-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-12h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle12Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-15m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle15m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-1d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-1h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-1w
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Wutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-2d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-2h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-30m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle30m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-3d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-3m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-4h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle4H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-5m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle5m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-bar-6h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle6Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-btc-usdt-swap-mark_index_price
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_mark_index
+ native_channel: mark-price
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+ mark_index:
+ provider_protocol: OKX_MARK_INDEX
+ index_native_symbol: BTC-USDT
+ component_quiet_after_ms:
+ MARK: 15000
+ INDEX: 70000
+- binding_id: okx-swap-btcusdt-bar-1m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btcusdt-quote
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bbo
+ native_channel: bbo-tbt
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-btcusdt-trade
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_trade
+ native_channel: trades
+ sequence_policy: MONOTONIC
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-cap-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-cc-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-celo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-cfx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-chip-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-chz-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-coai-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-comp-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-crv-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-cvx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-dash-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-12h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle12Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-15m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle15m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-1d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-1h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-1m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-1w
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Wutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-2d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-2h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-30m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle30m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-3d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-3m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-4h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle4H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-5m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle5m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-bar-6h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle6Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-mark_index_price
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_mark_index
+ native_channel: mark-price
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+ mark_index:
+ provider_protocol: OKX_MARK_INDEX
+ index_native_symbol: DOGE-USDT
+ component_quiet_after_ms:
+ MARK: 15000
+ INDEX: 70000
+- binding_id: okx-swap-doge-usdt-swap-quote
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bbo
+ native_channel: bbo-tbt
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-doge-usdt-swap-trade
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_trade
+ native_channel: trades
+ sequence_policy: MONOTONIC
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-dood-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-dos-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-dot-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-dydx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-eden-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-edge-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-egld-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-eigen-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ena-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-enj-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ens-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-enso-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-esp-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-etc-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-12h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle12Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-15m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle15m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-1d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-1h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-1m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-1w
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Wutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-2d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-2h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle2H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-30m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle30m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-3d
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3Dutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-3m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle3m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-4h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle4H
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-5m
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle5m
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-bar-6h
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle6Hutc
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-book_delta
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-book_snapshot
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_book
+ native_channel: books
+ sequence_policy: CONTIGUOUS
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ l2:
+ provider_protocol: OKX_PUBLIC_BOOKS
+ depth_per_side: 100
+ rest_snapshot_url: null
+ snapshot_refresh_seconds: 30
+ materialized_snapshot_interval_ms: 1000
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-mark_index_price
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_mark_index
+ native_channel: mark-price
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+ mark_index:
+ provider_protocol: OKX_MARK_INDEX
+ index_native_symbol: ETH-USDT
+ component_quiet_after_ms:
+ MARK: 15000
+ INDEX: 70000
+- binding_id: okx-swap-eth-usdt-swap-quote
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_bbo
+ native_channel: bbo-tbt
+ sequence_policy: NONE
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-eth-usdt-swap-trade
+ mode: RUST_NATIVE
+ runtime: OKX
+ provider_kind: okx_trade
+ native_channel: trades
+ sequence_policy: MONOTONIC
+ websocket_url: wss://ws.okx.com:8443/ws/v5/public
+ business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
+- binding_id: okx-swap-ethfi-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ethw-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-f-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-fartcoin-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-fil-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-floki-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-flow-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-fogo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-gala-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-gas-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-giggle-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-glm-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-gmt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-gmx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-gps-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-gram-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-grass-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-grt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-grvt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-h-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-hbar-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-hmstr-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-home-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-huma-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-hype-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-icp-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-imx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-init-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-inj-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-iost-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-iota-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-irys-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-jellyjelly-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-jto-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-jup-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-kaito-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-kat-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-kgen-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-kite-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-kmno-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ksm-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-la-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-lab-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-layer-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ldo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-linea-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-link-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-lit-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-lpt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-lqty-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ltc-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-magic-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mana-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mask-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-me-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mega-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-meme-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-merl-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-met-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-metis-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mew-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mina-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mmt-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mon-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-moodeng-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-morpho-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-move-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-mubarak-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-near-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-neiro-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-neo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-night-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-nmr-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-not-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-o-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-on-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ondo-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-one-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ont-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-op-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-opg-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-opn-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-order-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-ordi-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-pendle-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-pengu-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-people-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-pepe-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-pieverse-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-pippin-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-plume-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-pnut-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-btc-usd-270326-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-pol-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-eth-usd-261225-book_delta
- mode: RUST_NATIVE
+- binding_id: okx-swap-popcat-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-eth-usd-261225-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-prove-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-eth-usd-270326-book_delta
- mode: RUST_NATIVE
+- binding_id: okx-swap-pump-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-futures-eth-usd-270326-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-pyth-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-spot-btcusdt-bar-1m
- mode: RUST_NATIVE
+- binding_id: okx-swap-qnt-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- enabled: false
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-spot-btcusdt-quote
- mode: RUST_NATIVE
+- binding_id: okx-swap-qtum-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_bbo
- native_channel: bbo-tbt
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- enabled: false
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-spot-btcusdt-trade
- mode: RUST_NATIVE
+- binding_id: okx-swap-rave-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_trade
- native_channel: trades
- sequence_policy: MONOTONIC
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- enabled: false
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-12h
- mode: RUST_NATIVE
+- binding_id: okx-swap-re-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle12Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-15m
- mode: RUST_NATIVE
+- binding_id: okx-swap-recall-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle15m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-1d
- mode: RUST_NATIVE
+- binding_id: okx-swap-render-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-1h
- mode: RUST_NATIVE
+- binding_id: okx-swap-resolv-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-1m
- mode: RUST_NATIVE
+- binding_id: okx-swap-river-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-1w
- mode: RUST_NATIVE
+- binding_id: okx-swap-robo-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1Wutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-2d
- mode: RUST_NATIVE
+- binding_id: okx-swap-rsr-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-2h
- mode: RUST_NATIVE
+- binding_id: okx-swap-rvn-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-30m
- mode: RUST_NATIVE
+- binding_id: okx-swap-s-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle30m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-3d
- mode: RUST_NATIVE
+- binding_id: okx-swap-sahara-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-3m
- mode: RUST_NATIVE
+- binding_id: okx-swap-sand-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-4h
- mode: RUST_NATIVE
+- binding_id: okx-swap-sapien-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-sats-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-sei-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-sent-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle4H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-5m
- mode: RUST_NATIVE
+- binding_id: okx-swap-shib-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle5m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-bar-6h
- mode: RUST_NATIVE
+- binding_id: okx-swap-sign-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle6Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-book_delta
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-sky-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-mark_index_price
- mode: RUST_NATIVE
+- binding_id: okx-swap-slx-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_mark_index
- native_channel: mark-price
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- mark_index:
- provider_protocol: OKX_MARK_INDEX
- index_native_symbol: BNB-USDT
- component_quiet_after_ms:
- MARK: 15000
- INDEX: 70000
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-quote
- mode: RUST_NATIVE
+- binding_id: okx-swap-snx-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_bbo
- native_channel: bbo-tbt
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-bnb-usdt-swap-trade
+- binding_id: okx-swap-sol-usdt-swap-bar-12h
mode: RUST_NATIVE
runtime: OKX
- provider_kind: okx_trade
- native_channel: trades
- sequence_policy: MONOTONIC
+ provider_kind: okx_bar
+ native_channel: candle12Hutc
+ sequence_policy: NONE
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-12h
+- binding_id: okx-swap-sol-usdt-swap-bar-15m
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
- native_channel: candle12Hutc
+ native_channel: candle15m
sequence_policy: NONE
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-15m
+- binding_id: okx-swap-sol-usdt-swap-bar-1d
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
- native_channel: candle15m
+ native_channel: candle1Dutc
sequence_policy: NONE
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-1d
+- binding_id: okx-swap-sol-usdt-swap-bar-1h
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1Dutc
+ native_channel: candle1H
sequence_policy: NONE
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-1h
+- binding_id: okx-swap-sol-usdt-swap-bar-1m
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1H
+ native_channel: candle1m
sequence_policy: NONE
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-1w
+- binding_id: okx-swap-sol-usdt-swap-bar-1w
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1499,7 +6024,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-2d
+- binding_id: okx-swap-sol-usdt-swap-bar-2d
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1508,7 +6033,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-2h
+- binding_id: okx-swap-sol-usdt-swap-bar-2h
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1517,7 +6042,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-30m
+- binding_id: okx-swap-sol-usdt-swap-bar-30m
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1526,7 +6051,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-3d
+- binding_id: okx-swap-sol-usdt-swap-bar-3d
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1535,7 +6060,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-3m
+- binding_id: okx-swap-sol-usdt-swap-bar-3m
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1544,7 +6069,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-4h
+- binding_id: okx-swap-sol-usdt-swap-bar-4h
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1553,7 +6078,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-5m
+- binding_id: okx-swap-sol-usdt-swap-bar-5m
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1562,7 +6087,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-bar-6h
+- binding_id: okx-swap-sol-usdt-swap-bar-6h
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bar
@@ -1571,7 +6096,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-book_delta
+- binding_id: okx-swap-sol-usdt-swap-book_delta
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_book
@@ -1586,7 +6111,7 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-book_snapshot
+- binding_id: okx-swap-sol-usdt-swap-book_snapshot
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_book
@@ -1601,7 +6126,7 @@ bindings:
snapshot_refresh_seconds: 30
materialized_snapshot_interval_ms: 1000
market_websocket_url: null
-- binding_id: okx-swap-btc-usdt-swap-mark_index_price
+- binding_id: okx-swap-sol-usdt-swap-mark_index_price
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_mark_index
@@ -1609,23 +6134,14 @@ bindings:
sequence_policy: NONE
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ market_websocket_url: null
mark_index:
provider_protocol: OKX_MARK_INDEX
- index_native_symbol: BTC-USDT
+ index_native_symbol: SOL-USDT
component_quiet_after_ms:
MARK: 15000
INDEX: 70000
- market_websocket_url: null
-- binding_id: okx-swap-btcusdt-bar-1m
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_bar
- native_channel: candle1m
- sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- market_websocket_url: null
-- binding_id: okx-swap-btcusdt-quote
+- binding_id: okx-swap-sol-usdt-swap-quote
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_bbo
@@ -1634,7 +6150,7 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-btcusdt-trade
+- binding_id: okx-swap-sol-usdt-swap-trade
mode: RUST_NATIVE
runtime: OKX
provider_kind: okx_trade
@@ -1643,570 +6159,498 @@ bindings:
websocket_url: wss://ws.okx.com:8443/ws/v5/public
business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-12h
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_bar
- native_channel: candle12Hutc
- sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-15m
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_bar
- native_channel: candle15m
- sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-1d
- mode: RUST_NATIVE
+- binding_id: okx-swap-soon-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-1h
- mode: RUST_NATIVE
- runtime: OKX
- provider_kind: okx_bar
- native_channel: candle1H
- sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-1m
- mode: RUST_NATIVE
+- binding_id: okx-swap-soph-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-1w
- mode: RUST_NATIVE
+- binding_id: okx-swap-space-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1Wutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-2d
- mode: RUST_NATIVE
+- binding_id: okx-swap-spk-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-2h
- mode: RUST_NATIVE
+- binding_id: okx-swap-spx-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-30m
- mode: RUST_NATIVE
+- binding_id: okx-swap-ssv-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle30m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-3d
- mode: RUST_NATIVE
+- binding_id: okx-swap-stable-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-3m
- mode: RUST_NATIVE
+- binding_id: okx-swap-strk-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-4h
- mode: RUST_NATIVE
+- binding_id: okx-swap-stx-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle4H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-5m
- mode: RUST_NATIVE
+- binding_id: okx-swap-sui-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle5m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-bar-6h
- mode: RUST_NATIVE
+- binding_id: okx-swap-sushi-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle6Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-book_delta
- mode: RUST_NATIVE
+- binding_id: okx-swap-syrup-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-tao-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-mark_index_price
- mode: RUST_NATIVE
+- binding_id: okx-swap-theta-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_mark_index
- native_channel: mark-price
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- mark_index:
- provider_protocol: OKX_MARK_INDEX
- index_native_symbol: DOGE-USDT
- component_quiet_after_ms:
- MARK: 15000
- INDEX: 70000
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-quote
- mode: RUST_NATIVE
+- binding_id: okx-swap-tia-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_bbo
- native_channel: bbo-tbt
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-doge-usdt-swap-trade
- mode: RUST_NATIVE
+- binding_id: okx-swap-trb-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_trade
- native_channel: trades
- sequence_policy: MONOTONIC
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-12h
- mode: RUST_NATIVE
+- binding_id: okx-swap-tria-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle12Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-15m
- mode: RUST_NATIVE
+- binding_id: okx-swap-trump-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle15m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-1d
- mode: RUST_NATIVE
+- binding_id: okx-swap-trust-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-1h
- mode: RUST_NATIVE
+- binding_id: okx-swap-truth-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-1m
- mode: RUST_NATIVE
+- binding_id: okx-swap-trx-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-1w
- mode: RUST_NATIVE
+- binding_id: okx-swap-turbo-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1Wutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-2d
- mode: RUST_NATIVE
+- binding_id: okx-swap-ub-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-2h
- mode: RUST_NATIVE
+- binding_id: okx-swap-uma-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-30m
- mode: RUST_NATIVE
+- binding_id: okx-swap-uni-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle30m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-3d
- mode: RUST_NATIVE
+- binding_id: okx-swap-useless-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-3m
- mode: RUST_NATIVE
+- binding_id: okx-swap-vana-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-4h
- mode: RUST_NATIVE
+- binding_id: okx-swap-virtual-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle4H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-5m
- mode: RUST_NATIVE
+- binding_id: okx-swap-vvv-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle5m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-bar-6h
- mode: RUST_NATIVE
+- binding_id: okx-swap-w-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle6Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-book_delta
- mode: RUST_NATIVE
+- binding_id: okx-swap-wal-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-wct-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-mark_index_price
- mode: RUST_NATIVE
+- binding_id: okx-swap-wet-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_mark_index
- native_channel: mark-price
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- mark_index:
- provider_protocol: OKX_MARK_INDEX
- index_native_symbol: ETH-USDT
- component_quiet_after_ms:
- MARK: 15000
- INDEX: 70000
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-quote
- mode: RUST_NATIVE
+- binding_id: okx-swap-wif-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_bbo
- native_channel: bbo-tbt
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-eth-usdt-swap-trade
- mode: RUST_NATIVE
+- binding_id: okx-swap-wld-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_trade
- native_channel: trades
- sequence_policy: MONOTONIC
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-12h
- mode: RUST_NATIVE
+- binding_id: okx-swap-wlfi-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle12Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-15m
- mode: RUST_NATIVE
+- binding_id: okx-swap-woo-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle15m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-1d
- mode: RUST_NATIVE
+- binding_id: okx-swap-xlm-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-1h
- mode: RUST_NATIVE
+- binding_id: okx-swap-xpl-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-1m
- mode: RUST_NATIVE
+- binding_id: okx-swap-xrp-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-1w
- mode: RUST_NATIVE
+- binding_id: okx-swap-xtz-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle1Wutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-2d
- mode: RUST_NATIVE
+- binding_id: okx-swap-yb-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-2h
- mode: RUST_NATIVE
+- binding_id: okx-swap-yfi-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle2H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-30m
- mode: RUST_NATIVE
+- binding_id: okx-swap-ygg-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle30m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-3d
- mode: RUST_NATIVE
+- binding_id: okx-swap-zama-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3Dutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-3m
- mode: RUST_NATIVE
+- binding_id: okx-swap-zbt-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle3m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-4h
- mode: RUST_NATIVE
+- binding_id: okx-swap-zec-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle4H
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-5m
- mode: RUST_NATIVE
+- binding_id: okx-swap-zen-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle5m
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-bar-6h
- mode: RUST_NATIVE
+- binding_id: okx-swap-zeta-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
provider_kind: okx_bar
- native_channel: candle6Hutc
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-book_delta
- mode: RUST_NATIVE
+- binding_id: okx-swap-zil-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-book_snapshot
- mode: RUST_NATIVE
+- binding_id: okx-swap-zk-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_book
- native_channel: books
- sequence_policy: CONTIGUOUS
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- l2:
- provider_protocol: OKX_PUBLIC_BOOKS
- depth_per_side: 100
- rest_snapshot_url: null
- snapshot_refresh_seconds: 30
- materialized_snapshot_interval_ms: 1000
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-mark_index_price
- mode: RUST_NATIVE
+- binding_id: okx-swap-zkp-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_mark_index
- native_channel: mark-price
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
- mark_index:
- provider_protocol: OKX_MARK_INDEX
- index_native_symbol: SOL-USDT
- component_quiet_after_ms:
- MARK: 15000
- INDEX: 70000
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-quote
- mode: RUST_NATIVE
+- binding_id: okx-swap-zora-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_bbo
- native_channel: bbo-tbt
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
sequence_policy: NONE
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
-- binding_id: okx-swap-sol-usdt-swap-trade
- mode: RUST_NATIVE
+- binding_id: okx-swap-zro-usdt-swap-bar-1d
+ mode: PYTHON_REST
runtime: OKX
- provider_kind: okx_trade
- native_channel: trades
- sequence_policy: MONOTONIC
- websocket_url: wss://ws.okx.com:8443/ws/v5/public
- business_websocket_url: wss://ws.okx.com:8443/ws/v5/business
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
+ market_websocket_url: null
+- binding_id: okx-swap-zrx-usdt-swap-bar-1d
+ mode: PYTHON_REST
+ runtime: OKX
+ provider_kind: okx_bar
+ native_channel: candle1Dutc
+ sequence_policy: NONE
+ websocket_url: null
+ business_websocket_url: null
market_websocket_url: null
diff --git a/config/v2/stable-authority-promotion-scope.yaml b/config/v2/stable-authority-promotion-scope.yaml
index 202be886..39c1adeb 100644
--- a/config/v2/stable-authority-promotion-scope.yaml
+++ b/config/v2/stable-authority-promotion-scope.yaml
@@ -1,6 +1,56 @@
schema: qdl.v2.authority-promotion-scope.v1
-revision: 8
+revision: 10
binding_ids:
+- binance-usdm-0gusdt-bar-1d
+- binance-usdm-1000bonkusdt-bar-1d
+- binance-usdm-1000flokiusdt-bar-1d
+- binance-usdm-1000pepeusdt-bar-1d
+- binance-usdm-1000satsusdt-bar-1d
+- binance-usdm-1000shibusdt-bar-1d
+- binance-usdm-1inchusdt-bar-1d
+- binance-usdm-2zusdt-bar-1d
+- binance-usdm-aaveusdt-bar-1d
+- binance-usdm-actusdt-bar-1d
+- binance-usdm-acuusdt-bar-1d
+- binance-usdm-adausdt-bar-1d
+- binance-usdm-aerousdt-bar-1d
+- binance-usdm-aevousdt-bar-1d
+- binance-usdm-agldusdt-bar-1d
+- binance-usdm-aixbtusdt-bar-1d
+- binance-usdm-algousdt-bar-1d
+- binance-usdm-allousdt-bar-1d
+- binance-usdm-animeusdt-bar-1d
+- binance-usdm-apeusdt-bar-1d
+- binance-usdm-api3usdt-bar-1d
+- binance-usdm-aprusdt-bar-1d
+- binance-usdm-aptusdt-bar-1d
+- binance-usdm-arbusdt-bar-1d
+- binance-usdm-arkmusdt-bar-1d
+- binance-usdm-arusdt-bar-1d
+- binance-usdm-arxusdt-bar-1d
+- binance-usdm-asterusdt-bar-1d
+- binance-usdm-athusdt-bar-1d
+- binance-usdm-atomusdt-bar-1d
+- binance-usdm-atusdt-bar-1d
+- binance-usdm-auctionusdt-bar-1d
+- binance-usdm-ausdt-bar-1d
+- binance-usdm-avaxusdt-bar-1d
+- binance-usdm-avntusdt-bar-1d
+- binance-usdm-axsusdt-bar-1d
+- binance-usdm-aztecusdt-bar-1d
+- binance-usdm-babyusdt-bar-1d
+- binance-usdm-bandusdt-bar-1d
+- binance-usdm-bardusdt-bar-1d
+- binance-usdm-basedusdt-bar-1d
+- binance-usdm-batusdt-bar-1d
+- binance-usdm-bchusdt-bar-1d
+- binance-usdm-beatusdt-bar-1d
+- binance-usdm-berausdt-bar-1d
+- binance-usdm-bicousdt-bar-1d
+- binance-usdm-bigtimeusdt-bar-1d
+- binance-usdm-billusdt-bar-1d
+- binance-usdm-biousdt-bar-1d
+- binance-usdm-blurusdt-bar-1d
- binance-usdm-bnbusdt-bar-12h
- binance-usdm-bnbusdt-bar-15m
- binance-usdm-bnbusdt-bar-1d
@@ -20,8 +70,10 @@ binding_ids:
- binance-usdm-bnbusdt-mark_index_price
- binance-usdm-bnbusdt-quote
- binance-usdm-bnbusdt-trade
-- binance-usdm-btcusdt-260925-book_delta
-- binance-usdm-btcusdt-260925-book_snapshot
+- binance-usdm-bomeusdt-bar-1d
+- binance-usdm-brettusdt-bar-1d
+- binance-usdm-brevusdt-bar-1d
+- binance-usdm-bsbusdt-bar-1d
- binance-usdm-btcusdt-261225-book_delta
- binance-usdm-btcusdt-261225-book_snapshot
- binance-usdm-btcusdt-bar-12h
@@ -43,6 +95,17 @@ binding_ids:
- binance-usdm-btcusdt-mark_index_price
- binance-usdm-btcusdt-quote
- binance-usdm-btcusdt-trade
+- binance-usdm-capusdt-bar-1d
+- binance-usdm-ccusdt-bar-1d
+- binance-usdm-celousdt-bar-1d
+- binance-usdm-cfxusdt-bar-1d
+- binance-usdm-chipusdt-bar-1d
+- binance-usdm-chzusdt-bar-1d
+- binance-usdm-coaiusdt-bar-1d
+- binance-usdm-compusdt-bar-1d
+- binance-usdm-crvusdt-bar-1d
+- binance-usdm-cvxusdt-bar-1d
+- binance-usdm-dashusdt-bar-1d
- binance-usdm-dogeusdt-bar-12h
- binance-usdm-dogeusdt-bar-15m
- binance-usdm-dogeusdt-bar-1d
@@ -62,8 +125,21 @@ binding_ids:
- binance-usdm-dogeusdt-mark_index_price
- binance-usdm-dogeusdt-quote
- binance-usdm-dogeusdt-trade
-- binance-usdm-ethusdt-260925-book_delta
-- binance-usdm-ethusdt-260925-book_snapshot
+- binance-usdm-doodusdt-bar-1d
+- binance-usdm-dosusdt-bar-1d
+- binance-usdm-dotusdt-bar-1d
+- binance-usdm-dydxusdt-bar-1d
+- binance-usdm-edenusdt-bar-1d
+- binance-usdm-edgeusdt-bar-1d
+- binance-usdm-egldusdt-bar-1d
+- binance-usdm-eigenusdt-bar-1d
+- binance-usdm-enausdt-bar-1d
+- binance-usdm-enjusdt-bar-1d
+- binance-usdm-ensousdt-bar-1d
+- binance-usdm-ensusdt-bar-1d
+- binance-usdm-espusdt-bar-1d
+- binance-usdm-etcusdt-bar-1d
+- binance-usdm-ethfiusdt-bar-1d
- binance-usdm-ethusdt-261225-book_delta
- binance-usdm-ethusdt-261225-book_snapshot
- binance-usdm-ethusdt-bar-12h
@@ -85,6 +161,120 @@ binding_ids:
- binance-usdm-ethusdt-mark_index_price
- binance-usdm-ethusdt-quote
- binance-usdm-ethusdt-trade
+- binance-usdm-ethwusdt-bar-1d
+- binance-usdm-fartcoinusdt-bar-1d
+- binance-usdm-filusdt-bar-1d
+- binance-usdm-flowusdt-bar-1d
+- binance-usdm-fogousdt-bar-1d
+- binance-usdm-fusdt-bar-1d
+- binance-usdm-galausdt-bar-1d
+- binance-usdm-gasusdt-bar-1d
+- binance-usdm-giggleusdt-bar-1d
+- binance-usdm-glmusdt-bar-1d
+- binance-usdm-gmtusdt-bar-1d
+- binance-usdm-gmxusdt-bar-1d
+- binance-usdm-gpsusdt-bar-1d
+- binance-usdm-gramusdt-bar-1d
+- binance-usdm-grassusdt-bar-1d
+- binance-usdm-grtusdt-bar-1d
+- binance-usdm-grvtusdt-bar-1d
+- binance-usdm-hbarusdt-bar-1d
+- binance-usdm-hmstrusdt-bar-1d
+- binance-usdm-homeusdt-bar-1d
+- binance-usdm-humausdt-bar-1d
+- binance-usdm-husdt-bar-1d
+- binance-usdm-hypeusdt-bar-1d
+- binance-usdm-icpusdt-bar-1d
+- binance-usdm-imxusdt-bar-1d
+- binance-usdm-initusdt-bar-1d
+- binance-usdm-injusdt-bar-1d
+- binance-usdm-iostusdt-bar-1d
+- binance-usdm-iotausdt-bar-1d
+- binance-usdm-irysusdt-bar-1d
+- binance-usdm-jellyjellyusdt-bar-1d
+- binance-usdm-jtousdt-bar-1d
+- binance-usdm-jupusdt-bar-1d
+- binance-usdm-kaitousdt-bar-1d
+- binance-usdm-katusdt-bar-1d
+- binance-usdm-kgenusdt-bar-1d
+- binance-usdm-kiteusdt-bar-1d
+- binance-usdm-kmnousdt-bar-1d
+- binance-usdm-ksmusdt-bar-1d
+- binance-usdm-labusdt-bar-1d
+- binance-usdm-lausdt-bar-1d
+- binance-usdm-layerusdt-bar-1d
+- binance-usdm-ldousdt-bar-1d
+- binance-usdm-lineausdt-bar-1d
+- binance-usdm-linkusdt-bar-1d
+- binance-usdm-litusdt-bar-1d
+- binance-usdm-lptusdt-bar-1d
+- binance-usdm-lqtyusdt-bar-1d
+- binance-usdm-ltcusdt-bar-1d
+- binance-usdm-magicusdt-bar-1d
+- binance-usdm-manausdt-bar-1d
+- binance-usdm-maskusdt-bar-1d
+- binance-usdm-megausdt-bar-1d
+- binance-usdm-memeusdt-bar-1d
+- binance-usdm-merlusdt-bar-1d
+- binance-usdm-metisusdt-bar-1d
+- binance-usdm-metusdt-bar-1d
+- binance-usdm-meusdt-bar-1d
+- binance-usdm-mewusdt-bar-1d
+- binance-usdm-minausdt-bar-1d
+- binance-usdm-mmtusdt-bar-1d
+- binance-usdm-monusdt-bar-1d
+- binance-usdm-moodengusdt-bar-1d
+- binance-usdm-morphousdt-bar-1d
+- binance-usdm-moveusdt-bar-1d
+- binance-usdm-mubarakusdt-bar-1d
+- binance-usdm-nearusdt-bar-1d
+- binance-usdm-neirousdt-bar-1d
+- binance-usdm-neousdt-bar-1d
+- binance-usdm-nightusdt-bar-1d
+- binance-usdm-nmrusdt-bar-1d
+- binance-usdm-notusdt-bar-1d
+- binance-usdm-ondousdt-bar-1d
+- binance-usdm-oneusdt-bar-1d
+- binance-usdm-ontusdt-bar-1d
+- binance-usdm-onusdt-bar-1d
+- binance-usdm-opgusdt-bar-1d
+- binance-usdm-opnusdt-bar-1d
+- binance-usdm-opusdt-bar-1d
+- binance-usdm-orderusdt-bar-1d
+- binance-usdm-ordiusdt-bar-1d
+- binance-usdm-ousdt-bar-1d
+- binance-usdm-pendleusdt-bar-1d
+- binance-usdm-penguusdt-bar-1d
+- binance-usdm-peopleusdt-bar-1d
+- binance-usdm-pieverseusdt-bar-1d
+- binance-usdm-pippinusdt-bar-1d
+- binance-usdm-plumeusdt-bar-1d
+- binance-usdm-pnutusdt-bar-1d
+- binance-usdm-polusdt-bar-1d
+- binance-usdm-popcatusdt-bar-1d
+- binance-usdm-proveusdt-bar-1d
+- binance-usdm-pumpusdt-bar-1d
+- binance-usdm-pythusdt-bar-1d
+- binance-usdm-qntusdt-bar-1d
+- binance-usdm-qtumusdt-bar-1d
+- binance-usdm-raveusdt-bar-1d
+- binance-usdm-recallusdt-bar-1d
+- binance-usdm-renderusdt-bar-1d
+- binance-usdm-resolvusdt-bar-1d
+- binance-usdm-reusdt-bar-1d
+- binance-usdm-riverusdt-bar-1d
+- binance-usdm-robousdt-bar-1d
+- binance-usdm-rsrusdt-bar-1d
+- binance-usdm-rvnusdt-bar-1d
+- binance-usdm-saharausdt-bar-1d
+- binance-usdm-sandusdt-bar-1d
+- binance-usdm-sapienusdt-bar-1d
+- binance-usdm-seiusdt-bar-1d
+- binance-usdm-sentusdt-bar-1d
+- binance-usdm-signusdt-bar-1d
+- binance-usdm-skyusdt-bar-1d
+- binance-usdm-slxusdt-bar-1d
+- binance-usdm-snxusdt-bar-1d
- binance-usdm-solusdt-bar-12h
- binance-usdm-solusdt-bar-15m
- binance-usdm-solusdt-bar-1d
@@ -104,6 +294,62 @@ binding_ids:
- binance-usdm-solusdt-mark_index_price
- binance-usdm-solusdt-quote
- binance-usdm-solusdt-trade
+- binance-usdm-soonusdt-bar-1d
+- binance-usdm-sophusdt-bar-1d
+- binance-usdm-spaceusdt-bar-1d
+- binance-usdm-spkusdt-bar-1d
+- binance-usdm-spxusdt-bar-1d
+- binance-usdm-ssvusdt-bar-1d
+- binance-usdm-stableusdt-bar-1d
+- binance-usdm-strkusdt-bar-1d
+- binance-usdm-stxusdt-bar-1d
+- binance-usdm-suiusdt-bar-1d
+- binance-usdm-susdt-bar-1d
+- binance-usdm-sushiusdt-bar-1d
+- binance-usdm-syrupusdt-bar-1d
+- binance-usdm-taousdt-bar-1d
+- binance-usdm-thetausdt-bar-1d
+- binance-usdm-tiausdt-bar-1d
+- binance-usdm-trbusdt-bar-1d
+- binance-usdm-triausdt-bar-1d
+- binance-usdm-trumpusdt-bar-1d
+- binance-usdm-trustusdt-bar-1d
+- binance-usdm-truthusdt-bar-1d
+- binance-usdm-trxusdt-bar-1d
+- binance-usdm-turbousdt-bar-1d
+- binance-usdm-ubusdt-bar-1d
+- binance-usdm-umausdt-bar-1d
+- binance-usdm-uniusdt-bar-1d
+- binance-usdm-uselessusdt-bar-1d
+- binance-usdm-vanausdt-bar-1d
+- binance-usdm-virtualusdt-bar-1d
+- binance-usdm-vvvusdt-bar-1d
+- binance-usdm-walusdt-bar-1d
+- binance-usdm-wctusdt-bar-1d
+- binance-usdm-wetusdt-bar-1d
+- binance-usdm-wifusdt-bar-1d
+- binance-usdm-wldusdt-bar-1d
+- binance-usdm-wlfiusdt-bar-1d
+- binance-usdm-woousdt-bar-1d
+- binance-usdm-wusdt-bar-1d
+- binance-usdm-xlmusdt-bar-1d
+- binance-usdm-xplusdt-bar-1d
+- binance-usdm-xrpusdt-bar-1d
+- binance-usdm-xtzusdt-bar-1d
+- binance-usdm-ybusdt-bar-1d
+- binance-usdm-yfiusdt-bar-1d
+- binance-usdm-yggusdt-bar-1d
+- binance-usdm-zamausdt-bar-1d
+- binance-usdm-zbtusdt-bar-1d
+- binance-usdm-zecusdt-bar-1d
+- binance-usdm-zenusdt-bar-1d
+- binance-usdm-zetausdt-bar-1d
+- binance-usdm-zilusdt-bar-1d
+- binance-usdm-zkpusdt-bar-1d
+- binance-usdm-zkusdt-bar-1d
+- binance-usdm-zorausdt-bar-1d
+- binance-usdm-zrousdt-bar-1d
+- binance-usdm-zrxusdt-bar-1d
- okx-futures-btc-usd-261225-book_delta
- okx-futures-btc-usd-261225-book_snapshot
- okx-futures-btc-usd-270326-book_delta
@@ -112,6 +358,51 @@ binding_ids:
- okx-futures-eth-usd-261225-book_snapshot
- okx-futures-eth-usd-270326-book_delta
- okx-futures-eth-usd-270326-book_snapshot
+- okx-swap-0g-usdt-swap-bar-1d
+- okx-swap-1inch-usdt-swap-bar-1d
+- okx-swap-2z-usdt-swap-bar-1d
+- okx-swap-a-usdt-swap-bar-1d
+- okx-swap-aave-usdt-swap-bar-1d
+- okx-swap-act-usdt-swap-bar-1d
+- okx-swap-acu-usdt-swap-bar-1d
+- okx-swap-ada-usdt-swap-bar-1d
+- okx-swap-aero-usdt-swap-bar-1d
+- okx-swap-aevo-usdt-swap-bar-1d
+- okx-swap-agld-usdt-swap-bar-1d
+- okx-swap-aixbt-usdt-swap-bar-1d
+- okx-swap-algo-usdt-swap-bar-1d
+- okx-swap-allo-usdt-swap-bar-1d
+- okx-swap-anime-usdt-swap-bar-1d
+- okx-swap-ape-usdt-swap-bar-1d
+- okx-swap-api3-usdt-swap-bar-1d
+- okx-swap-apr-usdt-swap-bar-1d
+- okx-swap-apt-usdt-swap-bar-1d
+- okx-swap-ar-usdt-swap-bar-1d
+- okx-swap-arb-usdt-swap-bar-1d
+- okx-swap-arkm-usdt-swap-bar-1d
+- okx-swap-arx-usdt-swap-bar-1d
+- okx-swap-aster-usdt-swap-bar-1d
+- okx-swap-at-usdt-swap-bar-1d
+- okx-swap-ath-usdt-swap-bar-1d
+- okx-swap-atom-usdt-swap-bar-1d
+- okx-swap-auction-usdt-swap-bar-1d
+- okx-swap-avax-usdt-swap-bar-1d
+- okx-swap-avnt-usdt-swap-bar-1d
+- okx-swap-axs-usdt-swap-bar-1d
+- okx-swap-aztec-usdt-swap-bar-1d
+- okx-swap-baby-usdt-swap-bar-1d
+- okx-swap-band-usdt-swap-bar-1d
+- okx-swap-bard-usdt-swap-bar-1d
+- okx-swap-based-usdt-swap-bar-1d
+- okx-swap-bat-usdt-swap-bar-1d
+- okx-swap-bch-usdt-swap-bar-1d
+- okx-swap-beat-usdt-swap-bar-1d
+- okx-swap-bera-usdt-swap-bar-1d
+- okx-swap-bico-usdt-swap-bar-1d
+- okx-swap-bigtime-usdt-swap-bar-1d
+- okx-swap-bill-usdt-swap-bar-1d
+- okx-swap-bio-usdt-swap-bar-1d
+- okx-swap-blur-usdt-swap-bar-1d
- okx-swap-bnb-usdt-swap-bar-12h
- okx-swap-bnb-usdt-swap-bar-15m
- okx-swap-bnb-usdt-swap-bar-1d
@@ -131,6 +422,11 @@ binding_ids:
- okx-swap-bnb-usdt-swap-mark_index_price
- okx-swap-bnb-usdt-swap-quote
- okx-swap-bnb-usdt-swap-trade
+- okx-swap-bome-usdt-swap-bar-1d
+- okx-swap-bonk-usdt-swap-bar-1d
+- okx-swap-brett-usdt-swap-bar-1d
+- okx-swap-brev-usdt-swap-bar-1d
+- okx-swap-bsb-usdt-swap-bar-1d
- okx-swap-btc-usdt-swap-bar-12h
- okx-swap-btc-usdt-swap-bar-15m
- okx-swap-btc-usdt-swap-bar-1d
@@ -150,6 +446,17 @@ binding_ids:
- okx-swap-btcusdt-bar-1m
- okx-swap-btcusdt-quote
- okx-swap-btcusdt-trade
+- okx-swap-cap-usdt-swap-bar-1d
+- okx-swap-cc-usdt-swap-bar-1d
+- okx-swap-celo-usdt-swap-bar-1d
+- okx-swap-cfx-usdt-swap-bar-1d
+- okx-swap-chip-usdt-swap-bar-1d
+- okx-swap-chz-usdt-swap-bar-1d
+- okx-swap-coai-usdt-swap-bar-1d
+- okx-swap-comp-usdt-swap-bar-1d
+- okx-swap-crv-usdt-swap-bar-1d
+- okx-swap-cvx-usdt-swap-bar-1d
+- okx-swap-dash-usdt-swap-bar-1d
- okx-swap-doge-usdt-swap-bar-12h
- okx-swap-doge-usdt-swap-bar-15m
- okx-swap-doge-usdt-swap-bar-1d
@@ -169,6 +476,20 @@ binding_ids:
- okx-swap-doge-usdt-swap-mark_index_price
- okx-swap-doge-usdt-swap-quote
- okx-swap-doge-usdt-swap-trade
+- okx-swap-dood-usdt-swap-bar-1d
+- okx-swap-dos-usdt-swap-bar-1d
+- okx-swap-dot-usdt-swap-bar-1d
+- okx-swap-dydx-usdt-swap-bar-1d
+- okx-swap-eden-usdt-swap-bar-1d
+- okx-swap-edge-usdt-swap-bar-1d
+- okx-swap-egld-usdt-swap-bar-1d
+- okx-swap-eigen-usdt-swap-bar-1d
+- okx-swap-ena-usdt-swap-bar-1d
+- okx-swap-enj-usdt-swap-bar-1d
+- okx-swap-ens-usdt-swap-bar-1d
+- okx-swap-enso-usdt-swap-bar-1d
+- okx-swap-esp-usdt-swap-bar-1d
+- okx-swap-etc-usdt-swap-bar-1d
- okx-swap-eth-usdt-swap-bar-12h
- okx-swap-eth-usdt-swap-bar-15m
- okx-swap-eth-usdt-swap-bar-1d
@@ -188,6 +509,126 @@ binding_ids:
- okx-swap-eth-usdt-swap-mark_index_price
- okx-swap-eth-usdt-swap-quote
- okx-swap-eth-usdt-swap-trade
+- okx-swap-ethfi-usdt-swap-bar-1d
+- okx-swap-ethw-usdt-swap-bar-1d
+- okx-swap-f-usdt-swap-bar-1d
+- okx-swap-fartcoin-usdt-swap-bar-1d
+- okx-swap-fil-usdt-swap-bar-1d
+- okx-swap-floki-usdt-swap-bar-1d
+- okx-swap-flow-usdt-swap-bar-1d
+- okx-swap-fogo-usdt-swap-bar-1d
+- okx-swap-gala-usdt-swap-bar-1d
+- okx-swap-gas-usdt-swap-bar-1d
+- okx-swap-giggle-usdt-swap-bar-1d
+- okx-swap-glm-usdt-swap-bar-1d
+- okx-swap-gmt-usdt-swap-bar-1d
+- okx-swap-gmx-usdt-swap-bar-1d
+- okx-swap-gps-usdt-swap-bar-1d
+- okx-swap-gram-usdt-swap-bar-1d
+- okx-swap-grass-usdt-swap-bar-1d
+- okx-swap-grt-usdt-swap-bar-1d
+- okx-swap-grvt-usdt-swap-bar-1d
+- okx-swap-h-usdt-swap-bar-1d
+- okx-swap-hbar-usdt-swap-bar-1d
+- okx-swap-hmstr-usdt-swap-bar-1d
+- okx-swap-home-usdt-swap-bar-1d
+- okx-swap-huma-usdt-swap-bar-1d
+- okx-swap-hype-usdt-swap-bar-1d
+- okx-swap-icp-usdt-swap-bar-1d
+- okx-swap-imx-usdt-swap-bar-1d
+- okx-swap-init-usdt-swap-bar-1d
+- okx-swap-inj-usdt-swap-bar-1d
+- okx-swap-iost-usdt-swap-bar-1d
+- okx-swap-iota-usdt-swap-bar-1d
+- okx-swap-irys-usdt-swap-bar-1d
+- okx-swap-jellyjelly-usdt-swap-bar-1d
+- okx-swap-jto-usdt-swap-bar-1d
+- okx-swap-jup-usdt-swap-bar-1d
+- okx-swap-kaito-usdt-swap-bar-1d
+- okx-swap-kat-usdt-swap-bar-1d
+- okx-swap-kgen-usdt-swap-bar-1d
+- okx-swap-kite-usdt-swap-bar-1d
+- okx-swap-kmno-usdt-swap-bar-1d
+- okx-swap-ksm-usdt-swap-bar-1d
+- okx-swap-la-usdt-swap-bar-1d
+- okx-swap-lab-usdt-swap-bar-1d
+- okx-swap-layer-usdt-swap-bar-1d
+- okx-swap-ldo-usdt-swap-bar-1d
+- okx-swap-linea-usdt-swap-bar-1d
+- okx-swap-link-usdt-swap-bar-1d
+- okx-swap-lit-usdt-swap-bar-1d
+- okx-swap-lpt-usdt-swap-bar-1d
+- okx-swap-lqty-usdt-swap-bar-1d
+- okx-swap-ltc-usdt-swap-bar-1d
+- okx-swap-magic-usdt-swap-bar-1d
+- okx-swap-mana-usdt-swap-bar-1d
+- okx-swap-mask-usdt-swap-bar-1d
+- okx-swap-me-usdt-swap-bar-1d
+- okx-swap-mega-usdt-swap-bar-1d
+- okx-swap-meme-usdt-swap-bar-1d
+- okx-swap-merl-usdt-swap-bar-1d
+- okx-swap-met-usdt-swap-bar-1d
+- okx-swap-metis-usdt-swap-bar-1d
+- okx-swap-mew-usdt-swap-bar-1d
+- okx-swap-mina-usdt-swap-bar-1d
+- okx-swap-mmt-usdt-swap-bar-1d
+- okx-swap-mon-usdt-swap-bar-1d
+- okx-swap-moodeng-usdt-swap-bar-1d
+- okx-swap-morpho-usdt-swap-bar-1d
+- okx-swap-move-usdt-swap-bar-1d
+- okx-swap-mubarak-usdt-swap-bar-1d
+- okx-swap-near-usdt-swap-bar-1d
+- okx-swap-neiro-usdt-swap-bar-1d
+- okx-swap-neo-usdt-swap-bar-1d
+- okx-swap-night-usdt-swap-bar-1d
+- okx-swap-nmr-usdt-swap-bar-1d
+- okx-swap-not-usdt-swap-bar-1d
+- okx-swap-o-usdt-swap-bar-1d
+- okx-swap-on-usdt-swap-bar-1d
+- okx-swap-ondo-usdt-swap-bar-1d
+- okx-swap-one-usdt-swap-bar-1d
+- okx-swap-ont-usdt-swap-bar-1d
+- okx-swap-op-usdt-swap-bar-1d
+- okx-swap-opg-usdt-swap-bar-1d
+- okx-swap-opn-usdt-swap-bar-1d
+- okx-swap-order-usdt-swap-bar-1d
+- okx-swap-ordi-usdt-swap-bar-1d
+- okx-swap-pendle-usdt-swap-bar-1d
+- okx-swap-pengu-usdt-swap-bar-1d
+- okx-swap-people-usdt-swap-bar-1d
+- okx-swap-pepe-usdt-swap-bar-1d
+- okx-swap-pieverse-usdt-swap-bar-1d
+- okx-swap-pippin-usdt-swap-bar-1d
+- okx-swap-plume-usdt-swap-bar-1d
+- okx-swap-pnut-usdt-swap-bar-1d
+- okx-swap-pol-usdt-swap-bar-1d
+- okx-swap-popcat-usdt-swap-bar-1d
+- okx-swap-prove-usdt-swap-bar-1d
+- okx-swap-pump-usdt-swap-bar-1d
+- okx-swap-pyth-usdt-swap-bar-1d
+- okx-swap-qnt-usdt-swap-bar-1d
+- okx-swap-qtum-usdt-swap-bar-1d
+- okx-swap-rave-usdt-swap-bar-1d
+- okx-swap-re-usdt-swap-bar-1d
+- okx-swap-recall-usdt-swap-bar-1d
+- okx-swap-render-usdt-swap-bar-1d
+- okx-swap-resolv-usdt-swap-bar-1d
+- okx-swap-river-usdt-swap-bar-1d
+- okx-swap-robo-usdt-swap-bar-1d
+- okx-swap-rsr-usdt-swap-bar-1d
+- okx-swap-rvn-usdt-swap-bar-1d
+- okx-swap-s-usdt-swap-bar-1d
+- okx-swap-sahara-usdt-swap-bar-1d
+- okx-swap-sand-usdt-swap-bar-1d
+- okx-swap-sapien-usdt-swap-bar-1d
+- okx-swap-sats-usdt-swap-bar-1d
+- okx-swap-sei-usdt-swap-bar-1d
+- okx-swap-sent-usdt-swap-bar-1d
+- okx-swap-shib-usdt-swap-bar-1d
+- okx-swap-sign-usdt-swap-bar-1d
+- okx-swap-sky-usdt-swap-bar-1d
+- okx-swap-slx-usdt-swap-bar-1d
+- okx-swap-snx-usdt-swap-bar-1d
- okx-swap-sol-usdt-swap-bar-12h
- okx-swap-sol-usdt-swap-bar-15m
- okx-swap-sol-usdt-swap-bar-1d
@@ -207,3 +648,58 @@ binding_ids:
- okx-swap-sol-usdt-swap-mark_index_price
- okx-swap-sol-usdt-swap-quote
- okx-swap-sol-usdt-swap-trade
+- okx-swap-soon-usdt-swap-bar-1d
+- okx-swap-soph-usdt-swap-bar-1d
+- okx-swap-space-usdt-swap-bar-1d
+- okx-swap-spk-usdt-swap-bar-1d
+- okx-swap-spx-usdt-swap-bar-1d
+- okx-swap-ssv-usdt-swap-bar-1d
+- okx-swap-stable-usdt-swap-bar-1d
+- okx-swap-strk-usdt-swap-bar-1d
+- okx-swap-stx-usdt-swap-bar-1d
+- okx-swap-sui-usdt-swap-bar-1d
+- okx-swap-sushi-usdt-swap-bar-1d
+- okx-swap-syrup-usdt-swap-bar-1d
+- okx-swap-tao-usdt-swap-bar-1d
+- okx-swap-theta-usdt-swap-bar-1d
+- okx-swap-tia-usdt-swap-bar-1d
+- okx-swap-trb-usdt-swap-bar-1d
+- okx-swap-tria-usdt-swap-bar-1d
+- okx-swap-trump-usdt-swap-bar-1d
+- okx-swap-trust-usdt-swap-bar-1d
+- okx-swap-truth-usdt-swap-bar-1d
+- okx-swap-trx-usdt-swap-bar-1d
+- okx-swap-turbo-usdt-swap-bar-1d
+- okx-swap-ub-usdt-swap-bar-1d
+- okx-swap-uma-usdt-swap-bar-1d
+- okx-swap-uni-usdt-swap-bar-1d
+- okx-swap-useless-usdt-swap-bar-1d
+- okx-swap-vana-usdt-swap-bar-1d
+- okx-swap-virtual-usdt-swap-bar-1d
+- okx-swap-vvv-usdt-swap-bar-1d
+- okx-swap-w-usdt-swap-bar-1d
+- okx-swap-wal-usdt-swap-bar-1d
+- okx-swap-wct-usdt-swap-bar-1d
+- okx-swap-wet-usdt-swap-bar-1d
+- okx-swap-wif-usdt-swap-bar-1d
+- okx-swap-wld-usdt-swap-bar-1d
+- okx-swap-wlfi-usdt-swap-bar-1d
+- okx-swap-woo-usdt-swap-bar-1d
+- okx-swap-xlm-usdt-swap-bar-1d
+- okx-swap-xpl-usdt-swap-bar-1d
+- okx-swap-xrp-usdt-swap-bar-1d
+- okx-swap-xtz-usdt-swap-bar-1d
+- okx-swap-yb-usdt-swap-bar-1d
+- okx-swap-yfi-usdt-swap-bar-1d
+- okx-swap-ygg-usdt-swap-bar-1d
+- okx-swap-zama-usdt-swap-bar-1d
+- okx-swap-zbt-usdt-swap-bar-1d
+- okx-swap-zec-usdt-swap-bar-1d
+- okx-swap-zen-usdt-swap-bar-1d
+- okx-swap-zeta-usdt-swap-bar-1d
+- okx-swap-zil-usdt-swap-bar-1d
+- okx-swap-zk-usdt-swap-bar-1d
+- okx-swap-zkp-usdt-swap-bar-1d
+- okx-swap-zora-usdt-swap-bar-1d
+- okx-swap-zro-usdt-swap-bar-1d
+- okx-swap-zrx-usdt-swap-bar-1d
diff --git a/config/v2/stable-crypto-demand.yaml b/config/v2/stable-crypto-demand.yaml
index 60b5feeb..460a4c09 100644
--- a/config/v2/stable-crypto-demand.yaml
+++ b/config/v2/stable-crypto-demand.yaml
@@ -1,5 +1,5 @@
schema: qdl.v2.production-demand.v1
-revision: 6
+revision: 7
consumers:
- consumer_id: trading-system.paper.stable
consumer_grade: EXECUTION
@@ -1952,531 +1952,4031 @@ consumers:
feed: BAR
interval: 1w
source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: XRPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TRXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZECUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: HYPEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LINKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ADAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: XLMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BCHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: NEARUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: UNIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LTCUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CCUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SUIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AVAXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: HBARUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GRAMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TAOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 1000SHIBUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ENAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ONDOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AAVEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PUMPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: DOTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ASTERUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MORPHOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WLFIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 1000PEPEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SKYUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WLDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ICPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: QNTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ARBUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ETCUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: VVVUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: POLUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LITUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: JUPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ALGOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RENDERUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ATOMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AEROUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: FILUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: DASHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: INJUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: APTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: STABLEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ETHFIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: STXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PENGUUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TRUMPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PYTHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZROUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CRVUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: XPLUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: VIRTUALUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SEIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TIAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PENDLEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PIEVERSEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SPXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: NIGHTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LDOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: UBUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: XTZUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GRASSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: OPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: KITEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 1000BONKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MONUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: JTOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GRTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ARUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: STRKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ENSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CFXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: USELESSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 1000FLOKIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 2ZUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SYRUPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: KMNOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WIFUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: EIGENUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: COMPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: IOTAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: THETAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZAMAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AXSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: EDGEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: METUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: FARTCOINUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CVXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: NEOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MINAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MANAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CHZUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SENTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: APEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SNXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: IMXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: HUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 1INCHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: EGLDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BATUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZENUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SANDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ATHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GLMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PLUMEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: DYDXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RSRUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: QTUMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GALAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZRXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GASUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ORDIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ARKMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CHIPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WALUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: YFIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: KSMUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: KAITOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZETAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LPTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: OUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GMXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SPKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BERAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CAPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ONEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: REUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SUSHIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZILUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TURBOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ALLOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BOMEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SOONUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LINEAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GPSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BIOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ESPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: NMRUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: JELLYJELLYUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BABYUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ENJUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BLURUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: COAIUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ONTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MERLUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: CELOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BRETTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 0GUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: POPCATUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TRBUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PNUTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MUBARAKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RAVEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: FLOWUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ACUUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BARDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MEMEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MEGAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: NOTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AZTECUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ARXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MOODENGUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MASKUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PROVEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PEOPLEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SSVUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LABUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: HUMAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AVNTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MEWUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: DOSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MOVEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: API3USDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SAHARAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BANDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: APRUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZORAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GIGGLEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RVNUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: NEIROUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: UMAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SIGNUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: VANAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BEATUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ATUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MMTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: IOSTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: IRYSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: FOGOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ETHWUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: KGENUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BILLUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: OPGUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SPACEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZBTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AUCTIONUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: HOMEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TRUTHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GMTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: METISUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: EDENUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BSBUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: 1000SATSUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BIGTIMEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WOOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: YGGUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AEVOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RIVERUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AIXBTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: GRVTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LQTYUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BREVUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: YBUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BICOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ROBOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ENSOUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: AGLDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WCTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: INITUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ONUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: PIPPINUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ANIMEUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SAPIENUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: FUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SOPHUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: MAGICUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LAYERUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ORDERUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: SLXUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: KATUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: BASEDUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: WETUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: DOODUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: LAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RECALLUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TRUSTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: HMSTRUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ACTUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: ZKPUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: RESOLVUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: OPNUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ native_symbol: TRIAUSDT
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
- consumer_id: alpha.okx.paper.stable
consumer_grade: ALPHA
requirements:
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
- feed: TRADE
- interval: null
+ native_symbol: BTC-USDT-SWAP
+ feed: TRADE
+ interval: null
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: TRADE
+ interval: null
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 1m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 1m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 1h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 1h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: TRADE
+ interval: null
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 1m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 1h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: TRADE
+ interval: null
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 1m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 1h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: TRADE
+ interval: null
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 1m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 1h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 3m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 5m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 15m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 30m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 2h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 4h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 6h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 12h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 2d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 3d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BTC-USDT-SWAP
+ feed: BAR
+ interval: 1w
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 3m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 5m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 15m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 30m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 2h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 4h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 6h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 12h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 2d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 3d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETH-USDT-SWAP
+ feed: BAR
+ interval: 1w
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 3m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 5m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 15m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 30m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 2h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 4h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 6h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 12h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 2d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 3d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOL-USDT-SWAP
+ feed: BAR
+ interval: 1w
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 3m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 5m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 15m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 30m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 2h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 4h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 6h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 12h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 2d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 3d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOGE-USDT-SWAP
+ feed: BAR
+ interval: 1w
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 3m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 5m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 15m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 30m
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 2h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 4h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 6h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 12h
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 2d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 3d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BNB-USDT-SWAP
+ feed: BAR
+ interval: 1w
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: XRP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TRX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZEC-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: HYPE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: LINK-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ADA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: XLM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BCH-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: NEAR-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: UNI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: LTC-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CC-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SUI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: AVAX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: HBAR-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GRAM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TAO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SHIB-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ENA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ONDO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: AAVE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PUMP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DOT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ASTER-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MORPHO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: WLFI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PEPE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SKY-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: WLD-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ICP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: QNT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ARB-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETC-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: VVV-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: POL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: LIT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: JUP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ALGO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: RENDER-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ATOM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: AERO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: FIL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DASH-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: INJ-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: APT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: STABLE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ETHFI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: STX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PENGU-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TRUMP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PYTH-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZRO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CRV-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: XPL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: VIRTUAL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SEI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TIA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PENDLE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PIEVERSE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SPX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: NIGHT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: LDO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: UB-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: XTZ-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GRASS-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: OP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: KITE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BONK-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MON-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: JTO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GRT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: AR-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: STRK-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ENS-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CFX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: USELESS-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: FLOKI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: 2Z-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SYRUP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: KMNO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: WIF-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: EIGEN-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: COMP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: IOTA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: THETA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZAMA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: AXS-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: EDGE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MET-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: FARTCOIN-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CVX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: NEO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MINA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MANA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CHZ-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: A-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SENT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: S-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: APE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SNX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: IMX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: H-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: 1INCH-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: EGLD-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BAT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZK-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZEN-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SAND-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ATH-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GLM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PLUME-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: DYDX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: RSR-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: QTUM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GALA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZRX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GAS-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ORDI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ARKM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CHIP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: WAL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: YFI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: KSM-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: KAITO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZETA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: LPT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: O-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GMX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: W-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SPK-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BERA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CAP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ONE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: RE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SUSHI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZIL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TURBO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ALLO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BOME-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: SOON-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: LINEA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: GPS-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BIO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ESP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: NMR-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: JELLYJELLY-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BABY-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ENJ-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BLUR-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: COAI-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ONT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MERL-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: CELO-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BRETT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: 0G-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: POPCAT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TRB-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: PNUT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MUBARAK-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: RAVE-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: FLOW-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ACU-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: BARD-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MEME-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MEGA-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: NOT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: AZTEC-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ARX-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ME-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MOODENG-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: MASK-USDT-SWAP
+ feed: BAR
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
- feed: TRADE
- interval: null
+ native_symbol: PROVE-USDT-SWAP
+ feed: BAR
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: PEOPLE-USDT-SWAP
feed: BAR
- interval: 1m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: SSV-USDT-SWAP
feed: BAR
- interval: 1m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: LAB-USDT-SWAP
feed: BAR
- interval: 1h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: HUMA-USDT-SWAP
feed: BAR
- interval: 1h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
- feed: TRADE
- interval: null
+ native_symbol: AVNT-USDT-SWAP
+ feed: BAR
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: MEW-USDT-SWAP
feed: BAR
- interval: 1m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: DOS-USDT-SWAP
feed: BAR
- interval: 1h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
- feed: TRADE
- interval: null
+ native_symbol: MOVE-USDT-SWAP
+ feed: BAR
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: API3-USDT-SWAP
feed: BAR
- interval: 1m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: SAHARA-USDT-SWAP
feed: BAR
- interval: 1h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
- feed: TRADE
- interval: null
+ native_symbol: BAND-USDT-SWAP
+ feed: BAR
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: APR-USDT-SWAP
feed: BAR
- interval: 1m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: ZORA-USDT-SWAP
feed: BAR
- interval: 1h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: GIGGLE-USDT-SWAP
feed: BAR
- interval: 3m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: RVN-USDT-SWAP
feed: BAR
- interval: 5m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: NEIRO-USDT-SWAP
feed: BAR
- interval: 15m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: UMA-USDT-SWAP
feed: BAR
- interval: 30m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: SIGN-USDT-SWAP
feed: BAR
- interval: 2h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: VANA-USDT-SWAP
feed: BAR
- interval: 4h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: BEAT-USDT-SWAP
feed: BAR
- interval: 6h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: AT-USDT-SWAP
feed: BAR
- interval: 12h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: MMT-USDT-SWAP
feed: BAR
interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: IOST-USDT-SWAP
feed: BAR
- interval: 2d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: IRYS-USDT-SWAP
feed: BAR
- interval: 3d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BTC-USDT-SWAP
+ native_symbol: FOGO-USDT-SWAP
feed: BAR
- interval: 1w
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: ETHW-USDT-SWAP
feed: BAR
- interval: 3m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: KGEN-USDT-SWAP
feed: BAR
- interval: 5m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: BILL-USDT-SWAP
feed: BAR
- interval: 15m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: OPG-USDT-SWAP
feed: BAR
- interval: 30m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: SPACE-USDT-SWAP
feed: BAR
- interval: 2h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: ZBT-USDT-SWAP
feed: BAR
- interval: 4h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: AUCTION-USDT-SWAP
feed: BAR
- interval: 6h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: HOME-USDT-SWAP
feed: BAR
- interval: 12h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: TRUTH-USDT-SWAP
feed: BAR
interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: GMT-USDT-SWAP
feed: BAR
- interval: 2d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: METIS-USDT-SWAP
feed: BAR
- interval: 3d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: ETH-USDT-SWAP
+ native_symbol: EDEN-USDT-SWAP
feed: BAR
- interval: 1w
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: BSB-USDT-SWAP
feed: BAR
- interval: 3m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: SATS-USDT-SWAP
feed: BAR
- interval: 5m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: BIGTIME-USDT-SWAP
feed: BAR
- interval: 15m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: WOO-USDT-SWAP
feed: BAR
- interval: 30m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: YGG-USDT-SWAP
feed: BAR
- interval: 2h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: AEVO-USDT-SWAP
feed: BAR
- interval: 4h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: RIVER-USDT-SWAP
feed: BAR
- interval: 6h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: AIXBT-USDT-SWAP
feed: BAR
- interval: 12h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: GRVT-USDT-SWAP
feed: BAR
interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: LQTY-USDT-SWAP
feed: BAR
- interval: 2d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: BREV-USDT-SWAP
feed: BAR
- interval: 3d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: SOL-USDT-SWAP
+ native_symbol: YB-USDT-SWAP
feed: BAR
- interval: 1w
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: BICO-USDT-SWAP
feed: BAR
- interval: 3m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: ROBO-USDT-SWAP
feed: BAR
- interval: 5m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: ENSO-USDT-SWAP
feed: BAR
- interval: 15m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: AGLD-USDT-SWAP
feed: BAR
- interval: 30m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: WCT-USDT-SWAP
feed: BAR
- interval: 2h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: INIT-USDT-SWAP
feed: BAR
- interval: 4h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: ON-USDT-SWAP
feed: BAR
- interval: 6h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: PIPPIN-USDT-SWAP
feed: BAR
- interval: 12h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: ANIME-USDT-SWAP
feed: BAR
interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: SAPIEN-USDT-SWAP
feed: BAR
- interval: 2d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: F-USDT-SWAP
feed: BAR
- interval: 3d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: DOGE-USDT-SWAP
+ native_symbol: SOPH-USDT-SWAP
feed: BAR
- interval: 1w
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: MAGIC-USDT-SWAP
feed: BAR
- interval: 3m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: LAYER-USDT-SWAP
feed: BAR
- interval: 5m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: ORDER-USDT-SWAP
feed: BAR
- interval: 15m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: SLX-USDT-SWAP
feed: BAR
- interval: 30m
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: KAT-USDT-SWAP
feed: BAR
- interval: 2h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: BASED-USDT-SWAP
feed: BAR
- interval: 4h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: WET-USDT-SWAP
feed: BAR
- interval: 6h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: DOOD-USDT-SWAP
feed: BAR
- interval: 12h
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: LA-USDT-SWAP
feed: BAR
interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: RECALL-USDT-SWAP
feed: BAR
- interval: 2d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: TRUST-USDT-SWAP
feed: BAR
- interval: 3d
+ interval: 1d
source_policy_id: crypto_primary_v2
- venue: OKX
market: SWAP
product_type: PERPETUAL
- native_symbol: BNB-USDT-SWAP
+ native_symbol: HMSTR-USDT-SWAP
feed: BAR
- interval: 1w
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ACT-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: ZKP-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: RESOLV-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: OPN-USDT-SWAP
+ feed: BAR
+ interval: 1d
+ source_policy_id: crypto_primary_v2
+ - venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ native_symbol: TRIA-USDT-SWAP
+ feed: BAR
+ interval: 1d
source_policy_id: crypto_primary_v2
diff --git a/config/v2/stable-primary-consumer-routing.yaml b/config/v2/stable-primary-consumer-routing.yaml
index 5dc03b0a..3912adf2 100644
--- a/config/v2/stable-primary-consumer-routing.yaml
+++ b/config/v2/stable-primary-consumer-routing.yaml
@@ -1,5 +1,5 @@
schema: qdl.v2.shared-primary-consumer-route.v1
-revision: 6
+revision: 8
contract_version: 2.0.0
target_route: V2_PRIMARY
rollback_route: V1
diff --git a/config/v2/stable-reference-l2-demand.yaml b/config/v2/stable-reference-l2-demand.yaml
index 7de5e916..4d8398ff 100644
--- a/config/v2/stable-reference-l2-demand.yaml
+++ b/config/v2/stable-reference-l2-demand.yaml
@@ -5,7 +5,7 @@
# A later sealed runtime packet must bind a named consumer identity to these
# requirements before they can become V2-primary.
schema: qdl.v2.universal-demand.v1
-revision: 2
+revision: 3
requirements:
# Five liquid perpetuals, explicitly separated by provider venue/market.
# Reference history is REST/batch input, not an execution-grade price feed.
@@ -84,10 +84,23 @@ requirements:
configuration_revision: 1
- <<: *okx_reference
feed: OPEN_INTEREST
- # OKX public OI is a current snapshot. Do not claim a synthetic 1d
- # history window; a future durable OI series is a separate product.
+ # Current public OI snapshot, separate from REST sampled history below.
interval: null
max_freshness_ms: 86400000
+ # Exact-contract statistics supported by the shared OKX REST adapter.
+ # Current OI above remains distinct from sampled OI history below.
+ - <<: *okx_reference
+ feed: OPEN_INTEREST
+ interval: 1d
+ max_freshness_ms: 86400000
+ - <<: *okx_reference
+ feed: LONG_SHORT_RATIO
+ interval: 1d
+ max_freshness_ms: 259200000
+ - <<: *okx_reference
+ feed: TAKER_FLOW
+ interval: 1d
+ max_freshness_ms: 259200000
- <<: *okx_reference
feed: MARK_PRICE
max_freshness_ms: 60000
diff --git a/config/v2/stable-source-bindings.yaml b/config/v2/stable-source-bindings.yaml
index 7a8639c4..cec76066 100644
--- a/config/v2/stable-source-bindings.yaml
+++ b/config/v2/stable-source-bindings.yaml
@@ -1,6 +1,6 @@
schema: qdl.v2.stable-source-bindings.v1
canonical_stream: md.canonical.v2
-catalog_revision: 9
+catalog_revision: 11
source_policy_revision: 1
authority_revision: 1
instruments:
@@ -478,341 +478,19539 @@ instruments:
instFamily: SOL-USDT
instIdCode: '10530'
uly: SOL-USDT
+- instrument_uid: 52a78a60-e48b-5507-b823-e5b8867db2df
+ instrument_id: BINANCE.USDM.PERPETUAL.0G-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 0G-USDT
+ native_symbol: 0GUSDT
+ asset_class: DERIVATIVE
+ base_asset: 0G
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9591218d-358d-5d5b-aa1c-7d9653e487ad
+ instrument_id: BINANCE.USDM.PERPETUAL.1000BONK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 1000BONK-USDT
+ native_symbol: 1000BONKUSDT
+ asset_class: DERIVATIVE
+ base_asset: 1000BONK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: da43e311-fa63-5201-ba73-a92e3672a3b4
+ instrument_id: BINANCE.USDM.PERPETUAL.1000FLOKI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 1000FLOKI-USDT
+ native_symbol: 1000FLOKIUSDT
+ asset_class: DERIVATIVE
+ base_asset: 1000FLOKI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d4316760-92df-50ad-b291-79b043564d85
+ instrument_id: BINANCE.USDM.PERPETUAL.1000PEPE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 1000PEPE-USDT
+ native_symbol: 1000PEPEUSDT
+ asset_class: DERIVATIVE
+ base_asset: 1000PEPE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c07b42ad-ab20-599a-b33f-053209030c55
+ instrument_id: BINANCE.USDM.PERPETUAL.1000SATS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 1000SATS-USDT
+ native_symbol: 1000SATSUSDT
+ asset_class: DERIVATIVE
+ base_asset: 1000SATS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 123ff4ea-21a7-54a0-9ad3-e56059b81bde
+ instrument_id: BINANCE.USDM.PERPETUAL.1000SHIB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 1000SHIB-USDT
+ native_symbol: 1000SHIBUSDT
+ asset_class: DERIVATIVE
+ base_asset: 1000SHIB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 879ff3cb-0774-5705-b2fa-82101137410c
+ instrument_id: BINANCE.USDM.PERPETUAL.1INCH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 1INCH-USDT
+ native_symbol: 1INCHUSDT
+ asset_class: DERIVATIVE
+ base_asset: 1INCH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9d5eafc6-2af9-5f86-9950-c9bc0beef049
+ instrument_id: BINANCE.USDM.PERPETUAL.2Z-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: 2Z-USDT
+ native_symbol: 2ZUSDT
+ asset_class: DERIVATIVE
+ base_asset: 2Z
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 355cdfa9-18a0-5274-b761-ad8dffa29ed3
+ instrument_id: BINANCE.USDM.PERPETUAL.A-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: A-USDT
+ native_symbol: AUSDT
+ asset_class: DERIVATIVE
+ base_asset: A
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 47871e91-fb6a-5273-9f22-fc663cdc2f32
+ instrument_id: BINANCE.USDM.PERPETUAL.AAVE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AAVE-USDT
+ native_symbol: AAVEUSDT
+ asset_class: DERIVATIVE
+ base_asset: AAVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7d9c02f5-b2cd-507c-a478-ccfeba874b5d
+ instrument_id: BINANCE.USDM.PERPETUAL.ACT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ACT-USDT
+ native_symbol: ACTUSDT
+ asset_class: DERIVATIVE
+ base_asset: ACT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: afd75136-bcc0-57ed-a85b-10d470fb8336
+ instrument_id: BINANCE.USDM.PERPETUAL.ACU-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ACU-USDT
+ native_symbol: ACUUSDT
+ asset_class: DERIVATIVE
+ base_asset: ACU
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6e48b1c7-2340-5e07-aacf-1c6048498b00
+ instrument_id: BINANCE.USDM.PERPETUAL.ADA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ADA-USDT
+ native_symbol: ADAUSDT
+ asset_class: DERIVATIVE
+ base_asset: ADA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 3c6f6997-1b46-5e9e-acf9-df60b2075142
+ instrument_id: BINANCE.USDM.PERPETUAL.AERO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AERO-USDT
+ native_symbol: AEROUSDT
+ asset_class: DERIVATIVE
+ base_asset: AERO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 49355b7d-5da7-5768-bded-cf08dfe0ddca
+ instrument_id: BINANCE.USDM.PERPETUAL.AEVO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AEVO-USDT
+ native_symbol: AEVOUSDT
+ asset_class: DERIVATIVE
+ base_asset: AEVO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a0e845a9-a853-50b1-b256-913925fbf1d2
+ instrument_id: BINANCE.USDM.PERPETUAL.AGLD-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AGLD-USDT
+ native_symbol: AGLDUSDT
+ asset_class: DERIVATIVE
+ base_asset: AGLD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b41b2b3f-65b7-509d-a0b3-e7f3440d9a6a
+ instrument_id: BINANCE.USDM.PERPETUAL.AIXBT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AIXBT-USDT
+ native_symbol: AIXBTUSDT
+ asset_class: DERIVATIVE
+ base_asset: AIXBT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 39392d40-34f4-5531-85db-da715726cec4
+ instrument_id: BINANCE.USDM.PERPETUAL.ALGO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ALGO-USDT
+ native_symbol: ALGOUSDT
+ asset_class: DERIVATIVE
+ base_asset: ALGO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9e012444-b0b9-55ab-a994-a6a2b8384b02
+ instrument_id: BINANCE.USDM.PERPETUAL.ALLO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ALLO-USDT
+ native_symbol: ALLOUSDT
+ asset_class: DERIVATIVE
+ base_asset: ALLO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: dd71effc-462a-5862-997d-74a587a49b61
+ instrument_id: BINANCE.USDM.PERPETUAL.ANIME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ANIME-USDT
+ native_symbol: ANIMEUSDT
+ asset_class: DERIVATIVE
+ base_asset: ANIME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 46aca998-9432-55d5-a619-72ae55c92f7e
+ instrument_id: BINANCE.USDM.PERPETUAL.APE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: APE-USDT
+ native_symbol: APEUSDT
+ asset_class: DERIVATIVE
+ base_asset: APE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 4275cccf-ed9f-5948-904f-e4b1ae933e66
+ instrument_id: BINANCE.USDM.PERPETUAL.API3-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: API3-USDT
+ native_symbol: API3USDT
+ asset_class: DERIVATIVE
+ base_asset: API3
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 54de4137-c09a-52f0-ad34-696fdd5b4f04
+ instrument_id: BINANCE.USDM.PERPETUAL.APR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: APR-USDT
+ native_symbol: APRUSDT
+ asset_class: DERIVATIVE
+ base_asset: APR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ecfceb71-472a-5e6b-8228-51fe99af10dd
+ instrument_id: BINANCE.USDM.PERPETUAL.APT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: APT-USDT
+ native_symbol: APTUSDT
+ asset_class: DERIVATIVE
+ base_asset: APT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b6af67f3-e4ea-5982-a4d2-e2a4ed8b823e
+ instrument_id: BINANCE.USDM.PERPETUAL.AR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AR-USDT
+ native_symbol: ARUSDT
+ asset_class: DERIVATIVE
+ base_asset: AR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e840b0bc-066b-5a63-9368-8654ade8462f
+ instrument_id: BINANCE.USDM.PERPETUAL.ARB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ARB-USDT
+ native_symbol: ARBUSDT
+ asset_class: DERIVATIVE
+ base_asset: ARB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: db35329e-fec3-5e5e-8dea-0e0e42aa71df
+ instrument_id: BINANCE.USDM.PERPETUAL.ARKM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ARKM-USDT
+ native_symbol: ARKMUSDT
+ asset_class: DERIVATIVE
+ base_asset: ARKM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 48c9207b-c6c9-5901-ad33-368f55774c47
+ instrument_id: BINANCE.USDM.PERPETUAL.ARX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ARX-USDT
+ native_symbol: ARXUSDT
+ asset_class: DERIVATIVE
+ base_asset: ARX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f51c770c-f711-54e5-ab83-8ef6cc63d247
+ instrument_id: BINANCE.USDM.PERPETUAL.ASTER-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ASTER-USDT
+ native_symbol: ASTERUSDT
+ asset_class: DERIVATIVE
+ base_asset: ASTER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bf1f6c47-30eb-5467-aea4-a66760bf5e5e
+ instrument_id: BINANCE.USDM.PERPETUAL.AT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AT-USDT
+ native_symbol: ATUSDT
+ asset_class: DERIVATIVE
+ base_asset: AT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c26690f5-48a3-5cc3-8997-3c10a2a8b413
+ instrument_id: BINANCE.USDM.PERPETUAL.ATH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ATH-USDT
+ native_symbol: ATHUSDT
+ asset_class: DERIVATIVE
+ base_asset: ATH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e178f3a4-1ceb-5e0e-adc2-a3123c89d420
+ instrument_id: BINANCE.USDM.PERPETUAL.ATOM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ATOM-USDT
+ native_symbol: ATOMUSDT
+ asset_class: DERIVATIVE
+ base_asset: ATOM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: be6c712f-0218-5350-b162-75cd18a1e8d1
+ instrument_id: BINANCE.USDM.PERPETUAL.AUCTION-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AUCTION-USDT
+ native_symbol: AUCTIONUSDT
+ asset_class: DERIVATIVE
+ base_asset: AUCTION
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 34043a94-1386-58d7-a507-e80a173199d7
+ instrument_id: BINANCE.USDM.PERPETUAL.AVAX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AVAX-USDT
+ native_symbol: AVAXUSDT
+ asset_class: DERIVATIVE
+ base_asset: AVAX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f1fa334d-15e7-5ca3-9e11-5b805b3426a1
+ instrument_id: BINANCE.USDM.PERPETUAL.AVNT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AVNT-USDT
+ native_symbol: AVNTUSDT
+ asset_class: DERIVATIVE
+ base_asset: AVNT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 18b9b339-1a7f-5110-bdd1-5b3585e2ebff
+ instrument_id: BINANCE.USDM.PERPETUAL.AXS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AXS-USDT
+ native_symbol: AXSUSDT
+ asset_class: DERIVATIVE
+ base_asset: AXS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e2688e6c-660f-5deb-ba4b-5690d98ee452
+ instrument_id: BINANCE.USDM.PERPETUAL.AZTEC-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: AZTEC-USDT
+ native_symbol: AZTECUSDT
+ asset_class: DERIVATIVE
+ base_asset: AZTEC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7107b106-eed7-513c-8c1b-0a1ff512afee
+ instrument_id: BINANCE.USDM.PERPETUAL.BABY-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BABY-USDT
+ native_symbol: BABYUSDT
+ asset_class: DERIVATIVE
+ base_asset: BABY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 132d4a1b-3464-5de1-b9ad-1f3ebe728589
+ instrument_id: BINANCE.USDM.PERPETUAL.BAND-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BAND-USDT
+ native_symbol: BANDUSDT
+ asset_class: DERIVATIVE
+ base_asset: BAND
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 07b68da9-76a6-5e50-9de1-bf5ffe70711f
+ instrument_id: BINANCE.USDM.PERPETUAL.BARD-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BARD-USDT
+ native_symbol: BARDUSDT
+ asset_class: DERIVATIVE
+ base_asset: BARD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 56075a4c-2f7b-5773-a88c-a7b00323721a
+ instrument_id: BINANCE.USDM.PERPETUAL.BASED-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BASED-USDT
+ native_symbol: BASEDUSDT
+ asset_class: DERIVATIVE
+ base_asset: BASED
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7524658d-fa43-5121-91c5-fd55afea5953
+ instrument_id: BINANCE.USDM.PERPETUAL.BAT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BAT-USDT
+ native_symbol: BATUSDT
+ asset_class: DERIVATIVE
+ base_asset: BAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6cf90303-3b4a-58e9-94f8-3574c64c3fa2
+ instrument_id: BINANCE.USDM.PERPETUAL.BCH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BCH-USDT
+ native_symbol: BCHUSDT
+ asset_class: DERIVATIVE
+ base_asset: BCH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e0377966-ec4b-5dd6-994b-ad4c0542e214
+ instrument_id: BINANCE.USDM.PERPETUAL.BEAT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BEAT-USDT
+ native_symbol: BEATUSDT
+ asset_class: DERIVATIVE
+ base_asset: BEAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 64e64842-f7cc-52a3-a72b-8400375f5505
+ instrument_id: BINANCE.USDM.PERPETUAL.BERA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BERA-USDT
+ native_symbol: BERAUSDT
+ asset_class: DERIVATIVE
+ base_asset: BERA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 4aaf2734-e6e6-5ad1-b5dd-1dac4aa549a5
+ instrument_id: BINANCE.USDM.PERPETUAL.BICO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BICO-USDT
+ native_symbol: BICOUSDT
+ asset_class: DERIVATIVE
+ base_asset: BICO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b616b571-b4db-5d27-ae73-0e03e71e3125
+ instrument_id: BINANCE.USDM.PERPETUAL.BIGTIME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BIGTIME-USDT
+ native_symbol: BIGTIMEUSDT
+ asset_class: DERIVATIVE
+ base_asset: BIGTIME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 56277e8e-e8d2-56ec-bf9b-cb742cf17883
+ instrument_id: BINANCE.USDM.PERPETUAL.BILL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BILL-USDT
+ native_symbol: BILLUSDT
+ asset_class: DERIVATIVE
+ base_asset: BILL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 789ea412-0d8d-5d54-a4a4-a0ea2dee338c
+ instrument_id: BINANCE.USDM.PERPETUAL.BIO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BIO-USDT
+ native_symbol: BIOUSDT
+ asset_class: DERIVATIVE
+ base_asset: BIO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a76839ab-ecdd-59ef-9416-17ac1af4b3d0
+ instrument_id: BINANCE.USDM.PERPETUAL.BLUR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BLUR-USDT
+ native_symbol: BLURUSDT
+ asset_class: DERIVATIVE
+ base_asset: BLUR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0dc95513-2b93-56c1-8966-78e06012e967
+ instrument_id: BINANCE.USDM.PERPETUAL.BOME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BOME-USDT
+ native_symbol: BOMEUSDT
+ asset_class: DERIVATIVE
+ base_asset: BOME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a2ded063-b730-5294-a024-b1c4abcadc5e
+ instrument_id: BINANCE.USDM.PERPETUAL.BRETT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BRETT-USDT
+ native_symbol: BRETTUSDT
+ asset_class: DERIVATIVE
+ base_asset: BRETT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 24ed3fe9-70d2-5715-a0e6-d2dd06e02d0e
+ instrument_id: BINANCE.USDM.PERPETUAL.BREV-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BREV-USDT
+ native_symbol: BREVUSDT
+ asset_class: DERIVATIVE
+ base_asset: BREV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 115fba5d-673e-5ad8-b14d-53c6b077d8b8
+ instrument_id: BINANCE.USDM.PERPETUAL.BSB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: BSB-USDT
+ native_symbol: BSBUSDT
+ asset_class: DERIVATIVE
+ base_asset: BSB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 49fd25fe-bbe4-5c84-97c2-510dd94dddd9
+ instrument_id: BINANCE.USDM.PERPETUAL.CAP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CAP-USDT
+ native_symbol: CAPUSDT
+ asset_class: DERIVATIVE
+ base_asset: CAP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 35eea6b0-e366-5885-9c58-f1c850631acc
+ instrument_id: BINANCE.USDM.PERPETUAL.CC-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CC-USDT
+ native_symbol: CCUSDT
+ asset_class: DERIVATIVE
+ base_asset: CC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b7b0141d-1de2-5b79-af97-a4d60ff6a9f5
+ instrument_id: BINANCE.USDM.PERPETUAL.CELO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CELO-USDT
+ native_symbol: CELOUSDT
+ asset_class: DERIVATIVE
+ base_asset: CELO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 98d54c7c-3319-5a73-9c36-6a66dcbabd6a
+ instrument_id: BINANCE.USDM.PERPETUAL.CFX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CFX-USDT
+ native_symbol: CFXUSDT
+ asset_class: DERIVATIVE
+ base_asset: CFX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f975d17f-3347-5fcf-b56a-fb8b8f6b0de2
+ instrument_id: BINANCE.USDM.PERPETUAL.CHIP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CHIP-USDT
+ native_symbol: CHIPUSDT
+ asset_class: DERIVATIVE
+ base_asset: CHIP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f0fc7947-d63b-5d68-9693-e57180133118
+ instrument_id: BINANCE.USDM.PERPETUAL.CHZ-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CHZ-USDT
+ native_symbol: CHZUSDT
+ asset_class: DERIVATIVE
+ base_asset: CHZ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 3726da06-2869-5143-b334-db8e1546f540
+ instrument_id: BINANCE.USDM.PERPETUAL.COAI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: COAI-USDT
+ native_symbol: COAIUSDT
+ asset_class: DERIVATIVE
+ base_asset: COAI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a0053062-3a08-5328-8869-5148cf4def68
+ instrument_id: BINANCE.USDM.PERPETUAL.COMP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: COMP-USDT
+ native_symbol: COMPUSDT
+ asset_class: DERIVATIVE
+ base_asset: COMP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e85dc2e1-f82f-544f-b55e-3176925d996c
+ instrument_id: BINANCE.USDM.PERPETUAL.CRV-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CRV-USDT
+ native_symbol: CRVUSDT
+ asset_class: DERIVATIVE
+ base_asset: CRV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0c8454bd-825f-53f9-801c-1d1edc623a87
+ instrument_id: BINANCE.USDM.PERPETUAL.CVX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: CVX-USDT
+ native_symbol: CVXUSDT
+ asset_class: DERIVATIVE
+ base_asset: CVX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6c00dc57-9aad-5881-910c-6dab3b593b53
+ instrument_id: BINANCE.USDM.PERPETUAL.DASH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: DASH-USDT
+ native_symbol: DASHUSDT
+ asset_class: DERIVATIVE
+ base_asset: DASH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9cea9ea3-bffb-5af7-ba48-266c77a830bf
+ instrument_id: BINANCE.USDM.PERPETUAL.DOOD-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: DOOD-USDT
+ native_symbol: DOODUSDT
+ asset_class: DERIVATIVE
+ base_asset: DOOD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6bb5fd3e-27ef-5cbd-b535-df991800b752
+ instrument_id: BINANCE.USDM.PERPETUAL.DOS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: DOS-USDT
+ native_symbol: DOSUSDT
+ asset_class: DERIVATIVE
+ base_asset: DOS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: fdde788f-16a2-5b0b-a66b-19ae99a38d08
+ instrument_id: BINANCE.USDM.PERPETUAL.DOT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: DOT-USDT
+ native_symbol: DOTUSDT
+ asset_class: DERIVATIVE
+ base_asset: DOT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 82c3d1ea-8098-5e21-b841-e51469ca5bb0
+ instrument_id: BINANCE.USDM.PERPETUAL.DYDX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: DYDX-USDT
+ native_symbol: DYDXUSDT
+ asset_class: DERIVATIVE
+ base_asset: DYDX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0bb4ca88-2c89-5118-a7de-5d58985ba27b
+ instrument_id: BINANCE.USDM.PERPETUAL.EDEN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: EDEN-USDT
+ native_symbol: EDENUSDT
+ asset_class: DERIVATIVE
+ base_asset: EDEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a9813a7f-04b3-537b-abbb-8bc599de3873
+ instrument_id: BINANCE.USDM.PERPETUAL.EDGE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: EDGE-USDT
+ native_symbol: EDGEUSDT
+ asset_class: DERIVATIVE
+ base_asset: EDGE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 46f4fd8b-58db-578c-9c23-01d890296726
+ instrument_id: BINANCE.USDM.PERPETUAL.EGLD-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: EGLD-USDT
+ native_symbol: EGLDUSDT
+ asset_class: DERIVATIVE
+ base_asset: EGLD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8876d78b-3edf-5e4f-9be4-7be3b2db1966
+ instrument_id: BINANCE.USDM.PERPETUAL.EIGEN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: EIGEN-USDT
+ native_symbol: EIGENUSDT
+ asset_class: DERIVATIVE
+ base_asset: EIGEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f3d07537-e856-5793-9fe4-75d9f1e54e5b
+ instrument_id: BINANCE.USDM.PERPETUAL.ENA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ENA-USDT
+ native_symbol: ENAUSDT
+ asset_class: DERIVATIVE
+ base_asset: ENA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f41d64f2-dc4f-53f1-8911-bf8dd7a59249
+ instrument_id: BINANCE.USDM.PERPETUAL.ENJ-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ENJ-USDT
+ native_symbol: ENJUSDT
+ asset_class: DERIVATIVE
+ base_asset: ENJ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6d64b790-bb5c-5d6c-9377-09b12c56b5eb
+ instrument_id: BINANCE.USDM.PERPETUAL.ENS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ENS-USDT
+ native_symbol: ENSUSDT
+ asset_class: DERIVATIVE
+ base_asset: ENS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d0b4908a-8eb5-5155-9c19-0880eb94aace
+ instrument_id: BINANCE.USDM.PERPETUAL.ENSO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ENSO-USDT
+ native_symbol: ENSOUSDT
+ asset_class: DERIVATIVE
+ base_asset: ENSO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c684a346-4477-5d60-a3a2-07907ea6657c
+ instrument_id: BINANCE.USDM.PERPETUAL.ESP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ESP-USDT
+ native_symbol: ESPUSDT
+ asset_class: DERIVATIVE
+ base_asset: ESP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e11e62f8-26b3-5d07-8bfe-1d4603547dc9
+ instrument_id: BINANCE.USDM.PERPETUAL.ETC-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ETC-USDT
+ native_symbol: ETCUSDT
+ asset_class: DERIVATIVE
+ base_asset: ETC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0723c5e4-0af0-59a3-a7c6-d9c9c36968af
+ instrument_id: BINANCE.USDM.PERPETUAL.ETHFI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ETHFI-USDT
+ native_symbol: ETHFIUSDT
+ asset_class: DERIVATIVE
+ base_asset: ETHFI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 870270bb-8d67-5eee-82e5-93f24b2fcdb1
+ instrument_id: BINANCE.USDM.PERPETUAL.ETHW-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ETHW-USDT
+ native_symbol: ETHWUSDT
+ asset_class: DERIVATIVE
+ base_asset: ETHW
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 922e938c-8c6b-5c10-a6bd-8e21a0db4b35
+ instrument_id: BINANCE.USDM.PERPETUAL.F-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: F-USDT
+ native_symbol: FUSDT
+ asset_class: DERIVATIVE
+ base_asset: F
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 3a14f40f-96cf-5810-8931-35ac5b2538b1
+ instrument_id: BINANCE.USDM.PERPETUAL.FARTCOIN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: FARTCOIN-USDT
+ native_symbol: FARTCOINUSDT
+ asset_class: DERIVATIVE
+ base_asset: FARTCOIN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e70f56d4-69db-5b2c-9484-de67bd4ec8bf
+ instrument_id: BINANCE.USDM.PERPETUAL.FIL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: FIL-USDT
+ native_symbol: FILUSDT
+ asset_class: DERIVATIVE
+ base_asset: FIL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 30e34c60-350e-5d13-8341-fe76633080c3
+ instrument_id: BINANCE.USDM.PERPETUAL.FLOW-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: FLOW-USDT
+ native_symbol: FLOWUSDT
+ asset_class: DERIVATIVE
+ base_asset: FLOW
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d3a82a86-2d20-5b86-b9fe-5e53176d94d7
+ instrument_id: BINANCE.USDM.PERPETUAL.FOGO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: FOGO-USDT
+ native_symbol: FOGOUSDT
+ asset_class: DERIVATIVE
+ base_asset: FOGO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f2816e98-1b6c-5558-a201-02b744d72cc3
+ instrument_id: BINANCE.USDM.PERPETUAL.GALA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GALA-USDT
+ native_symbol: GALAUSDT
+ asset_class: DERIVATIVE
+ base_asset: GALA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e52590aa-7cd3-5cc9-9fd6-71026ee0eb26
+ instrument_id: BINANCE.USDM.PERPETUAL.GAS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GAS-USDT
+ native_symbol: GASUSDT
+ asset_class: DERIVATIVE
+ base_asset: GAS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: cf1b39f8-e1e2-5826-9683-67f3a1e11da8
+ instrument_id: BINANCE.USDM.PERPETUAL.GIGGLE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GIGGLE-USDT
+ native_symbol: GIGGLEUSDT
+ asset_class: DERIVATIVE
+ base_asset: GIGGLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01000'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 24a32009-108b-54bd-b8ba-3806976c4053
+ instrument_id: BINANCE.USDM.PERPETUAL.GLM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GLM-USDT
+ native_symbol: GLMUSDT
+ asset_class: DERIVATIVE
+ base_asset: GLM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 78148a03-d1cf-5907-a639-ccbcbb0975fd
+ instrument_id: BINANCE.USDM.PERPETUAL.GMT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GMT-USDT
+ native_symbol: GMTUSDT
+ asset_class: DERIVATIVE
+ base_asset: GMT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 77296e5e-bb08-5aa2-94e0-96d7e7adb517
+ instrument_id: BINANCE.USDM.PERPETUAL.GMX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GMX-USDT
+ native_symbol: GMXUSDT
+ asset_class: DERIVATIVE
+ base_asset: GMX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 935b8777-171b-5d46-94d7-cc6d55e57ea3
+ instrument_id: BINANCE.USDM.PERPETUAL.GPS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GPS-USDT
+ native_symbol: GPSUSDT
+ asset_class: DERIVATIVE
+ base_asset: GPS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 23552d71-b038-5575-97b9-3ae8604876d0
+ instrument_id: BINANCE.USDM.PERPETUAL.GRAM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GRAM-USDT
+ native_symbol: GRAMUSDT
+ asset_class: DERIVATIVE
+ base_asset: GRAM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e395cb40-0cbd-5603-83b9-9c30ec14b062
+ instrument_id: BINANCE.USDM.PERPETUAL.GRASS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GRASS-USDT
+ native_symbol: GRASSUSDT
+ asset_class: DERIVATIVE
+ base_asset: GRASS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a1899d6f-1b1b-53e4-9f6d-53850d91f93b
+ instrument_id: BINANCE.USDM.PERPETUAL.GRT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GRT-USDT
+ native_symbol: GRTUSDT
+ asset_class: DERIVATIVE
+ base_asset: GRT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6765fdee-a03e-5596-bed2-a33b415087d8
+ instrument_id: BINANCE.USDM.PERPETUAL.GRVT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: GRVT-USDT
+ native_symbol: GRVTUSDT
+ asset_class: DERIVATIVE
+ base_asset: GRVT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 72f3bbcf-3630-5e35-b583-5721f484266b
+ instrument_id: BINANCE.USDM.PERPETUAL.H-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: H-USDT
+ native_symbol: HUSDT
+ asset_class: DERIVATIVE
+ base_asset: H
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bfbd909d-851e-5b08-93f3-197719ad65e2
+ instrument_id: BINANCE.USDM.PERPETUAL.HBAR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: HBAR-USDT
+ native_symbol: HBARUSDT
+ asset_class: DERIVATIVE
+ base_asset: HBAR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 05658343-bcbb-5aed-87b2-1ce21349e227
+ instrument_id: BINANCE.USDM.PERPETUAL.HMSTR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: HMSTR-USDT
+ native_symbol: HMSTRUSDT
+ asset_class: DERIVATIVE
+ base_asset: HMSTR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 933546f2-5d49-5a75-9313-231ce70bf001
+ instrument_id: BINANCE.USDM.PERPETUAL.HOME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: HOME-USDT
+ native_symbol: HOMEUSDT
+ asset_class: DERIVATIVE
+ base_asset: HOME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 486818ad-fab1-522c-bb5c-9258c3911afe
+ instrument_id: BINANCE.USDM.PERPETUAL.HUMA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: HUMA-USDT
+ native_symbol: HUMAUSDT
+ asset_class: DERIVATIVE
+ base_asset: HUMA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: fdfdbfc0-5545-5fb1-bd8f-5c4a345ada59
+ instrument_id: BINANCE.USDM.PERPETUAL.HYPE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: HYPE-USDT
+ native_symbol: HYPEUSDT
+ asset_class: DERIVATIVE
+ base_asset: HYPE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00100'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 61352f58-1260-5a3f-a4c3-389c74b74ec5
+ instrument_id: BINANCE.USDM.PERPETUAL.ICP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ICP-USDT
+ native_symbol: ICPUSDT
+ asset_class: DERIVATIVE
+ base_asset: ICP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6aeb7e7c-9024-5160-8ede-be20c6d489d3
+ instrument_id: BINANCE.USDM.PERPETUAL.IMX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: IMX-USDT
+ native_symbol: IMXUSDT
+ asset_class: DERIVATIVE
+ base_asset: IMX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: dfbcd529-82a2-52f0-892c-529e0a38c350
+ instrument_id: BINANCE.USDM.PERPETUAL.INIT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: INIT-USDT
+ native_symbol: INITUSDT
+ asset_class: DERIVATIVE
+ base_asset: INIT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 2ba7c8e9-f2a8-5816-8b2d-9d6b0b0a6cd3
+ instrument_id: BINANCE.USDM.PERPETUAL.INJ-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: INJ-USDT
+ native_symbol: INJUSDT
+ asset_class: DERIVATIVE
+ base_asset: INJ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 00d1d68e-45b0-5cbf-9825-15ba00cb6a66
+ instrument_id: BINANCE.USDM.PERPETUAL.IOST-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: IOST-USDT
+ native_symbol: IOSTUSDT
+ asset_class: DERIVATIVE
+ base_asset: IOST
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0f8b8578-7850-5863-929a-d3292a9cba31
+ instrument_id: BINANCE.USDM.PERPETUAL.IOTA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: IOTA-USDT
+ native_symbol: IOTAUSDT
+ asset_class: DERIVATIVE
+ base_asset: IOTA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9492e60f-ef93-54c1-8a82-120a66af229a
+ instrument_id: BINANCE.USDM.PERPETUAL.IRYS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: IRYS-USDT
+ native_symbol: IRYSUSDT
+ asset_class: DERIVATIVE
+ base_asset: IRYS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e8fe4622-da4d-5922-a87c-eddfb07c88f6
+ instrument_id: BINANCE.USDM.PERPETUAL.JELLYJELLY-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: JELLYJELLY-USDT
+ native_symbol: JELLYJELLYUSDT
+ asset_class: DERIVATIVE
+ base_asset: JELLYJELLY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ab468c88-f893-52e4-8334-f04ec8907fa6
+ instrument_id: BINANCE.USDM.PERPETUAL.JTO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: JTO-USDT
+ native_symbol: JTOUSDT
+ asset_class: DERIVATIVE
+ base_asset: JTO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 2e9f13cf-f529-575b-bb66-6caea3ee1a14
+ instrument_id: BINANCE.USDM.PERPETUAL.JUP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: JUP-USDT
+ native_symbol: JUPUSDT
+ asset_class: DERIVATIVE
+ base_asset: JUP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 47574e33-d716-5573-ab29-c2a3635f6aeb
+ instrument_id: BINANCE.USDM.PERPETUAL.KAITO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: KAITO-USDT
+ native_symbol: KAITOUSDT
+ asset_class: DERIVATIVE
+ base_asset: KAITO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0d772919-4b2c-57f4-9543-a60eb316e676
+ instrument_id: BINANCE.USDM.PERPETUAL.KAT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: KAT-USDT
+ native_symbol: KATUSDT
+ asset_class: DERIVATIVE
+ base_asset: KAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a570e234-e1e3-5c85-aade-f95859ac928a
+ instrument_id: BINANCE.USDM.PERPETUAL.KGEN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: KGEN-USDT
+ native_symbol: KGENUSDT
+ asset_class: DERIVATIVE
+ base_asset: KGEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7270dafa-54f4-5bc8-8190-71b330ee95b5
+ instrument_id: BINANCE.USDM.PERPETUAL.KITE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: KITE-USDT
+ native_symbol: KITEUSDT
+ asset_class: DERIVATIVE
+ base_asset: KITE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6a503e86-9477-53de-be2a-2e9af1fd5163
+ instrument_id: BINANCE.USDM.PERPETUAL.KMNO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: KMNO-USDT
+ native_symbol: KMNOUSDT
+ asset_class: DERIVATIVE
+ base_asset: KMNO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 5a5e88ec-7e10-5f61-9b23-78aacd43ad1d
+ instrument_id: BINANCE.USDM.PERPETUAL.KSM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: KSM-USDT
+ native_symbol: KSMUSDT
+ asset_class: DERIVATIVE
+ base_asset: KSM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 91733082-acf5-569b-8029-1e38ed470d51
+ instrument_id: BINANCE.USDM.PERPETUAL.LA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LA-USDT
+ native_symbol: LAUSDT
+ asset_class: DERIVATIVE
+ base_asset: LA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 2a8062eb-9c40-5101-9711-45c6d0a0b02a
+ instrument_id: BINANCE.USDM.PERPETUAL.LAB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LAB-USDT
+ native_symbol: LABUSDT
+ asset_class: DERIVATIVE
+ base_asset: LAB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ed47715e-b8e0-53b8-a82c-686b40c69eaa
+ instrument_id: BINANCE.USDM.PERPETUAL.LAYER-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LAYER-USDT
+ native_symbol: LAYERUSDT
+ asset_class: DERIVATIVE
+ base_asset: LAYER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 01c74f7d-2449-5630-b743-f563a900108b
+ instrument_id: BINANCE.USDM.PERPETUAL.LDO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LDO-USDT
+ native_symbol: LDOUSDT
+ asset_class: DERIVATIVE
+ base_asset: LDO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 334e1fb1-c81f-5660-b445-87aa58b5e0b4
+ instrument_id: BINANCE.USDM.PERPETUAL.LINEA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LINEA-USDT
+ native_symbol: LINEAUSDT
+ asset_class: DERIVATIVE
+ base_asset: LINEA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: de05bab8-6979-5f2a-ac65-fe3ca6141157
+ instrument_id: BINANCE.USDM.PERPETUAL.LINK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LINK-USDT
+ native_symbol: LINKUSDT
+ asset_class: DERIVATIVE
+ base_asset: LINK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8832e103-2121-5ef4-b1c0-d8e55e1f40e9
+ instrument_id: BINANCE.USDM.PERPETUAL.LIT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LIT-USDT
+ native_symbol: LITUSDT
+ asset_class: DERIVATIVE
+ base_asset: LIT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 746233b9-ee75-5cbc-8a6c-daa63a4d82ce
+ instrument_id: BINANCE.USDM.PERPETUAL.LPT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LPT-USDT
+ native_symbol: LPTUSDT
+ asset_class: DERIVATIVE
+ base_asset: LPT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 327e2814-ea95-5cc6-a8d9-d6c2952dae9f
+ instrument_id: BINANCE.USDM.PERPETUAL.LQTY-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LQTY-USDT
+ native_symbol: LQTYUSDT
+ asset_class: DERIVATIVE
+ base_asset: LQTY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e4cebf99-5916-5aa6-ab39-f66cbecba1ca
+ instrument_id: BINANCE.USDM.PERPETUAL.LTC-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: LTC-USDT
+ native_symbol: LTCUSDT
+ asset_class: DERIVATIVE
+ base_asset: LTC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a478a674-5118-59a0-8a89-49f9d9d17910
+ instrument_id: BINANCE.USDM.PERPETUAL.MAGIC-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MAGIC-USDT
+ native_symbol: MAGICUSDT
+ asset_class: DERIVATIVE
+ base_asset: MAGIC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 2a49a9f8-c5b7-546d-b55f-9cacf4855532
+ instrument_id: BINANCE.USDM.PERPETUAL.MANA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MANA-USDT
+ native_symbol: MANAUSDT
+ asset_class: DERIVATIVE
+ base_asset: MANA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d3583ef9-febd-54a0-9d23-5a2f62f6dbbe
+ instrument_id: BINANCE.USDM.PERPETUAL.MASK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MASK-USDT
+ native_symbol: MASKUSDT
+ asset_class: DERIVATIVE
+ base_asset: MASK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7fec48ed-999d-52ef-8872-bbda8b1dffe7
+ instrument_id: BINANCE.USDM.PERPETUAL.ME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ME-USDT
+ native_symbol: MEUSDT
+ asset_class: DERIVATIVE
+ base_asset: ME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8425e4e9-5eef-59fe-aee3-50a5616aa529
+ instrument_id: BINANCE.USDM.PERPETUAL.MEGA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MEGA-USDT
+ native_symbol: MEGAUSDT
+ asset_class: DERIVATIVE
+ base_asset: MEGA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6253da80-82c8-5692-9d71-73a071d66ca8
+ instrument_id: BINANCE.USDM.PERPETUAL.MEME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MEME-USDT
+ native_symbol: MEMEUSDT
+ asset_class: DERIVATIVE
+ base_asset: MEME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 4948e3b5-3037-57ba-88da-3b10f69d0627
+ instrument_id: BINANCE.USDM.PERPETUAL.MERL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MERL-USDT
+ native_symbol: MERLUSDT
+ asset_class: DERIVATIVE
+ base_asset: MERL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d397ccef-78a6-582e-a22a-52f39137a180
+ instrument_id: BINANCE.USDM.PERPETUAL.MET-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MET-USDT
+ native_symbol: METUSDT
+ asset_class: DERIVATIVE
+ base_asset: MET
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: af23ec18-0a39-56bf-ac1b-87d5e2248251
+ instrument_id: BINANCE.USDM.PERPETUAL.METIS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: METIS-USDT
+ native_symbol: METISUSDT
+ asset_class: DERIVATIVE
+ base_asset: METIS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0010'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9446e524-b1ae-5e7b-96ac-b699a171c87b
+ instrument_id: BINANCE.USDM.PERPETUAL.MEW-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MEW-USDT
+ native_symbol: MEWUSDT
+ asset_class: DERIVATIVE
+ base_asset: MEW
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f5fb66fd-577f-59cf-87a4-9d1d43547626
+ instrument_id: BINANCE.USDM.PERPETUAL.MINA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MINA-USDT
+ native_symbol: MINAUSDT
+ asset_class: DERIVATIVE
+ base_asset: MINA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b96798e4-730a-5634-8c1a-8a4094b01660
+ instrument_id: BINANCE.USDM.PERPETUAL.MMT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MMT-USDT
+ native_symbol: MMTUSDT
+ asset_class: DERIVATIVE
+ base_asset: MMT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9fb02777-3d2f-51bd-86e9-a37e52224326
+ instrument_id: BINANCE.USDM.PERPETUAL.MON-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MON-USDT
+ native_symbol: MONUSDT
+ asset_class: DERIVATIVE
+ base_asset: MON
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d155abb8-8f0f-5934-81cc-39f102c4f2f5
+ instrument_id: BINANCE.USDM.PERPETUAL.MOODENG-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MOODENG-USDT
+ native_symbol: MOODENGUSDT
+ asset_class: DERIVATIVE
+ base_asset: MOODENG
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d4f4fccc-77ba-584a-893d-db5c7fe40d9a
+ instrument_id: BINANCE.USDM.PERPETUAL.MORPHO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MORPHO-USDT
+ native_symbol: MORPHOUSDT
+ asset_class: DERIVATIVE
+ base_asset: MORPHO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 5dd80de2-abd6-5fd9-aae6-2eb0fc73738b
+ instrument_id: BINANCE.USDM.PERPETUAL.MOVE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MOVE-USDT
+ native_symbol: MOVEUSDT
+ asset_class: DERIVATIVE
+ base_asset: MOVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 841529df-3a07-505f-b19e-dde3762242cf
+ instrument_id: BINANCE.USDM.PERPETUAL.MUBARAK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: MUBARAK-USDT
+ native_symbol: MUBARAKUSDT
+ asset_class: DERIVATIVE
+ base_asset: MUBARAK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: be066d07-eee6-50a8-a137-73949877eeea
+ instrument_id: BINANCE.USDM.PERPETUAL.NEAR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: NEAR-USDT
+ native_symbol: NEARUSDT
+ asset_class: DERIVATIVE
+ base_asset: NEAR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 47ad1648-48ef-50a8-9daf-c8beadd93cdb
+ instrument_id: BINANCE.USDM.PERPETUAL.NEIRO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: NEIRO-USDT
+ native_symbol: NEIROUSDT
+ asset_class: DERIVATIVE
+ base_asset: NEIRO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 18112b74-b3c6-5c66-aeac-33daaf604127
+ instrument_id: BINANCE.USDM.PERPETUAL.NEO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: NEO-USDT
+ native_symbol: NEOUSDT
+ asset_class: DERIVATIVE
+ base_asset: NEO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 28387599-f1ea-5df6-a4f2-a04aa341c5d0
+ instrument_id: BINANCE.USDM.PERPETUAL.NIGHT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: NIGHT-USDT
+ native_symbol: NIGHTUSDT
+ asset_class: DERIVATIVE
+ base_asset: NIGHT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 13d30031-2c7c-5df3-a625-d9aa62e58106
+ instrument_id: BINANCE.USDM.PERPETUAL.NMR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: NMR-USDT
+ native_symbol: NMRUSDT
+ asset_class: DERIVATIVE
+ base_asset: NMR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: afb33b46-b1fd-53cf-8df6-7c881c12f6a1
+ instrument_id: BINANCE.USDM.PERPETUAL.NOT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: NOT-USDT
+ native_symbol: NOTUSDT
+ asset_class: DERIVATIVE
+ base_asset: NOT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 830f340b-3646-5066-b5e7-4d0b126a44fe
+ instrument_id: BINANCE.USDM.PERPETUAL.O-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: O-USDT
+ native_symbol: OUSDT
+ asset_class: DERIVATIVE
+ base_asset: O
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f888a2f7-79c3-5a8f-9170-cca6be1325f5
+ instrument_id: BINANCE.USDM.PERPETUAL.ON-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ON-USDT
+ native_symbol: ONUSDT
+ asset_class: DERIVATIVE
+ base_asset: 'ON'
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d909a518-8b6e-5286-ad80-ac435c739328
+ instrument_id: BINANCE.USDM.PERPETUAL.ONDO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ONDO-USDT
+ native_symbol: ONDOUSDT
+ asset_class: DERIVATIVE
+ base_asset: ONDO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 473238ca-4cf4-5dcf-8dd6-8731dd1d10f5
+ instrument_id: BINANCE.USDM.PERPETUAL.ONE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ONE-USDT
+ native_symbol: ONEUSDT
+ asset_class: DERIVATIVE
+ base_asset: ONE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ef08a051-1cfb-5456-83e2-a0ceff1a1bf4
+ instrument_id: BINANCE.USDM.PERPETUAL.ONT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ONT-USDT
+ native_symbol: ONTUSDT
+ asset_class: DERIVATIVE
+ base_asset: ONT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 944cf7e3-3429-5f32-9b47-594aa0c525c1
+ instrument_id: BINANCE.USDM.PERPETUAL.OP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: OP-USDT
+ native_symbol: OPUSDT
+ asset_class: DERIVATIVE
+ base_asset: OP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 5c42b635-5750-5801-82a7-95ed1d3d6e31
+ instrument_id: BINANCE.USDM.PERPETUAL.OPG-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: OPG-USDT
+ native_symbol: OPGUSDT
+ asset_class: DERIVATIVE
+ base_asset: OPG
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 172daa75-28b7-5d37-a0bd-86a43f7d17b9
+ instrument_id: BINANCE.USDM.PERPETUAL.OPN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: OPN-USDT
+ native_symbol: OPNUSDT
+ asset_class: DERIVATIVE
+ base_asset: OPN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9603abcf-8d45-588f-a676-2872dc3c62ba
+ instrument_id: BINANCE.USDM.PERPETUAL.ORDER-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ORDER-USDT
+ native_symbol: ORDERUSDT
+ asset_class: DERIVATIVE
+ base_asset: ORDER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ea9b707d-7913-5476-b9c7-a17a3c42d7c9
+ instrument_id: BINANCE.USDM.PERPETUAL.ORDI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ORDI-USDT
+ native_symbol: ORDIUSDT
+ asset_class: DERIVATIVE
+ base_asset: ORDI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: af73725a-ff81-59f4-980d-06bd4cc2c082
+ instrument_id: BINANCE.USDM.PERPETUAL.PENDLE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PENDLE-USDT
+ native_symbol: PENDLEUSDT
+ asset_class: DERIVATIVE
+ base_asset: PENDLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c76c9c52-1ca5-5d63-a9c4-03b9df5954b6
+ instrument_id: BINANCE.USDM.PERPETUAL.PENGU-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PENGU-USDT
+ native_symbol: PENGUUSDT
+ asset_class: DERIVATIVE
+ base_asset: PENGU
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: af7e715a-ccad-5012-9fd4-bd7c16d4fcc2
+ instrument_id: BINANCE.USDM.PERPETUAL.PEOPLE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PEOPLE-USDT
+ native_symbol: PEOPLEUSDT
+ asset_class: DERIVATIVE
+ base_asset: PEOPLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e4e0e48e-9508-50c5-bce5-0abce19965b9
+ instrument_id: BINANCE.USDM.PERPETUAL.PIEVERSE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PIEVERSE-USDT
+ native_symbol: PIEVERSEUSDT
+ asset_class: DERIVATIVE
+ base_asset: PIEVERSE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bdf97724-b6a0-5891-801a-a6a951c9174e
+ instrument_id: BINANCE.USDM.PERPETUAL.PIPPIN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PIPPIN-USDT
+ native_symbol: PIPPINUSDT
+ asset_class: DERIVATIVE
+ base_asset: PIPPIN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7d3db013-5ac0-5483-ba8b-0f03441f5672
+ instrument_id: BINANCE.USDM.PERPETUAL.PLUME-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PLUME-USDT
+ native_symbol: PLUMEUSDT
+ asset_class: DERIVATIVE
+ base_asset: PLUME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8b09286f-23d1-5740-8372-4a34941d74b7
+ instrument_id: BINANCE.USDM.PERPETUAL.PNUT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PNUT-USDT
+ native_symbol: PNUTUSDT
+ asset_class: DERIVATIVE
+ base_asset: PNUT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d152df3e-e0d3-59b1-ba1f-7fa427418803
+ instrument_id: BINANCE.USDM.PERPETUAL.POL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: POL-USDT
+ native_symbol: POLUSDT
+ asset_class: DERIVATIVE
+ base_asset: POL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 145d10f1-0ec4-56ef-8098-050c7991da3a
+ instrument_id: BINANCE.USDM.PERPETUAL.POPCAT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: POPCAT-USDT
+ native_symbol: POPCATUSDT
+ asset_class: DERIVATIVE
+ base_asset: POPCAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8375c606-0c2b-5e50-8f16-64650fcdedc0
+ instrument_id: BINANCE.USDM.PERPETUAL.PROVE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PROVE-USDT
+ native_symbol: PROVEUSDT
+ asset_class: DERIVATIVE
+ base_asset: PROVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: aa92932b-1957-545f-825d-8d62cff956cb
+ instrument_id: BINANCE.USDM.PERPETUAL.PUMP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PUMP-USDT
+ native_symbol: PUMPUSDT
+ asset_class: DERIVATIVE
+ base_asset: PUMP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a0d9742b-a58d-5cbf-808a-efe8de857cbe
+ instrument_id: BINANCE.USDM.PERPETUAL.PYTH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: PYTH-USDT
+ native_symbol: PYTHUSDT
+ asset_class: DERIVATIVE
+ base_asset: PYTH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 9c67e4be-b8bd-5203-ae50-445479a4a48e
+ instrument_id: BINANCE.USDM.PERPETUAL.QNT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: QNT-USDT
+ native_symbol: QNTUSDT
+ asset_class: DERIVATIVE
+ base_asset: QNT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.010000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 875e2059-18c6-5e10-bfbe-67894b86386c
+ instrument_id: BINANCE.USDM.PERPETUAL.QTUM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: QTUM-USDT
+ native_symbol: QTUMUSDT
+ asset_class: DERIVATIVE
+ base_asset: QTUM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d0a88aa5-d055-594d-9db7-fb56b8c06680
+ instrument_id: BINANCE.USDM.PERPETUAL.RAVE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RAVE-USDT
+ native_symbol: RAVEUSDT
+ asset_class: DERIVATIVE
+ base_asset: RAVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8540dfa8-3e81-5216-88b2-9a551d94fd6f
+ instrument_id: BINANCE.USDM.PERPETUAL.RE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RE-USDT
+ native_symbol: REUSDT
+ asset_class: DERIVATIVE
+ base_asset: RE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a5b65023-ca4e-522a-a14a-42d57ed978a9
+ instrument_id: BINANCE.USDM.PERPETUAL.RECALL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RECALL-USDT
+ native_symbol: RECALLUSDT
+ asset_class: DERIVATIVE
+ base_asset: RECALL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 26260988-93d4-536e-8400-f3fadbd530de
+ instrument_id: BINANCE.USDM.PERPETUAL.RENDER-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RENDER-USDT
+ native_symbol: RENDERUSDT
+ asset_class: DERIVATIVE
+ base_asset: RENDER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0010000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b7b526a6-9361-5d6f-b4cc-f33a0ed80d47
+ instrument_id: BINANCE.USDM.PERPETUAL.RESOLV-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RESOLV-USDT
+ native_symbol: RESOLVUSDT
+ asset_class: DERIVATIVE
+ base_asset: RESOLV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 397bdb54-bb4c-57d8-ba48-ab6b6712428a
+ instrument_id: BINANCE.USDM.PERPETUAL.RIVER-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RIVER-USDT
+ native_symbol: RIVERUSDT
+ asset_class: DERIVATIVE
+ base_asset: RIVER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: b9c46ba4-1d0f-5fbe-a751-b2bd086f5a23
+ instrument_id: BINANCE.USDM.PERPETUAL.ROBO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ROBO-USDT
+ native_symbol: ROBOUSDT
+ asset_class: DERIVATIVE
+ base_asset: ROBO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0eee0320-f54c-50c6-8c31-cedc978f4246
+ instrument_id: BINANCE.USDM.PERPETUAL.RSR-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RSR-USDT
+ native_symbol: RSRUSDT
+ asset_class: DERIVATIVE
+ base_asset: RSR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 555b8bc8-ad58-5bea-83ef-0a59f7d8032f
+ instrument_id: BINANCE.USDM.PERPETUAL.RVN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: RVN-USDT
+ native_symbol: RVNUSDT
+ asset_class: DERIVATIVE
+ base_asset: RVN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 29b5753d-f377-5c23-8df5-e40e8f7df423
+ instrument_id: BINANCE.USDM.PERPETUAL.S-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: S-USDT
+ native_symbol: SUSDT
+ asset_class: DERIVATIVE
+ base_asset: S
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: cc0ebfed-f4ea-55dd-a7a6-fa83ff72befc
+ instrument_id: BINANCE.USDM.PERPETUAL.SAHARA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SAHARA-USDT
+ native_symbol: SAHARAUSDT
+ asset_class: DERIVATIVE
+ base_asset: SAHARA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f693e7fa-26b4-554f-b4ab-5d34841777e5
+ instrument_id: BINANCE.USDM.PERPETUAL.SAND-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SAND-USDT
+ native_symbol: SANDUSDT
+ asset_class: DERIVATIVE
+ base_asset: SAND
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 17c00406-ec03-5025-8703-ed77896ef07c
+ instrument_id: BINANCE.USDM.PERPETUAL.SAPIEN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SAPIEN-USDT
+ native_symbol: SAPIENUSDT
+ asset_class: DERIVATIVE
+ base_asset: SAPIEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bcd51a8d-2e9f-5c7e-9796-eda0427c43b1
+ instrument_id: BINANCE.USDM.PERPETUAL.SEI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SEI-USDT
+ native_symbol: SEIUSDT
+ asset_class: DERIVATIVE
+ base_asset: SEI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 3e2393ec-4ff4-5722-bc6d-01f7085e84d5
+ instrument_id: BINANCE.USDM.PERPETUAL.SENT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SENT-USDT
+ native_symbol: SENTUSDT
+ asset_class: DERIVATIVE
+ base_asset: SENT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6af3697a-83a0-5c72-9e1f-22a111c47cd4
+ instrument_id: BINANCE.USDM.PERPETUAL.SIGN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SIGN-USDT
+ native_symbol: SIGNUSDT
+ asset_class: DERIVATIVE
+ base_asset: SIGN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c62e2e82-9528-5d8b-96d5-2b22eaa4badd
+ instrument_id: BINANCE.USDM.PERPETUAL.SKY-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SKY-USDT
+ native_symbol: SKYUSDT
+ asset_class: DERIVATIVE
+ base_asset: SKY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d7ab8d28-d6c2-5fab-876c-c968296b482d
+ instrument_id: BINANCE.USDM.PERPETUAL.SLX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SLX-USDT
+ native_symbol: SLXUSDT
+ asset_class: DERIVATIVE
+ base_asset: SLX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e1c5a42c-cd07-53de-b750-372fe3f3879a
+ instrument_id: BINANCE.USDM.PERPETUAL.SNX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SNX-USDT
+ native_symbol: SNXUSDT
+ asset_class: DERIVATIVE
+ base_asset: SNX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a2ecb519-7c65-5c8e-b489-b6b0aa663e53
+ instrument_id: BINANCE.USDM.PERPETUAL.SOON-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SOON-USDT
+ native_symbol: SOONUSDT
+ asset_class: DERIVATIVE
+ base_asset: SOON
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 1422c865-e99b-5cad-90dc-8f3ba4166691
+ instrument_id: BINANCE.USDM.PERPETUAL.SOPH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SOPH-USDT
+ native_symbol: SOPHUSDT
+ asset_class: DERIVATIVE
+ base_asset: SOPH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0e94d287-5960-5af4-89d2-a14bf24d8595
+ instrument_id: BINANCE.USDM.PERPETUAL.SPACE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SPACE-USDT
+ native_symbol: SPACEUSDT
+ asset_class: DERIVATIVE
+ base_asset: SPACE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d4ab40bf-f09d-5fe5-9d04-e9f3fef19d69
+ instrument_id: BINANCE.USDM.PERPETUAL.SPK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SPK-USDT
+ native_symbol: SPKUSDT
+ asset_class: DERIVATIVE
+ base_asset: SPK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 3d2403d3-44cb-5989-924f-946704ccc6b8
+ instrument_id: BINANCE.USDM.PERPETUAL.SPX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SPX-USDT
+ native_symbol: SPXUSDT
+ asset_class: DERIVATIVE
+ base_asset: SPX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 6f42584d-668f-5dab-80a1-a00058020e24
+ instrument_id: BINANCE.USDM.PERPETUAL.SSV-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SSV-USDT
+ native_symbol: SSVUSDT
+ asset_class: DERIVATIVE
+ base_asset: SSV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bc65c082-4ca8-5450-8597-f7f65a0ba923
+ instrument_id: BINANCE.USDM.PERPETUAL.STABLE-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: STABLE-USDT
+ native_symbol: STABLEUSDT
+ asset_class: DERIVATIVE
+ base_asset: STABLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 921f65bb-ef9f-5869-9a43-52655e58aad9
+ instrument_id: BINANCE.USDM.PERPETUAL.STRK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: STRK-USDT
+ native_symbol: STRKUSDT
+ asset_class: DERIVATIVE
+ base_asset: STRK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 64f3b5bb-feb8-5035-909d-fd5aaff1f7cc
+ instrument_id: BINANCE.USDM.PERPETUAL.STX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: STX-USDT
+ native_symbol: STXUSDT
+ asset_class: DERIVATIVE
+ base_asset: STX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 3c70b7c6-b026-5feb-8e8b-6693b7674f0a
+ instrument_id: BINANCE.USDM.PERPETUAL.SUI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SUI-USDT
+ native_symbol: SUIUSDT
+ asset_class: DERIVATIVE
+ base_asset: SUI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 28486f53-7cf2-5fc7-a18c-3b39524c2969
+ instrument_id: BINANCE.USDM.PERPETUAL.SUSHI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SUSHI-USDT
+ native_symbol: SUSHIUSDT
+ asset_class: DERIVATIVE
+ base_asset: SUSHI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 463ef46b-8665-5a5b-a9c8-259d2a4f18f6
+ instrument_id: BINANCE.USDM.PERPETUAL.SYRUP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: SYRUP-USDT
+ native_symbol: SYRUPUSDT
+ asset_class: DERIVATIVE
+ base_asset: SYRUP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: fe2efca0-97a3-5b71-977a-e64af44d657c
+ instrument_id: BINANCE.USDM.PERPETUAL.TAO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TAO-USDT
+ native_symbol: TAOUSDT
+ asset_class: DERIVATIVE
+ base_asset: TAO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 4e448108-2fdd-506a-9cf6-ca999736f8fb
+ instrument_id: BINANCE.USDM.PERPETUAL.THETA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: THETA-USDT
+ native_symbol: THETAUSDT
+ asset_class: DERIVATIVE
+ base_asset: THETA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 966b2e80-c83a-5ad2-bb60-af1daea63fca
+ instrument_id: BINANCE.USDM.PERPETUAL.TIA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TIA-USDT
+ native_symbol: TIAUSDT
+ asset_class: DERIVATIVE
+ base_asset: TIA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 07d4bbcf-2e5a-581c-81f5-a13caa3bfb0b
+ instrument_id: BINANCE.USDM.PERPETUAL.TRB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TRB-USDT
+ native_symbol: TRBUSDT
+ asset_class: DERIVATIVE
+ base_asset: TRB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 40ecf915-b50f-5552-ae3b-b11ba6ce7aac
+ instrument_id: BINANCE.USDM.PERPETUAL.TRIA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TRIA-USDT
+ native_symbol: TRIAUSDT
+ asset_class: DERIVATIVE
+ base_asset: TRIA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c7717222-2721-54a5-9119-4397db9205f0
+ instrument_id: BINANCE.USDM.PERPETUAL.TRUMP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TRUMP-USDT
+ native_symbol: TRUMPUSDT
+ asset_class: DERIVATIVE
+ base_asset: TRUMP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f6b38750-2d9a-52ff-b76e-9f26fb70bd46
+ instrument_id: BINANCE.USDM.PERPETUAL.TRUST-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TRUST-USDT
+ native_symbol: TRUSTUSDT
+ asset_class: DERIVATIVE
+ base_asset: TRUST
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f122c0e0-d424-55af-a030-a421e88e6549
+ instrument_id: BINANCE.USDM.PERPETUAL.TRUTH-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TRUTH-USDT
+ native_symbol: TRUTHUSDT
+ asset_class: DERIVATIVE
+ base_asset: TRUTH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 19c3628a-2fce-505b-bd05-aceefe47132e
+ instrument_id: BINANCE.USDM.PERPETUAL.TRX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TRX-USDT
+ native_symbol: TRXUSDT
+ asset_class: DERIVATIVE
+ base_asset: TRX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 51cce06a-7b90-5c59-be0e-433d02cc4f7e
+ instrument_id: BINANCE.USDM.PERPETUAL.TURBO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: TURBO-USDT
+ native_symbol: TURBOUSDT
+ asset_class: DERIVATIVE
+ base_asset: TURBO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a90edd17-ed7a-5b6e-90c6-b38c9de23edd
+ instrument_id: BINANCE.USDM.PERPETUAL.UB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: UB-USDT
+ native_symbol: UBUSDT
+ asset_class: DERIVATIVE
+ base_asset: UB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 54dfc708-50c9-5cb4-aff3-3a7b372014b3
+ instrument_id: BINANCE.USDM.PERPETUAL.UMA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: UMA-USDT
+ native_symbol: UMAUSDT
+ asset_class: DERIVATIVE
+ base_asset: UMA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c494f843-964d-549c-ae22-7831f47327ea
+ instrument_id: BINANCE.USDM.PERPETUAL.UNI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: UNI-USDT
+ native_symbol: UNIUSDT
+ asset_class: DERIVATIVE
+ base_asset: UNI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 96004c94-3fb4-5eba-863e-3e0167e7a606
+ instrument_id: BINANCE.USDM.PERPETUAL.USELESS-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: USELESS-USDT
+ native_symbol: USELESSUSDT
+ asset_class: DERIVATIVE
+ base_asset: USELESS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 2832d236-116d-5e82-92d8-c4faae68ab1e
+ instrument_id: BINANCE.USDM.PERPETUAL.VANA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: VANA-USDT
+ native_symbol: VANAUSDT
+ asset_class: DERIVATIVE
+ base_asset: VANA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8871d17f-b326-5ae6-9e7b-fd3dff2b0815
+ instrument_id: BINANCE.USDM.PERPETUAL.VIRTUAL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: VIRTUAL-USDT
+ native_symbol: VIRTUALUSDT
+ asset_class: DERIVATIVE
+ base_asset: VIRTUAL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f75e5f45-7f1b-5282-9acc-18800ba9364e
+ instrument_id: BINANCE.USDM.PERPETUAL.VVV-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: VVV-USDT
+ native_symbol: VVVUSDT
+ asset_class: DERIVATIVE
+ base_asset: VVV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001000'
+ quantity_step: '0.01'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 47d98081-d269-5aeb-9766-5f689e2c6b35
+ instrument_id: BINANCE.USDM.PERPETUAL.W-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: W-USDT
+ native_symbol: WUSDT
+ asset_class: DERIVATIVE
+ base_asset: W
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: be32efaa-307f-595b-bc0a-4f1e5e00aba2
+ instrument_id: BINANCE.USDM.PERPETUAL.WAL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WAL-USDT
+ native_symbol: WALUSDT
+ asset_class: DERIVATIVE
+ base_asset: WAL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ad64efb9-c362-5e43-a52d-369589b8f662
+ instrument_id: BINANCE.USDM.PERPETUAL.WCT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WCT-USDT
+ native_symbol: WCTUSDT
+ asset_class: DERIVATIVE
+ base_asset: WCT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 7228c509-3bf3-510f-9f00-63625011fc9b
+ instrument_id: BINANCE.USDM.PERPETUAL.WET-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WET-USDT
+ native_symbol: WETUSDT
+ asset_class: DERIVATIVE
+ base_asset: WET
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 1de09ca8-0a41-5153-96f2-edfb42bd4cd6
+ instrument_id: BINANCE.USDM.PERPETUAL.WIF-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WIF-USDT
+ native_symbol: WIFUSDT
+ asset_class: DERIVATIVE
+ base_asset: WIF
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: c4f936dd-3d28-54c6-8b01-30296462bbb9
+ instrument_id: BINANCE.USDM.PERPETUAL.WLD-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WLD-USDT
+ native_symbol: WLDUSDT
+ asset_class: DERIVATIVE
+ base_asset: WLD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bf08776d-5b74-54e8-8330-dd87635e9435
+ instrument_id: BINANCE.USDM.PERPETUAL.WLFI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WLFI-USDT
+ native_symbol: WLFIUSDT
+ asset_class: DERIVATIVE
+ base_asset: WLFI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a76febbe-c89f-5d57-b68a-3089e7b1a512
+ instrument_id: BINANCE.USDM.PERPETUAL.WOO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: WOO-USDT
+ native_symbol: WOOUSDT
+ asset_class: DERIVATIVE
+ base_asset: WOO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: fa2e9712-8ce9-538a-8b92-37c85401156c
+ instrument_id: BINANCE.USDM.PERPETUAL.XLM-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: XLM-USDT
+ native_symbol: XLMUSDT
+ asset_class: DERIVATIVE
+ base_asset: XLM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: bf47b0d3-dd95-53fe-be70-52a0d8975e44
+ instrument_id: BINANCE.USDM.PERPETUAL.XPL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: XPL-USDT
+ native_symbol: XPLUSDT
+ asset_class: DERIVATIVE
+ base_asset: XPL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 8947d88d-729a-59a7-bb25-3e1189b7a5ac
+ instrument_id: BINANCE.USDM.PERPETUAL.XRP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: XRP-USDT
+ native_symbol: XRPUSDT
+ asset_class: DERIVATIVE
+ base_asset: XRP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: f6a20794-dd2f-5d62-943e-dadb6e05749b
+ instrument_id: BINANCE.USDM.PERPETUAL.XTZ-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: XTZ-USDT
+ native_symbol: XTZUSDT
+ asset_class: DERIVATIVE
+ base_asset: XTZ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000100'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: afdb7e7f-fd83-5bd7-ac2b-5bfa08397f66
+ instrument_id: BINANCE.USDM.PERPETUAL.YB-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: YB-USDT
+ native_symbol: YBUSDT
+ asset_class: DERIVATIVE
+ base_asset: YB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 44cfd3f6-82e1-54be-981c-254d7f805ce5
+ instrument_id: BINANCE.USDM.PERPETUAL.YFI-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: YFI-USDT
+ native_symbol: YFIUSDT
+ asset_class: DERIVATIVE
+ base_asset: YFI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '1'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 94469df5-8e0e-5839-85c1-f6464481b1d3
+ instrument_id: BINANCE.USDM.PERPETUAL.YGG-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: YGG-USDT
+ native_symbol: YGGUSDT
+ asset_class: DERIVATIVE
+ base_asset: YGG
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: d4b0d87b-fdeb-5b7b-86bc-381ee82ecd1f
+ instrument_id: BINANCE.USDM.PERPETUAL.ZAMA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZAMA-USDT
+ native_symbol: ZAMAUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZAMA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 21b23463-7fd8-5950-9f2b-7fe1e67fedc0
+ instrument_id: BINANCE.USDM.PERPETUAL.ZBT-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZBT-USDT
+ native_symbol: ZBTUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZBT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 86b2ba7e-454f-53d0-b404-803f937583a5
+ instrument_id: BINANCE.USDM.PERPETUAL.ZEC-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZEC-USDT
+ native_symbol: ZECUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZEC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.001'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: ceddccfd-3365-5c05-bfb8-660f7ec23bad
+ instrument_id: BINANCE.USDM.PERPETUAL.ZEN-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZEN-USDT
+ native_symbol: ZENUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 5a093e28-0a61-5d94-adbf-5f88f221496a
+ instrument_id: BINANCE.USDM.PERPETUAL.ZETA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZETA-USDT
+ native_symbol: ZETAUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZETA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 4266e54f-5d02-511f-a9df-549689ea7361
+ instrument_id: BINANCE.USDM.PERPETUAL.ZIL-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZIL-USDT
+ native_symbol: ZILUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZIL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 0638ba89-f890-535a-9fc7-3358aa53179f
+ instrument_id: BINANCE.USDM.PERPETUAL.ZK-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZK-USDT
+ native_symbol: ZKUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 1efbe499-8627-57ba-bb85-3a4546926231
+ instrument_id: BINANCE.USDM.PERPETUAL.ZKP-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZKP-USDT
+ native_symbol: ZKPUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZKP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000100'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 1bee6fd7-6bff-59ec-8d72-50ffce31b6ed
+ instrument_id: BINANCE.USDM.PERPETUAL.ZORA-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZORA-USDT
+ native_symbol: ZORAUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZORA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000010'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: e10c1a3c-f11a-57d8-ba19-c3c04dbeb028
+ instrument_id: BINANCE.USDM.PERPETUAL.ZRO-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZRO-USDT
+ native_symbol: ZROUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZRO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001000'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: 5068359f-b79a-5501-833c-4bc0bdcddb8c
+ instrument_id: BINANCE.USDM.PERPETUAL.ZRX-USDT
+ metadata_revision: 1
+ venue: BINANCE
+ market: USDM
+ product_type: PERPETUAL
+ canonical_symbol: ZRX-USDT
+ native_symbol: ZRXUSDT
+ asset_class: DERIVATIVE
+ base_asset: ZRX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ contractType: PERPETUAL
+- instrument_uid: a3b5105d-867a-5642-8bd6-839890060801
+ instrument_id: OKX.SWAP.PERPETUAL.0G-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: 0G-USDT
+ native_symbol: 0G-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: 0G
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: 0G
+ groupId: '4'
+ instFamily: 0G-USDT
+ instIdCode: '228366'
+ uly: 0G-USDT
+- instrument_uid: 289763f0-b5a1-54c7-bba4-056f17165f0c
+ instrument_id: OKX.SWAP.PERPETUAL.1INCH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: 1INCH-USDT
+ native_symbol: 1INCH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: 1INCH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: 1INCH
+ groupId: '4'
+ instFamily: 1INCH-USDT
+ instIdCode: '10484'
+ uly: 1INCH-USDT
+- instrument_uid: adc4bf83-b054-5f94-8ff6-7678579db124
+ instrument_id: OKX.SWAP.PERPETUAL.2Z-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: 2Z-USDT
+ native_symbol: 2Z-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: 2Z
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: 2Z
+ groupId: '4'
+ instFamily: 2Z-USDT
+ instIdCode: '229769'
+ uly: 2Z-USDT
+- instrument_uid: a2098fe2-1ea7-524b-973a-51a12170995b
+ instrument_id: OKX.SWAP.PERPETUAL.A-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: A-USDT
+ native_symbol: A-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: A
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: A
+ groupId: '4'
+ instFamily: A-USDT
+ instIdCode: '212240'
+ uly: A-USDT
+- instrument_uid: f5a63ee0-7db9-5696-b84e-ab0d4b06ce2a
+ instrument_id: OKX.SWAP.PERPETUAL.AAVE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AAVE-USDT
+ native_symbol: AAVE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AAVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: AAVE
+ groupId: '4'
+ instFamily: AAVE-USDT
+ instIdCode: '10485'
+ uly: AAVE-USDT
+- instrument_uid: d51c82b5-73b7-59ac-9619-162ae56cbf31
+ instrument_id: OKX.SWAP.PERPETUAL.ACT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ACT-USDT
+ native_symbol: ACT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ACT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ACT
+ groupId: '4'
+ instFamily: ACT-USDT
+ instIdCode: '184433'
+ uly: ACT-USDT
+- instrument_uid: 256ec9a1-8d20-597a-b2fb-38f5dc1fe565
+ instrument_id: OKX.SWAP.PERPETUAL.ACU-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ACU-USDT
+ native_symbol: ACU-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ACU
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ACU
+ groupId: '4'
+ instFamily: ACU-USDT
+ instIdCode: '245693'
+ uly: ACU-USDT
+- instrument_uid: 4dfc6d0e-ead5-5b66-b680-ab4be9fcb006
+ instrument_id: OKX.SWAP.PERPETUAL.ADA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ADA-USDT
+ native_symbol: ADA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ADA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: ADA
+ groupId: '4'
+ instFamily: ADA-USDT
+ instIdCode: '10483'
+ uly: ADA-USDT
+- instrument_uid: f356265e-f401-5851-8157-ff8e294f34d2
+ instrument_id: OKX.SWAP.PERPETUAL.AERO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AERO-USDT
+ native_symbol: AERO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AERO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: AERO
+ groupId: '4'
+ instFamily: AERO-USDT
+ instIdCode: '216936'
+ uly: AERO-USDT
+- instrument_uid: 8c029be8-d578-5909-b2af-10ed4d7092c4
+ instrument_id: OKX.SWAP.PERPETUAL.AEVO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AEVO-USDT
+ native_symbol: AEVO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AEVO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: AEVO
+ groupId: '4'
+ instFamily: AEVO-USDT
+ instIdCode: '151594'
+ uly: AEVO-USDT
+- instrument_uid: 235049a1-cf7f-5522-b01e-e37d40f9369a
+ instrument_id: OKX.SWAP.PERPETUAL.AGLD-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AGLD-USDT
+ native_symbol: AGLD-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AGLD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: AGLD
+ groupId: '4'
+ instFamily: AGLD-USDT
+ instIdCode: '41191'
+ uly: AGLD-USDT
+- instrument_uid: 6060943d-4f6b-5a3f-a7b7-33e32b136f9f
+ instrument_id: OKX.SWAP.PERPETUAL.AIXBT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AIXBT-USDT
+ native_symbol: AIXBT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AIXBT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: AIXBT
+ groupId: '4'
+ instFamily: AIXBT-USDT
+ instIdCode: '191456'
+ uly: AIXBT-USDT
+- instrument_uid: fd7ff987-a411-5139-9f6b-e70c7f03d6e4
+ instrument_id: OKX.SWAP.PERPETUAL.ALGO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ALGO-USDT
+ native_symbol: ALGO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ALGO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ALGO
+ groupId: '4'
+ instFamily: ALGO-USDT
+ instIdCode: '10487'
+ uly: ALGO-USDT
+- instrument_uid: a640fd51-235d-59b7-b21a-c2e6b42e8eea
+ instrument_id: OKX.SWAP.PERPETUAL.ALLO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ALLO-USDT
+ native_symbol: ALLO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ALLO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ALLO
+ groupId: '4'
+ instFamily: ALLO-USDT
+ instIdCode: '235639'
+ uly: ALLO-USDT
+- instrument_uid: 8d97188f-2e7d-5da4-8119-f0a72b370ce0
+ instrument_id: OKX.SWAP.PERPETUAL.ANIME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ANIME-USDT
+ native_symbol: ANIME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ANIME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ANIME
+ groupId: '4'
+ instFamily: ANIME-USDT
+ instIdCode: '194315'
+ uly: ANIME-USDT
+- instrument_uid: 65a8ce81-79af-5f85-9e44-4475ae3605d2
+ instrument_id: OKX.SWAP.PERPETUAL.APE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: APE-USDT
+ native_symbol: APE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: APE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: APE
+ groupId: '4'
+ instFamily: APE-USDT
+ instIdCode: '80553'
+ uly: APE-USDT
+- instrument_uid: ea9eb608-383e-5b81-9669-6a4afbf2b530
+ instrument_id: OKX.SWAP.PERPETUAL.API3-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: API3-USDT
+ native_symbol: API3-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: API3
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: API3
+ groupId: '4'
+ instFamily: API3-USDT
+ instIdCode: '54789'
+ uly: API3-USDT
+- instrument_uid: 3972e5a1-86e2-5ad3-b618-fb0c3c3883b5
+ instrument_id: OKX.SWAP.PERPETUAL.APR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: APR-USDT
+ native_symbol: APR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: APR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: APR
+ groupId: '4'
+ instFamily: APR-USDT
+ instIdCode: '233018'
+ uly: APR-USDT
+- instrument_uid: 5165ddf3-9ae3-58de-ac8a-8d63ccaee28b
+ instrument_id: OKX.SWAP.PERPETUAL.APT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: APT-USDT
+ native_symbol: APT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: APT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: APT
+ groupId: '4'
+ instFamily: APT-USDT
+ instIdCode: '104900'
+ uly: APT-USDT
+- instrument_uid: f8054e3a-1f79-57fb-9b98-a21a24348e74
+ instrument_id: OKX.SWAP.PERPETUAL.AR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AR-USDT
+ native_symbol: AR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: AR
+ groupId: '4'
+ instFamily: AR-USDT
+ instIdCode: '114960'
+ uly: AR-USDT
+- instrument_uid: c93702ef-d71b-512e-8cc8-5ecd3615a644
+ instrument_id: OKX.SWAP.PERPETUAL.ARB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ARB-USDT
+ native_symbol: ARB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ARB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ARB
+ groupId: '4'
+ instFamily: ARB-USDT
+ instIdCode: '117782'
+ uly: ARB-USDT
+- instrument_uid: 98d5b8b5-75af-5e2b-b9ce-1d0480d98316
+ instrument_id: OKX.SWAP.PERPETUAL.ARKM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ARKM-USDT
+ native_symbol: ARKM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ARKM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ARKM
+ groupId: '4'
+ instFamily: ARKM-USDT
+ instIdCode: '185260'
+ uly: ARKM-USDT
+- instrument_uid: 79f2eb58-b5bc-5319-8e8a-4b7951365d67
+ instrument_id: OKX.SWAP.PERPETUAL.ARX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ARX-USDT
+ native_symbol: ARX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ARX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ARX
+ groupId: '4'
+ instFamily: ARX-USDT
+ instIdCode: '326513'
+ uly: ARX-USDT
+- instrument_uid: 48ab37f6-4785-5ad6-b3e3-916d52a99fcd
+ instrument_id: OKX.SWAP.PERPETUAL.ASTER-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ASTER-USDT
+ native_symbol: ASTER-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ASTER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ASTER
+ groupId: '4'
+ instFamily: ASTER-USDT
+ instIdCode: '228297'
+ uly: ASTER-USDT
+- instrument_uid: c5b36eb9-1f69-5f18-90db-6d517c0488bb
+ instrument_id: OKX.SWAP.PERPETUAL.AT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AT-USDT
+ native_symbol: AT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: AT
+ groupId: '4'
+ instFamily: AT-USDT
+ instIdCode: '233932'
+ uly: AT-USDT
+- instrument_uid: f869a1e1-e714-53d9-9dfe-828b42ae81c3
+ instrument_id: OKX.SWAP.PERPETUAL.ATH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ATH-USDT
+ native_symbol: ATH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ATH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: ATH
+ groupId: '4'
+ instFamily: ATH-USDT
+ instIdCode: '162196'
+ uly: ATH-USDT
+- instrument_uid: 3ffaf140-0a92-512f-9024-d5e2ee2fe059
+ instrument_id: OKX.SWAP.PERPETUAL.ATOM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ATOM-USDT
+ native_symbol: ATOM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ATOM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ATOM
+ groupId: '4'
+ instFamily: ATOM-USDT
+ instIdCode: '10490'
+ uly: ATOM-USDT
+- instrument_uid: 7d65b700-2308-5a0c-a7a9-252d41c80981
+ instrument_id: OKX.SWAP.PERPETUAL.AUCTION-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AUCTION-USDT
+ native_symbol: AUCTION-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AUCTION
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: AUCTION
+ groupId: '4'
+ instFamily: AUCTION-USDT
+ instIdCode: '139330'
+ uly: AUCTION-USDT
+- instrument_uid: 507e7575-15f4-5f2e-bd0b-e846fe5526a0
+ instrument_id: OKX.SWAP.PERPETUAL.AVAX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AVAX-USDT
+ native_symbol: AVAX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AVAX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: AVAX
+ groupId: '4'
+ instFamily: AVAX-USDT
+ instIdCode: '10491'
+ uly: AVAX-USDT
+- instrument_uid: 178533cf-690f-53b6-892b-8d2064e856cb
+ instrument_id: OKX.SWAP.PERPETUAL.AVNT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AVNT-USDT
+ native_symbol: AVNT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AVNT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: AVNT
+ groupId: '4'
+ instFamily: AVNT-USDT
+ instIdCode: '228369'
+ uly: AVNT-USDT
+- instrument_uid: 3225191d-c00c-585f-b9b2-38638a334156
+ instrument_id: OKX.SWAP.PERPETUAL.AXS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AXS-USDT
+ native_symbol: AXS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AXS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: AXS
+ groupId: '4'
+ instFamily: AXS-USDT
+ instIdCode: '26858'
+ uly: AXS-USDT
+- instrument_uid: 203a98b3-8a3e-5453-8355-e54e502f3e0e
+ instrument_id: OKX.SWAP.PERPETUAL.AZTEC-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: AZTEC-USDT
+ native_symbol: AZTEC-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: AZTEC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: AZTEC
+ groupId: '4'
+ instFamily: AZTEC-USDT
+ instIdCode: '248704'
+ uly: AZTEC-USDT
+- instrument_uid: 3b9dba04-5e62-5afa-9646-1ea56ea22c71
+ instrument_id: OKX.SWAP.PERPETUAL.BABY-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BABY-USDT
+ native_symbol: BABY-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BABY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BABY
+ groupId: '4'
+ instFamily: BABY-USDT
+ instIdCode: '205558'
+ uly: BABY-USDT
+- instrument_uid: 95294011-4f97-5df4-bac8-b9a1e128e595
+ instrument_id: OKX.SWAP.PERPETUAL.BAND-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BAND-USDT
+ native_symbol: BAND-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BAND
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: BAND
+ groupId: '4'
+ instFamily: BAND-USDT
+ instIdCode: '10493'
+ uly: BAND-USDT
+- instrument_uid: edb2816d-e9d4-5547-bf3b-abb14dec58bb
+ instrument_id: OKX.SWAP.PERPETUAL.BARD-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BARD-USDT
+ native_symbol: BARD-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BARD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: BARD
+ groupId: '4'
+ instFamily: BARD-USDT
+ instIdCode: '227786'
+ uly: BARD-USDT
+- instrument_uid: fe539963-7719-5e2b-85f8-213f889f2433
+ instrument_id: OKX.SWAP.PERPETUAL.BASED-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BASED-USDT
+ native_symbol: BASED-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BASED
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BASED
+ groupId: '4'
+ instFamily: BASED-USDT
+ instIdCode: '255498'
+ uly: BASED-USDT
+- instrument_uid: 60a93fc7-e0c2-5bf1-baba-91248afba2d0
+ instrument_id: OKX.SWAP.PERPETUAL.BAT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BAT-USDT
+ native_symbol: BAT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BAT
+ groupId: '4'
+ instFamily: BAT-USDT
+ instIdCode: '10494'
+ uly: BAT-USDT
+- instrument_uid: e1dbf2df-216a-589f-9d50-160825eec9c3
+ instrument_id: OKX.SWAP.PERPETUAL.BCH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BCH-USDT
+ native_symbol: BCH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BCH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.1'
+ quantity_step: '0.1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: BCH
+ groupId: '4'
+ instFamily: BCH-USDT
+ instIdCode: '10465'
+ uly: BCH-USDT
+- instrument_uid: 319aae36-a24a-5e82-9b70-aa2770aabbee
+ instrument_id: OKX.SWAP.PERPETUAL.BEAT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BEAT-USDT
+ native_symbol: BEAT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BEAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BEAT
+ groupId: '4'
+ instFamily: BEAT-USDT
+ instIdCode: '235770'
+ uly: BEAT-USDT
+- instrument_uid: 71938fe0-fd7b-55ea-b43d-569751b83945
+ instrument_id: OKX.SWAP.PERPETUAL.BERA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BERA-USDT
+ native_symbol: BERA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BERA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: BERA
+ groupId: '4'
+ instFamily: BERA-USDT
+ instIdCode: '196524'
+ uly: BERA-USDT
+- instrument_uid: e20788ab-5f1e-54f9-9db7-eb43eadcd6d9
+ instrument_id: OKX.SWAP.PERPETUAL.BICO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BICO-USDT
+ native_symbol: BICO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BICO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: BICO
+ groupId: '4'
+ instFamily: BICO-USDT
+ instIdCode: '48267'
+ uly: BICO-USDT
+- instrument_uid: 90c794b3-17ca-5335-876f-244747669c7f
+ instrument_id: OKX.SWAP.PERPETUAL.BIGTIME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BIGTIME-USDT
+ native_symbol: BIGTIME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BIGTIME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BIGTIME
+ groupId: '4'
+ instFamily: BIGTIME-USDT
+ instIdCode: '134576'
+ uly: BIGTIME-USDT
+- instrument_uid: 0c9901a2-d4ff-53d6-b55e-66bc1fe92f23
+ instrument_id: OKX.SWAP.PERPETUAL.BILL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BILL-USDT
+ native_symbol: BILL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BILL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: BILL
+ groupId: '4'
+ instFamily: BILL-USDT
+ instIdCode: '269426'
+ uly: BILL-USDT
+- instrument_uid: 07013277-a316-5034-b845-949aef2c6d33
+ instrument_id: OKX.SWAP.PERPETUAL.BIO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BIO-USDT
+ native_symbol: BIO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BIO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: BIO
+ groupId: '4'
+ instFamily: BIO-USDT
+ instIdCode: '191474'
+ uly: BIO-USDT
+- instrument_uid: 3c1609c9-5606-53bd-ba2f-92ee45eadf5c
+ instrument_id: OKX.SWAP.PERPETUAL.BLUR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BLUR-USDT
+ native_symbol: BLUR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BLUR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BLUR
+ groupId: '4'
+ instFamily: BLUR-USDT
+ instIdCode: '115030'
+ uly: BLUR-USDT
+- instrument_uid: 911d8f09-a9c1-5d0f-b448-8ff475f26fac
+ instrument_id: OKX.SWAP.PERPETUAL.BOME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BOME-USDT
+ native_symbol: BOME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BOME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: BOME
+ groupId: '4'
+ instFamily: BOME-USDT
+ instIdCode: '170930'
+ uly: BOME-USDT
+- instrument_uid: 9f885fc0-baed-514b-8208-93680d827cd5
+ instrument_id: OKX.SWAP.PERPETUAL.BONK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BONK-USDT
+ native_symbol: BONK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BONK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000000001'
+ quantity_step: '1'
+ contract_multiplier: '100000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100000'
+ ctValCcy: BONK
+ groupId: '4'
+ instFamily: BONK-USDT
+ instIdCode: '143864'
+ uly: BONK-USDT
+- instrument_uid: 71811c18-9781-5d02-9d09-26e6177ae6c2
+ instrument_id: OKX.SWAP.PERPETUAL.BRETT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BRETT-USDT
+ native_symbol: BRETT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BRETT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: BRETT
+ groupId: '4'
+ instFamily: BRETT-USDT
+ instIdCode: '173473'
+ uly: BRETT-USDT
+- instrument_uid: 6d3356bb-1bd4-53ae-9e44-f6f5f922c113
+ instrument_id: OKX.SWAP.PERPETUAL.BREV-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BREV-USDT
+ native_symbol: BREV-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BREV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: BREV
+ groupId: '4'
+ instFamily: BREV-USDT
+ instIdCode: '242410'
+ uly: BREV-USDT
+- instrument_uid: c464706c-3b06-56e0-944e-f267bc9a6ce3
+ instrument_id: OKX.SWAP.PERPETUAL.BSB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: BSB-USDT
+ native_symbol: BSB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: BSB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: BSB
+ groupId: '4'
+ instFamily: BSB-USDT
+ instIdCode: '255941'
+ uly: BSB-USDT
+- instrument_uid: 0414ddcb-cdf9-5526-bee6-c1e163b0dddc
+ instrument_id: OKX.SWAP.PERPETUAL.CAP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CAP-USDT
+ native_symbol: CAP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CAP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: CAP
+ groupId: '4'
+ instFamily: CAP-USDT
+ instIdCode: '333127'
+ uly: CAP-USDT
+- instrument_uid: d7d32090-97db-5095-8253-b5de3e21d5d1
+ instrument_id: OKX.SWAP.PERPETUAL.CC-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CC-USDT
+ native_symbol: CC-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: CC
+ groupId: '4'
+ instFamily: CC-USDT
+ instIdCode: '234190'
+ uly: CC-USDT
+- instrument_uid: 6725804c-2929-5315-bd4e-4a21d3825f75
+ instrument_id: OKX.SWAP.PERPETUAL.CELO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CELO-USDT
+ native_symbol: CELO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CELO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: CELO
+ groupId: '4'
+ instFamily: CELO-USDT
+ instIdCode: '42683'
+ uly: CELO-USDT
+- instrument_uid: 0dcec1fa-50ad-5331-9f21-54a763d63728
+ instrument_id: OKX.SWAP.PERPETUAL.CFX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CFX-USDT
+ native_symbol: CFX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CFX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: CFX
+ groupId: '4'
+ instFamily: CFX-USDT
+ instIdCode: '16650'
+ uly: CFX-USDT
+- instrument_uid: 7d5325c8-5aca-5be3-9f12-f32e1ee54403
+ instrument_id: OKX.SWAP.PERPETUAL.CHIP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CHIP-USDT
+ native_symbol: CHIP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CHIP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: CHIP
+ groupId: '4'
+ instFamily: CHIP-USDT
+ instIdCode: '262744'
+ uly: CHIP-USDT
+- instrument_uid: 73db6ef0-8d34-55fa-ae44-a531598b5c19
+ instrument_id: OKX.SWAP.PERPETUAL.CHZ-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CHZ-USDT
+ native_symbol: CHZ-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CHZ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: CHZ
+ groupId: '4'
+ instFamily: CHZ-USDT
+ instIdCode: '16651'
+ uly: CHZ-USDT
+- instrument_uid: 17b0014a-f8aa-54b3-aba3-8bb3b53a0cb5
+ instrument_id: OKX.SWAP.PERPETUAL.COAI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: COAI-USDT
+ native_symbol: COAI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: COAI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: COAI
+ groupId: '4'
+ instFamily: COAI-USDT
+ instIdCode: '231795'
+ uly: COAI-USDT
+- instrument_uid: b1eba3de-3bef-55a7-9f3d-a83b0f5b2883
+ instrument_id: OKX.SWAP.PERPETUAL.COMP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: COMP-USDT
+ native_symbol: COMP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: COMP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: COMP
+ groupId: '4'
+ instFamily: COMP-USDT
+ instIdCode: '10498'
+ uly: COMP-USDT
+- instrument_uid: afefd678-4d6f-51a9-82aa-8cf6584c1280
+ instrument_id: OKX.SWAP.PERPETUAL.CRV-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CRV-USDT
+ native_symbol: CRV-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CRV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: CRV
+ groupId: '4'
+ instFamily: CRV-USDT
+ instIdCode: '10500'
+ uly: CRV-USDT
+- instrument_uid: 4577295f-71f8-5786-b492-3860d3628a0b
+ instrument_id: OKX.SWAP.PERPETUAL.CVX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: CVX-USDT
+ native_symbol: CVX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: CVX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: CVX
+ groupId: '4'
+ instFamily: CVX-USDT
+ instIdCode: '163800'
+ uly: CVX-USDT
+- instrument_uid: c86dd48a-f192-5370-9023-cc8654f83f30
+ instrument_id: OKX.SWAP.PERPETUAL.DASH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: DASH-USDT
+ native_symbol: DASH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: DASH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '1'
+ contract_multiplier: '0.01'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.01'
+ ctValCcy: DASH
+ groupId: '4'
+ instFamily: DASH-USDT
+ instIdCode: '234988'
+ uly: DASH-USDT
+- instrument_uid: 235dac6d-c8f4-5fdf-9e43-c63b7acb2695
+ instrument_id: OKX.SWAP.PERPETUAL.DOOD-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: DOOD-USDT
+ native_symbol: DOOD-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: DOOD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: DOOD
+ groupId: '4'
+ instFamily: DOOD-USDT
+ instIdCode: '209986'
+ uly: DOOD-USDT
+- instrument_uid: 8c38db3b-1506-5cb8-aad8-88eff197632b
+ instrument_id: OKX.SWAP.PERPETUAL.DOS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: DOS-USDT
+ native_symbol: DOS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: DOS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: DOS
+ groupId: '4'
+ instFamily: DOS-USDT
+ instIdCode: '403672'
+ uly: DOS-USDT
+- instrument_uid: 292be648-85a0-5bc0-b2ac-a92b78bf59b3
+ instrument_id: OKX.SWAP.PERPETUAL.DOT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: DOT-USDT
+ native_symbol: DOT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: DOT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: DOT
+ groupId: '4'
+ instFamily: DOT-USDT
+ instIdCode: '10504'
+ uly: DOT-USDT
+- instrument_uid: 4546dfee-c278-5efd-932e-6c7d70fe7614
+ instrument_id: OKX.SWAP.PERPETUAL.DYDX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: DYDX-USDT
+ native_symbol: DYDX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: DYDX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: DYDX
+ groupId: '4'
+ instFamily: DYDX-USDT
+ instIdCode: '41286'
+ uly: DYDX-USDT
+- instrument_uid: f0218fe0-e2bf-56b3-b9c0-de1182f1c5f8
+ instrument_id: OKX.SWAP.PERPETUAL.EDEN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: EDEN-USDT
+ native_symbol: EDEN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: EDEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: EDEN
+ groupId: '4'
+ instFamily: EDEN-USDT
+ instIdCode: '229475'
+ uly: EDEN-USDT
+- instrument_uid: 24c96a8e-7426-5015-b35c-6f3d68a07ab2
+ instrument_id: OKX.SWAP.PERPETUAL.EDGE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: EDGE-USDT
+ native_symbol: EDGE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: EDGE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: EDGE
+ groupId: '4'
+ instFamily: EDGE-USDT
+ instIdCode: '255755'
+ uly: EDGE-USDT
+- instrument_uid: 4ed9c3b0-c7a2-5503-9b76-6e55bfd2796b
+ instrument_id: OKX.SWAP.PERPETUAL.EGLD-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: EGLD-USDT
+ native_symbol: EGLD-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: EGLD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: EGLD
+ groupId: '4'
+ instFamily: EGLD-USDT
+ instIdCode: '10505'
+ uly: EGLD-USDT
+- instrument_uid: 5cdb4aec-8296-5fe4-8819-4d4c59359237
+ instrument_id: OKX.SWAP.PERPETUAL.EIGEN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: EIGEN-USDT
+ native_symbol: EIGEN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: EIGEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: EIGEN
+ groupId: '4'
+ instFamily: EIGEN-USDT
+ instIdCode: '176322'
+ uly: EIGEN-USDT
+- instrument_uid: 489ea514-438e-557d-afd0-1f45af70d83e
+ instrument_id: OKX.SWAP.PERPETUAL.ENA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ENA-USDT
+ native_symbol: ENA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ENA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ENA
+ groupId: '4'
+ instFamily: ENA-USDT
+ instIdCode: '227622'
+ uly: ENA-USDT
+- instrument_uid: 26baedc8-2048-50f2-9a1c-af80f289753e
+ instrument_id: OKX.SWAP.PERPETUAL.ENJ-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ENJ-USDT
+ native_symbol: ENJ-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ENJ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ENJ
+ groupId: '4'
+ instFamily: ENJ-USDT
+ instIdCode: '150367'
+ uly: ENJ-USDT
+- instrument_uid: 1d51893f-f23d-5ea1-a0db-e98d5d85ddf8
+ instrument_id: OKX.SWAP.PERPETUAL.ENS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ENS-USDT
+ native_symbol: ENS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ENS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: ENS
+ groupId: '4'
+ instFamily: ENS-USDT
+ instIdCode: '46126'
+ uly: ENS-USDT
+- instrument_uid: 82032262-6777-5cf9-8f1a-bf683a6ddb41
+ instrument_id: OKX.SWAP.PERPETUAL.ENSO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ENSO-USDT
+ native_symbol: ENSO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ENSO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ENSO
+ groupId: '4'
+ instFamily: ENSO-USDT
+ instIdCode: '233767'
+ uly: ENSO-USDT
+- instrument_uid: 63b3db9e-afe4-5b72-821a-184be6395dd4
+ instrument_id: OKX.SWAP.PERPETUAL.ESP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ESP-USDT
+ native_symbol: ESP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ESP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: ESP
+ groupId: '4'
+ instFamily: ESP-USDT
+ instIdCode: '248585'
+ uly: ESP-USDT
+- instrument_uid: 387cd038-59b0-5bbc-a1d0-b70c809fdbaf
+ instrument_id: OKX.SWAP.PERPETUAL.ETC-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ETC-USDT
+ native_symbol: ETC-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ETC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.01'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ETC
+ groupId: '4'
+ instFamily: ETC-USDT
+ instIdCode: '10469'
+ uly: ETC-USDT
+- instrument_uid: 5e2aad21-b8c6-5a22-badf-df62fcfd8b8b
+ instrument_id: OKX.SWAP.PERPETUAL.ETHFI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ETHFI-USDT
+ native_symbol: ETHFI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ETHFI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ETHFI
+ groupId: '4'
+ instFamily: ETHFI-USDT
+ instIdCode: '152367'
+ uly: ETHFI-USDT
+- instrument_uid: 9f8acd08-a48b-5250-8f11-cfba5a08d003
+ instrument_id: OKX.SWAP.PERPETUAL.ETHW-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ETHW-USDT
+ native_symbol: ETHW-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ETHW
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: ETHW
+ groupId: '4'
+ instFamily: ETHW-USDT
+ instIdCode: '101387'
+ uly: ETHW-USDT
+- instrument_uid: e653b192-ecf4-5325-88a8-a04551746c1a
+ instrument_id: OKX.SWAP.PERPETUAL.F-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: F-USDT
+ native_symbol: F-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: F
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: F
+ groupId: '4'
+ instFamily: F-USDT
+ instIdCode: '233329'
+ uly: F-USDT
+- instrument_uid: 20646822-2fc8-5481-b537-5512f04bbfcd
+ instrument_id: OKX.SWAP.PERPETUAL.FARTCOIN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: FARTCOIN-USDT
+ native_symbol: FARTCOIN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: FARTCOIN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: FARTCOIN
+ groupId: '4'
+ instFamily: FARTCOIN-USDT
+ instIdCode: '189540'
+ uly: FARTCOIN-USDT
+- instrument_uid: fcb15aad-f5e9-5245-9f5c-3aa66b4d6507
+ instrument_id: OKX.SWAP.PERPETUAL.FIL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: FIL-USDT
+ native_symbol: FIL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: FIL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: FIL
+ groupId: '4'
+ instFamily: FIL-USDT
+ instIdCode: '10507'
+ uly: FIL-USDT
+- instrument_uid: 36634174-d68e-5d1b-8a57-0746757d61ae
+ instrument_id: OKX.SWAP.PERPETUAL.FLOKI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: FLOKI-USDT
+ native_symbol: FLOKI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: FLOKI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00000001'
+ quantity_step: '1'
+ contract_multiplier: '100000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100000'
+ ctValCcy: FLOKI
+ groupId: '4'
+ instFamily: FLOKI-USDT
+ instIdCode: '115489'
+ uly: FLOKI-USDT
+- instrument_uid: a0a4d5db-8302-5642-9bd4-b2793fe1be87
+ instrument_id: OKX.SWAP.PERPETUAL.FLOW-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: FLOW-USDT
+ native_symbol: FLOW-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: FLOW
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: FLOW
+ groupId: '4'
+ instFamily: FLOW-USDT
+ instIdCode: '137141'
+ uly: FLOW-USDT
+- instrument_uid: bd0199bd-f1ef-591c-b8e8-302087a52eb8
+ instrument_id: OKX.SWAP.PERPETUAL.FOGO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: FOGO-USDT
+ native_symbol: FOGO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: FOGO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: FOGO
+ groupId: '4'
+ instFamily: FOGO-USDT
+ instIdCode: '243802'
+ uly: FOGO-USDT
+- instrument_uid: e8d8b9ac-61c8-53d9-aa43-f8015e885f58
+ instrument_id: OKX.SWAP.PERPETUAL.GALA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GALA-USDT
+ native_symbol: GALA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GALA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: GALA
+ groupId: '4'
+ instFamily: GALA-USDT
+ instIdCode: '42682'
+ uly: GALA-USDT
+- instrument_uid: 65f789bb-7953-55b3-88ed-bb47357ad12a
+ instrument_id: OKX.SWAP.PERPETUAL.GAS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GAS-USDT
+ native_symbol: GAS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GAS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: GAS
+ groupId: '4'
+ instFamily: GAS-USDT
+ instIdCode: '135958'
+ uly: GAS-USDT
+- instrument_uid: 2a20f1eb-ccd6-591d-aea6-310c5273eef7
+ instrument_id: OKX.SWAP.PERPETUAL.GIGGLE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GIGGLE-USDT
+ native_symbol: GIGGLE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GIGGLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '1'
+ contract_multiplier: '0.01'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.01'
+ ctValCcy: GIGGLE
+ groupId: '4'
+ instFamily: GIGGLE-USDT
+ instIdCode: '233316'
+ uly: GIGGLE-USDT
+- instrument_uid: 15fc9a9d-0df2-5151-a349-584edc626597
+ instrument_id: OKX.SWAP.PERPETUAL.GLM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GLM-USDT
+ native_symbol: GLM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GLM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: GLM
+ groupId: '4'
+ instFamily: GLM-USDT
+ instIdCode: '158496'
+ uly: GLM-USDT
+- instrument_uid: 5336b28c-d8c6-5ec9-a71d-f35fffe2b35d
+ instrument_id: OKX.SWAP.PERPETUAL.GMT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GMT-USDT
+ native_symbol: GMT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GMT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: GMT
+ groupId: '4'
+ instFamily: GMT-USDT
+ instIdCode: '81738'
+ uly: GMT-USDT
+- instrument_uid: fc938060-7733-5efe-9050-68be8f156a9e
+ instrument_id: OKX.SWAP.PERPETUAL.GMX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GMX-USDT
+ native_symbol: GMX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GMX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: GMX
+ groupId: '4'
+ instFamily: GMX-USDT
+ instIdCode: '114226'
+ uly: GMX-USDT
+- instrument_uid: 176b8d35-f51e-5abb-8eda-fcd70b43b2f0
+ instrument_id: OKX.SWAP.PERPETUAL.GPS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GPS-USDT
+ native_symbol: GPS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GPS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: GPS
+ groupId: '4'
+ instFamily: GPS-USDT
+ instIdCode: '200413'
+ uly: GPS-USDT
+- instrument_uid: 183d6b91-1ac1-5334-9b0c-f86a98316df3
+ instrument_id: OKX.SWAP.PERPETUAL.GRAM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GRAM-USDT
+ native_symbol: GRAM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GRAM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: GRAM
+ groupId: '4'
+ instFamily: GRAM-USDT
+ instIdCode: '318896'
+ uly: GRAM-USDT
+- instrument_uid: 1e759e5a-7609-57d9-8376-dd32765a78a6
+ instrument_id: OKX.SWAP.PERPETUAL.GRASS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GRASS-USDT
+ native_symbol: GRASS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GRASS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: GRASS
+ groupId: '4'
+ instFamily: GRASS-USDT
+ instIdCode: '182059'
+ uly: GRASS-USDT
+- instrument_uid: 20df3a21-188b-5d43-bd86-89cdb130b05f
+ instrument_id: OKX.SWAP.PERPETUAL.GRT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GRT-USDT
+ native_symbol: GRT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GRT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: GRT
+ groupId: '4'
+ instFamily: GRT-USDT
+ instIdCode: '10509'
+ uly: GRT-USDT
+- instrument_uid: c2577593-ef21-50d4-ad40-3c23bb0fa4cc
+ instrument_id: OKX.SWAP.PERPETUAL.GRVT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: GRVT-USDT
+ native_symbol: GRVT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: GRVT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: GRVT
+ groupId: '4'
+ instFamily: GRVT-USDT
+ instIdCode: '386796'
+ uly: GRVT-USDT
+- instrument_uid: 0c366f91-4035-5e8f-a90d-79b7fe6f9d8f
+ instrument_id: OKX.SWAP.PERPETUAL.H-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: H-USDT
+ native_symbol: H-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: H
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: H
+ groupId: '4'
+ instFamily: H-USDT
+ instIdCode: '216935'
+ uly: H-USDT
+- instrument_uid: 61db3057-2ee1-5185-a84f-639b8bc5f0e8
+ instrument_id: OKX.SWAP.PERPETUAL.HBAR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: HBAR-USDT
+ native_symbol: HBAR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: HBAR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: HBAR
+ groupId: '4'
+ instFamily: HBAR-USDT
+ instIdCode: '129258'
+ uly: HBAR-USDT
+- instrument_uid: a34f42e7-0573-5df3-80cd-9084b7f75687
+ instrument_id: OKX.SWAP.PERPETUAL.HMSTR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: HMSTR-USDT
+ native_symbol: HMSTR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: HMSTR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: HMSTR
+ groupId: '4'
+ instFamily: HMSTR-USDT
+ instIdCode: '175743'
+ uly: HMSTR-USDT
+- instrument_uid: 17b7003c-122e-5e83-9347-757a0f55deb8
+ instrument_id: OKX.SWAP.PERPETUAL.HOME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: HOME-USDT
+ native_symbol: HOME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: HOME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: HOME
+ groupId: '4'
+ instFamily: HOME-USDT
+ instIdCode: '214392'
+ uly: HOME-USDT
+- instrument_uid: 31fa85a6-84af-5460-a60b-60d36d7dd9c1
+ instrument_id: OKX.SWAP.PERPETUAL.HUMA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: HUMA-USDT
+ native_symbol: HUMA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: HUMA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: HUMA
+ groupId: '4'
+ instFamily: HUMA-USDT
+ instIdCode: '211893'
+ uly: HUMA-USDT
+- instrument_uid: a94e40cf-8e6a-5861-ba13-dafed1d90271
+ instrument_id: OKX.SWAP.PERPETUAL.HYPE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: HYPE-USDT
+ native_symbol: HYPE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: HYPE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: HYPE
+ groupId: '4'
+ instFamily: HYPE-USDT
+ instIdCode: '198413'
+ uly: HYPE-USDT
+- instrument_uid: de72f091-5621-58d0-af8a-db73f1c171ee
+ instrument_id: OKX.SWAP.PERPETUAL.ICP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ICP-USDT
+ native_symbol: ICP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ICP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.01'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.01'
+ ctValCcy: ICP
+ groupId: '4'
+ instFamily: ICP-USDT
+ instIdCode: '21505'
+ uly: ICP-USDT
+- instrument_uid: 570343fe-2838-5406-bbfb-f33f719eeb93
+ instrument_id: OKX.SWAP.PERPETUAL.IMX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: IMX-USDT
+ native_symbol: IMX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: IMX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: IMX
+ groupId: '4'
+ instFamily: IMX-USDT
+ instIdCode: '46603'
+ uly: IMX-USDT
+- instrument_uid: 35b1c49f-18fe-5ef3-945c-e49b6201ffc7
+ instrument_id: OKX.SWAP.PERPETUAL.INIT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: INIT-USDT
+ native_symbol: INIT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: INIT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: INIT
+ groupId: '4'
+ instFamily: INIT-USDT
+ instIdCode: '207523'
+ uly: INIT-USDT
+- instrument_uid: a583d89b-cbb8-522a-b0ef-2d45958b97be
+ instrument_id: OKX.SWAP.PERPETUAL.INJ-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: INJ-USDT
+ native_symbol: INJ-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: INJ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: INJ
+ groupId: '4'
+ instFamily: INJ-USDT
+ instIdCode: '139329'
+ uly: INJ-USDT
+- instrument_uid: 86b10bc8-6dd9-51a0-ad1d-5c56b1491bee
+ instrument_id: OKX.SWAP.PERPETUAL.IOST-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: IOST-USDT
+ native_symbol: IOST-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: IOST
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: IOST
+ groupId: '4'
+ instFamily: IOST-USDT
+ instIdCode: '10511'
+ uly: IOST-USDT
+- instrument_uid: b825c1a3-edec-52b7-999c-a336a4bcd817
+ instrument_id: OKX.SWAP.PERPETUAL.IOTA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: IOTA-USDT
+ native_symbol: IOTA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: IOTA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: IOTA
+ groupId: '4'
+ instFamily: IOTA-USDT
+ instIdCode: '10513'
+ uly: IOTA-USDT
+- instrument_uid: bfef0630-a478-5996-a534-78a181d72cbc
+ instrument_id: OKX.SWAP.PERPETUAL.IRYS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: IRYS-USDT
+ native_symbol: IRYS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: IRYS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: IRYS
+ groupId: '4'
+ instFamily: IRYS-USDT
+ instIdCode: '288020'
+ uly: IRYS-USDT
+- instrument_uid: 318696f4-cfb2-52b1-9f52-105f6a8ac140
+ instrument_id: OKX.SWAP.PERPETUAL.JELLYJELLY-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: JELLYJELLY-USDT
+ native_symbol: JELLYJELLY-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: JELLYJELLY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: JELLYJELLY
+ groupId: '4'
+ instFamily: JELLYJELLY-USDT
+ instIdCode: '203463'
+ uly: JELLYJELLY-USDT
+- instrument_uid: a447abdb-17fa-52da-9499-aaf4cf51048e
+ instrument_id: OKX.SWAP.PERPETUAL.JTO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: JTO-USDT
+ native_symbol: JTO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: JTO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: JTO
+ groupId: '4'
+ instFamily: JTO-USDT
+ instIdCode: '143865'
+ uly: JTO-USDT
+- instrument_uid: 14d5f443-1410-568b-9cad-ea30566aa1f2
+ instrument_id: OKX.SWAP.PERPETUAL.JUP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: JUP-USDT
+ native_symbol: JUP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: JUP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: JUP
+ groupId: '4'
+ instFamily: JUP-USDT
+ instIdCode: '146691'
+ uly: JUP-USDT
+- instrument_uid: e8f4a1d8-7c75-5271-9f2c-cebed1e317c0
+ instrument_id: OKX.SWAP.PERPETUAL.KAITO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: KAITO-USDT
+ native_symbol: KAITO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: KAITO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: KAITO
+ groupId: '4'
+ instFamily: KAITO-USDT
+ instIdCode: '198342'
+ uly: KAITO-USDT
+- instrument_uid: 195652dd-5450-5ed1-8059-3a90ff9d2e3d
+ instrument_id: OKX.SWAP.PERPETUAL.KAT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: KAT-USDT
+ native_symbol: KAT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: KAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: KAT
+ groupId: '4'
+ instFamily: KAT-USDT
+ instIdCode: '251546'
+ uly: KAT-USDT
+- instrument_uid: 884cf4b4-b78d-5b31-862f-92f6c3a59781
+ instrument_id: OKX.SWAP.PERPETUAL.KGEN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: KGEN-USDT
+ native_symbol: KGEN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: KGEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: KGEN
+ groupId: '4'
+ instFamily: KGEN-USDT
+ instIdCode: '232383'
+ uly: KGEN-USDT
+- instrument_uid: ae998e95-9c34-5d87-9e0e-8677dcea9e1f
+ instrument_id: OKX.SWAP.PERPETUAL.KITE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: KITE-USDT
+ native_symbol: KITE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: KITE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: KITE
+ groupId: '4'
+ instFamily: KITE-USDT
+ instIdCode: '258273'
+ uly: KITE-USDT
+- instrument_uid: 646c3736-dfab-5991-b6da-630371e190dd
+ instrument_id: OKX.SWAP.PERPETUAL.KMNO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: KMNO-USDT
+ native_symbol: KMNO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: KMNO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: KMNO
+ groupId: '4'
+ instFamily: KMNO-USDT
+ instIdCode: '212316'
+ uly: KMNO-USDT
+- instrument_uid: 99a4b5da-751f-54f9-85b2-b37fac4f1c84
+ instrument_id: OKX.SWAP.PERPETUAL.KSM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: KSM-USDT
+ native_symbol: KSM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: KSM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: KSM
+ groupId: '4'
+ instFamily: KSM-USDT
+ instIdCode: '10517'
+ uly: KSM-USDT
+- instrument_uid: 3a3e5936-9911-56a6-8c11-f74a5df1ae48
+ instrument_id: OKX.SWAP.PERPETUAL.LA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LA-USDT
+ native_symbol: LA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: LA
+ groupId: '4'
+ instFamily: LA-USDT
+ instIdCode: '214391'
+ uly: LA-USDT
+- instrument_uid: 270bf956-2840-5f96-8280-f4d6086edf9f
+ instrument_id: OKX.SWAP.PERPETUAL.LAB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LAB-USDT
+ native_symbol: LAB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LAB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: LAB
+ groupId: '4'
+ instFamily: LAB-USDT
+ instIdCode: '234303'
+ uly: LAB-USDT
+- instrument_uid: 4ad24830-64f9-5e62-b115-f11c5619bdef
+ instrument_id: OKX.SWAP.PERPETUAL.LAYER-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LAYER-USDT
+ native_symbol: LAYER-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LAYER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: LAYER
+ groupId: '4'
+ instFamily: LAYER-USDT
+ instIdCode: '197092'
+ uly: LAYER-USDT
+- instrument_uid: cc8696da-de35-5b97-a735-305be3007c5d
+ instrument_id: OKX.SWAP.PERPETUAL.LDO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LDO-USDT
+ native_symbol: LDO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LDO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: LDO
+ groupId: '4'
+ instFamily: LDO-USDT
+ instIdCode: '114224'
+ uly: LDO-USDT
+- instrument_uid: 3da91678-916e-5b47-89e8-f17415a6c86f
+ instrument_id: OKX.SWAP.PERPETUAL.LINEA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LINEA-USDT
+ native_symbol: LINEA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LINEA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: LINEA
+ groupId: '4'
+ instFamily: LINEA-USDT
+ instIdCode: '225648'
+ uly: LINEA-USDT
+- instrument_uid: b05f357a-776d-5fb2-a701-483e0838bf6d
+ instrument_id: OKX.SWAP.PERPETUAL.LINK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LINK-USDT
+ native_symbol: LINK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LINK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: LINK
+ groupId: '4'
+ instFamily: LINK-USDT
+ instIdCode: '10519'
+ uly: LINK-USDT
+- instrument_uid: 25e71abf-12a5-5592-bb66-01aeb4ec654e
+ instrument_id: OKX.SWAP.PERPETUAL.LIT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LIT-USDT
+ native_symbol: LIT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LIT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: LIT
+ groupId: '4'
+ instFamily: LIT-USDT
+ instIdCode: '241559'
+ uly: LIT-USDT
+- instrument_uid: 5c0400ee-5571-5e36-ae79-5898f75f7e49
+ instrument_id: OKX.SWAP.PERPETUAL.LPT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LPT-USDT
+ native_symbol: LPT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LPT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: LPT
+ groupId: '4'
+ instFamily: LPT-USDT
+ instIdCode: '19721'
+ uly: LPT-USDT
+- instrument_uid: 853e2ca1-d5ec-5ce1-b7aa-2d0384a242f2
+ instrument_id: OKX.SWAP.PERPETUAL.LQTY-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LQTY-USDT
+ native_symbol: LQTY-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LQTY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: LQTY
+ groupId: '4'
+ instFamily: LQTY-USDT
+ instIdCode: '144479'
+ uly: LQTY-USDT
+- instrument_uid: 35774e81-f965-5c8e-accf-3324fecc1fa5
+ instrument_id: OKX.SWAP.PERPETUAL.LTC-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: LTC-USDT
+ native_symbol: LTC-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: LTC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: LTC
+ groupId: '4'
+ instFamily: LTC-USDT
+ instIdCode: '10463'
+ uly: LTC-USDT
+- instrument_uid: f6f6342f-5ea9-5491-be55-0d2cac840f88
+ instrument_id: OKX.SWAP.PERPETUAL.MAGIC-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MAGIC-USDT
+ native_symbol: MAGIC-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MAGIC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: MAGIC
+ groupId: '4'
+ instFamily: MAGIC-USDT
+ instIdCode: '114225'
+ uly: MAGIC-USDT
+- instrument_uid: 5b8fa4b3-8e22-527e-9c5f-1bc4bce52ea1
+ instrument_id: OKX.SWAP.PERPETUAL.MANA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MANA-USDT
+ native_symbol: MANA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MANA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: MANA
+ groupId: '4'
+ instFamily: MANA-USDT
+ instIdCode: '16652'
+ uly: MANA-USDT
+- instrument_uid: ccdc25a6-00a2-593f-bf6c-98d6a45441fd
+ instrument_id: OKX.SWAP.PERPETUAL.MASK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MASK-USDT
+ native_symbol: MASK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MASK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: MASK
+ groupId: '4'
+ instFamily: MASK-USDT
+ instIdCode: '15720'
+ uly: MASK-USDT
+- instrument_uid: 4c64df18-1b0c-5421-8fa7-311e99b8f2c3
+ instrument_id: OKX.SWAP.PERPETUAL.ME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ME-USDT
+ native_symbol: ME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ME
+ groupId: '4'
+ instFamily: ME-USDT
+ instIdCode: '187915'
+ uly: ME-USDT
+- instrument_uid: 584edfc0-b4dc-55fb-92ba-6c11d6c23beb
+ instrument_id: OKX.SWAP.PERPETUAL.MEGA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MEGA-USDT
+ native_symbol: MEGA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MEGA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: MEGA
+ groupId: '4'
+ instFamily: MEGA-USDT
+ instIdCode: '266789'
+ uly: MEGA-USDT
+- instrument_uid: c3b6e04c-e7ea-5345-8bf7-53548d7ca3e6
+ instrument_id: OKX.SWAP.PERPETUAL.MEME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MEME-USDT
+ native_symbol: MEME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MEME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: MEME
+ groupId: '4'
+ instFamily: MEME-USDT
+ instIdCode: '136870'
+ uly: MEME-USDT
+- instrument_uid: 7e348480-a4c5-564c-b594-8c78c1b61c38
+ instrument_id: OKX.SWAP.PERPETUAL.MERL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MERL-USDT
+ native_symbol: MERL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MERL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: MERL
+ groupId: '4'
+ instFamily: MERL-USDT
+ instIdCode: '156206'
+ uly: MERL-USDT
+- instrument_uid: be5ea6cc-f563-51fa-bc10-9c058c425bf3
+ instrument_id: OKX.SWAP.PERPETUAL.MET-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MET-USDT
+ native_symbol: MET-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MET
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: MET
+ groupId: '4'
+ instFamily: MET-USDT
+ instIdCode: '230928'
+ uly: MET-USDT
+- instrument_uid: c6ae2a4c-3338-544d-b14e-05035b0976cb
+ instrument_id: OKX.SWAP.PERPETUAL.METIS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: METIS-USDT
+ native_symbol: METIS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: METIS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: METIS
+ groupId: '4'
+ instFamily: METIS-USDT
+ instIdCode: '142725'
+ uly: METIS-USDT
+- instrument_uid: eac1a50e-ee45-5720-9299-5aedf9727450
+ instrument_id: OKX.SWAP.PERPETUAL.MEW-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MEW-USDT
+ native_symbol: MEW-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MEW
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: MEW
+ groupId: '4'
+ instFamily: MEW-USDT
+ instIdCode: '155695'
+ uly: MEW-USDT
+- instrument_uid: c2a4cfc9-f776-5b5f-92e5-93968a3b5f7f
+ instrument_id: OKX.SWAP.PERPETUAL.MINA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MINA-USDT
+ native_symbol: MINA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MINA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: MINA
+ groupId: '4'
+ instFamily: MINA-USDT
+ instIdCode: '23554'
+ uly: MINA-USDT
+- instrument_uid: 2d9b86aa-6d14-5b37-9606-cbeb7f9fb99f
+ instrument_id: OKX.SWAP.PERPETUAL.MMT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MMT-USDT
+ native_symbol: MMT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MMT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: MMT
+ groupId: '4'
+ instFamily: MMT-USDT
+ instIdCode: '234681'
+ uly: MMT-USDT
+- instrument_uid: 0894b131-b84e-5572-8739-cdf71c3635d9
+ instrument_id: OKX.SWAP.PERPETUAL.MON-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MON-USDT
+ native_symbol: MON-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MON
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: MON
+ groupId: '4'
+ instFamily: MON-USDT
+ instIdCode: '230927'
+ uly: MON-USDT
+- instrument_uid: 65ff2489-e48d-5bf9-add1-c6914ee0256a
+ instrument_id: OKX.SWAP.PERPETUAL.MOODENG-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MOODENG-USDT
+ native_symbol: MOODENG-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MOODENG
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: MOODENG
+ groupId: '4'
+ instFamily: MOODENG-USDT
+ instIdCode: '176639'
+ uly: MOODENG-USDT
+- instrument_uid: 00014941-4c7d-5d7a-92cc-00a83d5cf499
+ instrument_id: OKX.SWAP.PERPETUAL.MORPHO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MORPHO-USDT
+ native_symbol: MORPHO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MORPHO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: MORPHO
+ groupId: '4'
+ instFamily: MORPHO-USDT
+ instIdCode: '186041'
+ uly: MORPHO-USDT
+- instrument_uid: 9351416b-7e70-583d-8b77-869eb6c5bea0
+ instrument_id: OKX.SWAP.PERPETUAL.MOVE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MOVE-USDT
+ native_symbol: MOVE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MOVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: MOVE
+ groupId: '4'
+ instFamily: MOVE-USDT
+ instIdCode: '187846'
+ uly: MOVE-USDT
+- instrument_uid: fab3bb0f-c0e5-58b6-94b9-7515d3fef752
+ instrument_id: OKX.SWAP.PERPETUAL.MUBARAK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: MUBARAK-USDT
+ native_symbol: MUBARAK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: MUBARAK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: MUBARAK
+ groupId: '4'
+ instFamily: MUBARAK-USDT
+ instIdCode: '212925'
+ uly: MUBARAK-USDT
+- instrument_uid: 62df6d23-97c0-56d2-b692-2599900de181
+ instrument_id: OKX.SWAP.PERPETUAL.NEAR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: NEAR-USDT
+ native_symbol: NEAR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: NEAR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: NEAR
+ groupId: '4'
+ instFamily: NEAR-USDT
+ instIdCode: '10523'
+ uly: NEAR-USDT
+- instrument_uid: 2938c47d-5ce9-5831-902c-39668fde211f
+ instrument_id: OKX.SWAP.PERPETUAL.NEIRO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: NEIRO-USDT
+ native_symbol: NEIRO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: NEIRO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00000001'
+ quantity_step: '1'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: NEIRO
+ groupId: '4'
+ instFamily: NEIRO-USDT
+ instIdCode: '176640'
+ uly: NEIRO-USDT
+- instrument_uid: aeb5de89-5b1b-55ee-9168-09d36928c04d
+ instrument_id: OKX.SWAP.PERPETUAL.NEO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: NEO-USDT
+ native_symbol: NEO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: NEO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: NEO
+ groupId: '4'
+ instFamily: NEO-USDT
+ instIdCode: '10477'
+ uly: NEO-USDT
+- instrument_uid: 8f467d3f-0a67-5b81-82f9-16f0d8385b39
+ instrument_id: OKX.SWAP.PERPETUAL.NIGHT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: NIGHT-USDT
+ native_symbol: NIGHT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: NIGHT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: NIGHT
+ groupId: '4'
+ instFamily: NIGHT-USDT
+ instIdCode: '239610'
+ uly: NIGHT-USDT
+- instrument_uid: ac172201-2cdd-5d63-906a-5e567bf2a6f7
+ instrument_id: OKX.SWAP.PERPETUAL.NMR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: NMR-USDT
+ native_symbol: NMR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: NMR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: NMR
+ groupId: '4'
+ instFamily: NMR-USDT
+ instIdCode: '144154'
+ uly: NMR-USDT
+- instrument_uid: 27982e73-8051-5150-9427-09d97acfe909
+ instrument_id: OKX.SWAP.PERPETUAL.NOT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: NOT-USDT
+ native_symbol: NOT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: NOT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: NOT
+ groupId: '4'
+ instFamily: NOT-USDT
+ instIdCode: '159068'
+ uly: NOT-USDT
+- instrument_uid: 1ff01016-b08e-5be8-b10f-30e4a459c5e3
+ instrument_id: OKX.SWAP.PERPETUAL.O-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: O-USDT
+ native_symbol: O-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: O
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: O
+ groupId: '4'
+ instFamily: O-USDT
+ instIdCode: '319272'
+ uly: O-USDT
+- instrument_uid: ef06e949-902e-5a7b-86fc-f4513675ca51
+ instrument_id: OKX.SWAP.PERPETUAL.ON-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ON-USDT
+ native_symbol: ON-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: 'ON'
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: 'ON'
+ groupId: '4'
+ instFamily: ON-USDT
+ instIdCode: '347914'
+ uly: ON-USDT
+- instrument_uid: 2b84d2ac-ae1c-5f7b-892d-0ee66ea524ce
+ instrument_id: OKX.SWAP.PERPETUAL.ONDO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ONDO-USDT
+ native_symbol: ONDO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ONDO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ONDO
+ groupId: '4'
+ instFamily: ONDO-USDT
+ instIdCode: '170039'
+ uly: ONDO-USDT
+- instrument_uid: a0ae3b67-529c-5c60-b1d5-992b2a5dfe90
+ instrument_id: OKX.SWAP.PERPETUAL.ONE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ONE-USDT
+ native_symbol: ONE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ONE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: ONE
+ groupId: '4'
+ instFamily: ONE-USDT
+ instIdCode: '149035'
+ uly: ONE-USDT
+- instrument_uid: eef06df7-cf51-5d7c-9642-e7a4309c225b
+ instrument_id: OKX.SWAP.PERPETUAL.ONT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ONT-USDT
+ native_symbol: ONT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ONT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ONT
+ groupId: '4'
+ instFamily: ONT-USDT
+ instIdCode: '10526'
+ uly: ONT-USDT
+- instrument_uid: 5788acc3-3acc-56dc-91b5-3864d190995f
+ instrument_id: OKX.SWAP.PERPETUAL.OP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: OP-USDT
+ native_symbol: OP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: OP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: OP
+ groupId: '4'
+ instFamily: OP-USDT
+ instIdCode: '86647'
+ uly: OP-USDT
+- instrument_uid: baa311c7-ab43-5131-b076-64337b2e2c39
+ instrument_id: OKX.SWAP.PERPETUAL.OPG-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: OPG-USDT
+ native_symbol: OPG-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: OPG
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: OPG
+ groupId: '4'
+ instFamily: OPG-USDT
+ instIdCode: '263389'
+ uly: OPG-USDT
+- instrument_uid: 1386e6fa-2743-506b-90e9-e312c87d0b30
+ instrument_id: OKX.SWAP.PERPETUAL.OPN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: OPN-USDT
+ native_symbol: OPN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: OPN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: OPN
+ groupId: '4'
+ instFamily: OPN-USDT
+ instIdCode: '250452'
+ uly: OPN-USDT
+- instrument_uid: 33e59369-e856-5e56-a8ce-7353901b4145
+ instrument_id: OKX.SWAP.PERPETUAL.ORDER-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ORDER-USDT
+ native_symbol: ORDER-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ORDER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ORDER
+ groupId: '4'
+ instFamily: ORDER-USDT
+ instIdCode: '229478'
+ uly: ORDER-USDT
+- instrument_uid: bad074bb-5acd-5bcd-943c-0219c7fd7beb
+ instrument_id: OKX.SWAP.PERPETUAL.ORDI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ORDI-USDT
+ native_symbol: ORDI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ORDI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: ORDI
+ groupId: '4'
+ instFamily: ORDI-USDT
+ instIdCode: '122045'
+ uly: ORDI-USDT
+- instrument_uid: 8d648cb4-d326-52d5-8812-5b75a638c275
+ instrument_id: OKX.SWAP.PERPETUAL.PENDLE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PENDLE-USDT
+ native_symbol: PENDLE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PENDLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: PENDLE
+ groupId: '4'
+ instFamily: PENDLE-USDT
+ instIdCode: '227627'
+ uly: PENDLE-USDT
+- instrument_uid: 99660d9e-89eb-5e36-82a9-386a20e9456a
+ instrument_id: OKX.SWAP.PERPETUAL.PENGU-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PENGU-USDT
+ native_symbol: PENGU-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PENGU
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: PENGU
+ groupId: '4'
+ instFamily: PENGU-USDT
+ instIdCode: '189005'
+ uly: PENGU-USDT
+- instrument_uid: cfb1b966-854f-5ae3-ada3-a20f775cc056
+ instrument_id: OKX.SWAP.PERPETUAL.PEOPLE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PEOPLE-USDT
+ native_symbol: PEOPLE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PEOPLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: PEOPLE
+ groupId: '4'
+ instFamily: PEOPLE-USDT
+ instIdCode: '47664'
+ uly: PEOPLE-USDT
+- instrument_uid: c3705bd0-6cfc-5fce-b553-a7a9cadfae83
+ instrument_id: OKX.SWAP.PERPETUAL.PEPE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PEPE-USDT
+ native_symbol: PEPE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PEPE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000000001'
+ quantity_step: '0.1'
+ contract_multiplier: '10000000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10000000'
+ ctValCcy: PEPE
+ groupId: '4'
+ instFamily: PEPE-USDT
+ instIdCode: '120775'
+ uly: PEPE-USDT
+- instrument_uid: fe9a679f-abf6-5670-9aa4-06c0c82e4af2
+ instrument_id: OKX.SWAP.PERPETUAL.PIEVERSE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PIEVERSE-USDT
+ native_symbol: PIEVERSE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PIEVERSE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: PIEVERSE
+ groupId: '4'
+ instFamily: PIEVERSE-USDT
+ instIdCode: '236488'
+ uly: PIEVERSE-USDT
+- instrument_uid: e00eeab2-0a7b-50a1-ba68-05d951812aac
+ instrument_id: OKX.SWAP.PERPETUAL.PIPPIN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PIPPIN-USDT
+ native_symbol: PIPPIN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PIPPIN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: PIPPIN
+ groupId: '4'
+ instFamily: PIPPIN-USDT
+ instIdCode: '238836'
+ uly: PIPPIN-USDT
+- instrument_uid: ab646932-485c-5c6f-92c1-65427d0c4a96
+ instrument_id: OKX.SWAP.PERPETUAL.PLUME-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PLUME-USDT
+ native_symbol: PLUME-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PLUME
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: PLUME
+ groupId: '4'
+ instFamily: PLUME-USDT
+ instIdCode: '209300'
+ uly: PLUME-USDT
+- instrument_uid: 2d440aae-79d3-5944-821b-0dca146f4f5a
+ instrument_id: OKX.SWAP.PERPETUAL.PNUT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PNUT-USDT
+ native_symbol: PNUT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PNUT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: PNUT
+ groupId: '4'
+ instFamily: PNUT-USDT
+ instIdCode: '184109'
+ uly: PNUT-USDT
+- instrument_uid: 26e96bfc-418b-534a-b86b-8845cec5b53b
+ instrument_id: OKX.SWAP.PERPETUAL.POL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: POL-USDT
+ native_symbol: POL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: POL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: POL
+ groupId: '4'
+ instFamily: POL-USDT
+ instIdCode: '175501'
+ uly: POL-USDT
+- instrument_uid: 690463df-9bd3-5454-a02c-5f4ed16d0cc3
+ instrument_id: OKX.SWAP.PERPETUAL.POPCAT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: POPCAT-USDT
+ native_symbol: POPCAT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: POPCAT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: POPCAT
+ groupId: '4'
+ instFamily: POPCAT-USDT
+ instIdCode: '172607'
+ uly: POPCAT-USDT
+- instrument_uid: e0acf5c2-36a0-586c-aa61-f605130f80b7
+ instrument_id: OKX.SWAP.PERPETUAL.PROVE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PROVE-USDT
+ native_symbol: PROVE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PROVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: PROVE
+ groupId: '4'
+ instFamily: PROVE-USDT
+ instIdCode: '232285'
+ uly: PROVE-USDT
+- instrument_uid: cf6b9041-4ee3-5085-b4fe-96dca6d5e559
+ instrument_id: OKX.SWAP.PERPETUAL.PUMP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PUMP-USDT
+ native_symbol: PUMP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PUMP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: PUMP
+ groupId: '4'
+ instFamily: PUMP-USDT
+ instIdCode: '218603'
+ uly: PUMP-USDT
+- instrument_uid: 30f599c1-3235-58aa-a8cb-734f70804b89
+ instrument_id: OKX.SWAP.PERPETUAL.PYTH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: PYTH-USDT
+ native_symbol: PYTH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: PYTH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: PYTH
+ groupId: '4'
+ instFamily: PYTH-USDT
+ instIdCode: '138497'
+ uly: PYTH-USDT
+- instrument_uid: f2d5dfed-750e-5fe4-adc2-b7e0a731eff7
+ instrument_id: OKX.SWAP.PERPETUAL.QNT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: QNT-USDT
+ native_symbol: QNT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: QNT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '0.1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: QNT
+ groupId: '4'
+ instFamily: QNT-USDT
+ instIdCode: '301398'
+ uly: QNT-USDT
+- instrument_uid: 695383b0-8790-5789-9eac-4704b3087cbb
+ instrument_id: OKX.SWAP.PERPETUAL.QTUM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: QTUM-USDT
+ native_symbol: QTUM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: QTUM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: QTUM
+ groupId: '4'
+ instFamily: QTUM-USDT
+ instIdCode: '10479'
+ uly: QTUM-USDT
+- instrument_uid: 1ddf760f-6bde-550c-81ab-928b528b0796
+ instrument_id: OKX.SWAP.PERPETUAL.RAVE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RAVE-USDT
+ native_symbol: RAVE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RAVE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.01'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: RAVE
+ groupId: '4'
+ instFamily: RAVE-USDT
+ instIdCode: '240513'
+ uly: RAVE-USDT
+- instrument_uid: d35d084c-ebb6-5fc0-9e7c-f71a1a0b1228
+ instrument_id: OKX.SWAP.PERPETUAL.RE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RE-USDT
+ native_symbol: RE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: RE
+ groupId: '4'
+ instFamily: RE-USDT
+ instIdCode: '318802'
+ uly: RE-USDT
+- instrument_uid: 0937b736-4c89-563f-ab1d-ffdab60ff40a
+ instrument_id: OKX.SWAP.PERPETUAL.RECALL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RECALL-USDT
+ native_symbol: RECALL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RECALL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: RECALL
+ groupId: '4'
+ instFamily: RECALL-USDT
+ instIdCode: '233933'
+ uly: RECALL-USDT
+- instrument_uid: bee2d394-e836-518d-ab8e-2df7c5d2f804
+ instrument_id: OKX.SWAP.PERPETUAL.RENDER-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RENDER-USDT
+ native_symbol: RENDER-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RENDER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: RENDER
+ groupId: '4'
+ instFamily: RENDER-USDT
+ instIdCode: '170252'
+ uly: RENDER-USDT
+- instrument_uid: e25cd054-6591-5215-ab8e-acea61b96e3b
+ instrument_id: OKX.SWAP.PERPETUAL.RESOLV-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RESOLV-USDT
+ native_symbol: RESOLV-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RESOLV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: RESOLV
+ groupId: '4'
+ instFamily: RESOLV-USDT
+ instIdCode: '213805'
+ uly: RESOLV-USDT
+- instrument_uid: 0641ed20-dbfb-52af-be4c-fa513302dda6
+ instrument_id: OKX.SWAP.PERPETUAL.RIVER-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RIVER-USDT
+ native_symbol: RIVER-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RIVER
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: RIVER
+ groupId: '4'
+ instFamily: RIVER-USDT
+ instIdCode: '243614'
+ uly: RIVER-USDT
+- instrument_uid: 08aae292-6843-515e-9dc0-b3df41676f40
+ instrument_id: OKX.SWAP.PERPETUAL.ROBO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ROBO-USDT
+ native_symbol: ROBO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ROBO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: ROBO
+ groupId: '4'
+ instFamily: ROBO-USDT
+ instIdCode: '251233'
+ uly: ROBO-USDT
+- instrument_uid: b07cf454-cbe6-58ab-a0db-c6f2cd0c9aaa
+ instrument_id: OKX.SWAP.PERPETUAL.RSR-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RSR-USDT
+ native_symbol: RSR-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RSR
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: RSR
+ groupId: '4'
+ instFamily: RSR-USDT
+ instIdCode: '10528'
+ uly: RSR-USDT
+- instrument_uid: 2f110c43-e43d-5784-8ceb-9970d2d16742
+ instrument_id: OKX.SWAP.PERPETUAL.RVN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: RVN-USDT
+ native_symbol: RVN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: RVN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: RVN
+ groupId: '4'
+ instFamily: RVN-USDT
+ instIdCode: '19722'
+ uly: RVN-USDT
+- instrument_uid: 38720d66-4542-519f-8340-f51bc0435fc5
+ instrument_id: OKX.SWAP.PERPETUAL.S-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: S-USDT
+ native_symbol: S-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: S
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: S
+ groupId: '4'
+ instFamily: S-USDT
+ instIdCode: '193995'
+ uly: S-USDT
+- instrument_uid: 0c4da48d-3f48-5d08-a5ab-077db6880253
+ instrument_id: OKX.SWAP.PERPETUAL.SAHARA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SAHARA-USDT
+ native_symbol: SAHARA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SAHARA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SAHARA
+ groupId: '4'
+ instFamily: SAHARA-USDT
+ instIdCode: '216072'
+ uly: SAHARA-USDT
+- instrument_uid: fc7a72ab-a650-5172-993f-9d097b16dcac
+ instrument_id: OKX.SWAP.PERPETUAL.SAND-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SAND-USDT
+ native_symbol: SAND-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SAND
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SAND
+ groupId: '4'
+ instFamily: SAND-USDT
+ instIdCode: '18136'
+ uly: SAND-USDT
+- instrument_uid: 8ae72fb1-bcd8-59de-8a72-dce8afc111b9
+ instrument_id: OKX.SWAP.PERPETUAL.SAPIEN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SAPIEN-USDT
+ native_symbol: SAPIEN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SAPIEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SAPIEN
+ groupId: '4'
+ instFamily: SAPIEN-USDT
+ instIdCode: '235077'
+ uly: SAPIEN-USDT
+- instrument_uid: b62cec8c-d821-5a30-bb62-3fccb691e94c
+ instrument_id: OKX.SWAP.PERPETUAL.SATS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SATS-USDT
+ native_symbol: SATS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SATS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000000000001'
+ quantity_step: '1'
+ contract_multiplier: '10000000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10000000'
+ ctValCcy: SATS
+ groupId: '4'
+ instFamily: SATS-USDT
+ instIdCode: '141681'
+ uly: SATS-USDT
+- instrument_uid: 20b68200-9172-5ad5-9bbf-de59df6bf723
+ instrument_id: OKX.SWAP.PERPETUAL.SEI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SEI-USDT
+ native_symbol: SEI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SEI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SEI
+ groupId: '4'
+ instFamily: SEI-USDT
+ instIdCode: '236302'
+ uly: SEI-USDT
+- instrument_uid: 5f170209-f395-577f-8871-bac517578c30
+ instrument_id: OKX.SWAP.PERPETUAL.SENT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SENT-USDT
+ native_symbol: SENT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SENT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: SENT
+ groupId: '4'
+ instFamily: SENT-USDT
+ instIdCode: '236363'
+ uly: SENT-USDT
+- instrument_uid: a6acc2cc-47b2-5408-956c-6d9516376d78
+ instrument_id: OKX.SWAP.PERPETUAL.SHIB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SHIB-USDT
+ native_symbol: SHIB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SHIB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000000001'
+ quantity_step: '0.1'
+ contract_multiplier: '1000000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000000'
+ ctValCcy: SHIB
+ groupId: '4'
+ instFamily: SHIB-USDT
+ instIdCode: '21073'
+ uly: SHIB-USDT
+- instrument_uid: cdb92414-5c7b-5513-a600-371746aa36fb
+ instrument_id: OKX.SWAP.PERPETUAL.SIGN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SIGN-USDT
+ native_symbol: SIGN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SIGN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: SIGN
+ groupId: '4'
+ instFamily: SIGN-USDT
+ instIdCode: '208012'
+ uly: SIGN-USDT
+- instrument_uid: 8b6e8b7c-bbef-5f4b-bd43-26d6807b7ed3
+ instrument_id: OKX.SWAP.PERPETUAL.SKY-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SKY-USDT
+ native_symbol: SKY-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SKY
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: SKY
+ groupId: '4'
+ instFamily: SKY-USDT
+ instIdCode: '226759'
+ uly: SKY-USDT
+- instrument_uid: c82e28aa-40a0-50b0-94b1-67d52f67689e
+ instrument_id: OKX.SWAP.PERPETUAL.SLX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SLX-USDT
+ native_symbol: SLX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SLX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SLX
+ groupId: '4'
+ instFamily: SLX-USDT
+ instIdCode: '294874'
+ uly: SLX-USDT
+- instrument_uid: 3a073d46-0cc7-52c3-84ab-7e9dcc070d29
+ instrument_id: OKX.SWAP.PERPETUAL.SNX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SNX-USDT
+ native_symbol: SNX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SNX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: SNX
+ groupId: '4'
+ instFamily: SNX-USDT
+ instIdCode: '10529'
+ uly: SNX-USDT
+- instrument_uid: 1df523d5-6806-57a8-80d0-7a86598b321b
+ instrument_id: OKX.SWAP.PERPETUAL.SOON-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SOON-USDT
+ native_symbol: SOON-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SOON
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SOON
+ groupId: '4'
+ instFamily: SOON-USDT
+ instIdCode: '211603'
+ uly: SOON-USDT
+- instrument_uid: 45d2fda2-8fd6-58da-a98f-7f88ecfdb233
+ instrument_id: OKX.SWAP.PERPETUAL.SOPH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SOPH-USDT
+ native_symbol: SOPH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SOPH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: SOPH
+ groupId: '4'
+ instFamily: SOPH-USDT
+ instIdCode: '212107'
+ uly: SOPH-USDT
+- instrument_uid: 3bf03be6-473d-5b0d-98c1-229146bb1ca9
+ instrument_id: OKX.SWAP.PERPETUAL.SPACE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SPACE-USDT
+ native_symbol: SPACE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SPACE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: SPACE
+ groupId: '4'
+ instFamily: SPACE-USDT
+ instIdCode: '245724'
+ uly: SPACE-USDT
+- instrument_uid: 7152cd4d-c839-54cb-9380-833718f8ed53
+ instrument_id: OKX.SWAP.PERPETUAL.SPK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SPK-USDT
+ native_symbol: SPK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SPK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: SPK
+ groupId: '4'
+ instFamily: SPK-USDT
+ instIdCode: '214785'
+ uly: SPK-USDT
+- instrument_uid: 35bf552b-63d1-5895-9701-0250484053ab
+ instrument_id: OKX.SWAP.PERPETUAL.SPX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SPX-USDT
+ native_symbol: SPX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SPX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: SPX
+ groupId: '4'
+ instFamily: SPX-USDT
+ instIdCode: '218934'
+ uly: SPX-USDT
+- instrument_uid: c3b75c12-276b-5a3d-8313-dc7145c321e7
+ instrument_id: OKX.SWAP.PERPETUAL.SSV-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SSV-USDT
+ native_symbol: SSV-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SSV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: SSV
+ groupId: '4'
+ instFamily: SSV-USDT
+ instIdCode: '138636'
+ uly: SSV-USDT
+- instrument_uid: ed4319f7-8e4a-5570-a34d-88118cb1c276
+ instrument_id: OKX.SWAP.PERPETUAL.STABLE-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: STABLE-USDT
+ native_symbol: STABLE-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: STABLE
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: STABLE
+ groupId: '4'
+ instFamily: STABLE-USDT
+ instIdCode: '239503'
+ uly: STABLE-USDT
+- instrument_uid: 1a495947-d440-5313-b4b5-491c73ded166
+ instrument_id: OKX.SWAP.PERPETUAL.STRK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: STRK-USDT
+ native_symbol: STRK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: STRK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: STRK
+ groupId: '4'
+ instFamily: STRK-USDT
+ instIdCode: '149046'
+ uly: STRK-USDT
+- instrument_uid: 15e8ca6e-7618-524c-8548-dab9d49d155c
+ instrument_id: OKX.SWAP.PERPETUAL.STX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: STX-USDT
+ native_symbol: STX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: STX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: STX
+ groupId: '4'
+ instFamily: STX-USDT
+ instIdCode: '115562'
+ uly: STX-USDT
+- instrument_uid: 3e398787-071d-5908-a5e1-2ce40fdc1ab5
+ instrument_id: OKX.SWAP.PERPETUAL.SUI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SUI-USDT
+ native_symbol: SUI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SUI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: SUI
+ groupId: '4'
+ instFamily: SUI-USDT
+ instIdCode: '120850'
+ uly: SUI-USDT
+- instrument_uid: 2bf7bb7d-d4be-51fa-934f-89687d9c89f9
+ instrument_id: OKX.SWAP.PERPETUAL.SUSHI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SUSHI-USDT
+ native_symbol: SUSHI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SUSHI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: SUSHI
+ groupId: '4'
+ instFamily: SUSHI-USDT
+ instIdCode: '10536'
+ uly: SUSHI-USDT
+- instrument_uid: 6ce36c6d-918e-59a9-8b5d-372b6ab95d52
+ instrument_id: OKX.SWAP.PERPETUAL.SYRUP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: SYRUP-USDT
+ native_symbol: SYRUP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: SYRUP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: SYRUP
+ groupId: '4'
+ instFamily: SYRUP-USDT
+ instIdCode: '216937'
+ uly: SYRUP-USDT
+- instrument_uid: ab30f1b5-36ae-5ed3-8d53-75389fa69760
+ instrument_id: OKX.SWAP.PERPETUAL.TAO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TAO-USDT
+ native_symbol: TAO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TAO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.1'
+ quantity_step: '1'
+ contract_multiplier: '0.01'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.01'
+ ctValCcy: TAO
+ groupId: '4'
+ instFamily: TAO-USDT
+ instIdCode: '174952'
+ uly: TAO-USDT
+- instrument_uid: 58d2c7fc-59d2-5269-9523-6303dfc8bcce
+ instrument_id: OKX.SWAP.PERPETUAL.THETA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: THETA-USDT
+ native_symbol: THETA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: THETA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: THETA
+ groupId: '4'
+ instFamily: THETA-USDT
+ instIdCode: '10539'
+ uly: THETA-USDT
+- instrument_uid: d10ee13d-a2a2-5305-bb0d-678a9c63c5e2
+ instrument_id: OKX.SWAP.PERPETUAL.TIA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TIA-USDT
+ native_symbol: TIA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TIA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: TIA
+ groupId: '4'
+ instFamily: TIA-USDT
+ instIdCode: '136595'
+ uly: TIA-USDT
+- instrument_uid: cf8247ac-2438-5123-90c0-5774c79d0ca2
+ instrument_id: OKX.SWAP.PERPETUAL.TRB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TRB-USDT
+ native_symbol: TRB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TRB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: TRB
+ groupId: '4'
+ instFamily: TRB-USDT
+ instIdCode: '10540'
+ uly: TRB-USDT
+- instrument_uid: cec3acd8-dd93-5666-8aaa-257f41cd90ef
+ instrument_id: OKX.SWAP.PERPETUAL.TRIA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TRIA-USDT
+ native_symbol: TRIA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TRIA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: TRIA
+ groupId: '4'
+ instFamily: TRIA-USDT
+ instIdCode: '247790'
+ uly: TRIA-USDT
+- instrument_uid: ebeef153-4f05-50b4-8152-fc22e2d2c5fe
+ instrument_id: OKX.SWAP.PERPETUAL.TRUMP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TRUMP-USDT
+ native_symbol: TRUMP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TRUMP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: TRUMP
+ groupId: '4'
+ instFamily: TRUMP-USDT
+ instIdCode: '193761'
+ uly: TRUMP-USDT
+- instrument_uid: 54f7a9c4-b91b-50d5-a8d9-8c4e0481f2ec
+ instrument_id: OKX.SWAP.PERPETUAL.TRUST-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TRUST-USDT
+ native_symbol: TRUST-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TRUST
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: TRUST
+ groupId: '4'
+ instFamily: TRUST-USDT
+ instIdCode: '234940'
+ uly: TRUST-USDT
+- instrument_uid: 58356b9a-8f38-5bb9-b04a-9f6955732264
+ instrument_id: OKX.SWAP.PERPETUAL.TRUTH-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TRUTH-USDT
+ native_symbol: TRUTH-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TRUTH
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: TRUTH
+ groupId: '4'
+ instFamily: TRUTH-USDT
+ instIdCode: '238320'
+ uly: TRUTH-USDT
+- instrument_uid: ae8a6bb7-2cd4-54c3-b4f8-361b9e8975d1
+ instrument_id: OKX.SWAP.PERPETUAL.TRX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TRX-USDT
+ native_symbol: TRX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TRX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.01'
+ contract_multiplier: '1000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1000'
+ ctValCcy: TRX
+ groupId: '4'
+ instFamily: TRX-USDT
+ instIdCode: '10473'
+ uly: TRX-USDT
+- instrument_uid: 0d6874fd-9a88-5f6f-bb81-61233d9870db
+ instrument_id: OKX.SWAP.PERPETUAL.TURBO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: TURBO-USDT
+ native_symbol: TURBO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: TURBO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0000001'
+ quantity_step: '0.1'
+ contract_multiplier: '10000'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10000'
+ ctValCcy: TURBO
+ groupId: '4'
+ instFamily: TURBO-USDT
+ instIdCode: '141070'
+ uly: TURBO-USDT
+- instrument_uid: 90f3b14e-e641-5e4f-a838-139b568ae459
+ instrument_id: OKX.SWAP.PERPETUAL.UB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: UB-USDT
+ native_symbol: UB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: UB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: UB
+ groupId: '4'
+ instFamily: UB-USDT
+ instIdCode: '265560'
+ uly: UB-USDT
+- instrument_uid: fe05b11d-24ac-5fe8-8f49-f393e6a50748
+ instrument_id: OKX.SWAP.PERPETUAL.UMA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: UMA-USDT
+ native_symbol: UMA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: UMA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: UMA
+ groupId: '4'
+ instFamily: UMA-USDT
+ instIdCode: '10541'
+ uly: UMA-USDT
+- instrument_uid: fefc51a7-8247-5790-bf82-6817bf12e7b3
+ instrument_id: OKX.SWAP.PERPETUAL.UNI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: UNI-USDT
+ native_symbol: UNI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: UNI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: UNI
+ groupId: '4'
+ instFamily: UNI-USDT
+ instIdCode: '10543'
+ uly: UNI-USDT
+- instrument_uid: c7931346-0c07-52e2-86ff-54453b265e14
+ instrument_id: OKX.SWAP.PERPETUAL.USELESS-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: USELESS-USDT
+ native_symbol: USELESS-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: USELESS
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: USELESS
+ groupId: '4'
+ instFamily: USELESS-USDT
+ instIdCode: '220516'
+ uly: USELESS-USDT
+- instrument_uid: b9e653fa-d3cf-5fae-bd8e-c5abc89f8a0f
+ instrument_id: OKX.SWAP.PERPETUAL.VANA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: VANA-USDT
+ native_symbol: VANA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: VANA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: VANA
+ groupId: '4'
+ instFamily: VANA-USDT
+ instIdCode: '188993'
+ uly: VANA-USDT
+- instrument_uid: 12db7dc2-d833-569e-ade1-36d630dc90a8
+ instrument_id: OKX.SWAP.PERPETUAL.VIRTUAL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: VIRTUAL-USDT
+ native_symbol: VIRTUAL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: VIRTUAL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: VIRTUAL
+ groupId: '4'
+ instFamily: VIRTUAL-USDT
+ instIdCode: '188034'
+ uly: VIRTUAL-USDT
+- instrument_uid: 3fc9f34e-9f0b-51f7-88e5-541bce2ffa01
+ instrument_id: OKX.SWAP.PERPETUAL.VVV-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: VVV-USDT
+ native_symbol: VVV-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: VVV
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: VVV
+ groupId: '4'
+ instFamily: VVV-USDT
+ instIdCode: '342909'
+ uly: VVV-USDT
+- instrument_uid: 8198b1a1-966b-584b-95cf-40fd8877de2c
+ instrument_id: OKX.SWAP.PERPETUAL.W-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: W-USDT
+ native_symbol: W-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: W
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: W
+ groupId: '4'
+ instFamily: W-USDT
+ instIdCode: '154132'
+ uly: W-USDT
+- instrument_uid: 9662e66c-84cc-5cfa-a5e6-28339c41bdc2
+ instrument_id: OKX.SWAP.PERPETUAL.WAL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WAL-USDT
+ native_symbol: WAL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WAL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: WAL
+ groupId: '4'
+ instFamily: WAL-USDT
+ instIdCode: '209298'
+ uly: WAL-USDT
+- instrument_uid: 3146ec6a-27dc-5e20-9a42-39063691ca94
+ instrument_id: OKX.SWAP.PERPETUAL.WCT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WCT-USDT
+ native_symbol: WCT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WCT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: WCT
+ groupId: '4'
+ instFamily: WCT-USDT
+ instIdCode: '206314'
+ uly: WCT-USDT
+- instrument_uid: 42cadfc3-bbc5-57c8-9dd7-3db712ea2c50
+ instrument_id: OKX.SWAP.PERPETUAL.WET-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WET-USDT
+ native_symbol: WET-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WET
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: WET
+ groupId: '4'
+ instFamily: WET-USDT
+ instIdCode: '239628'
+ uly: WET-USDT
+- instrument_uid: 2e519d06-1197-50f2-acf8-62f5dfc66e2a
+ instrument_id: OKX.SWAP.PERPETUAL.WIF-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WIF-USDT
+ native_symbol: WIF-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WIF
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: WIF
+ groupId: '4'
+ instFamily: WIF-USDT
+ instIdCode: '155700'
+ uly: WIF-USDT
+- instrument_uid: da4e0df9-0b8c-54c1-9a9c-309187cbb94d
+ instrument_id: OKX.SWAP.PERPETUAL.WLD-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WLD-USDT
+ native_symbol: WLD-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WLD
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: WLD
+ groupId: '4'
+ instFamily: WLD-USDT
+ instIdCode: '127411'
+ uly: WLD-USDT
+- instrument_uid: d3d01f05-c55c-5871-bac8-26ccfe5af5b0
+ instrument_id: OKX.SWAP.PERPETUAL.WLFI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WLFI-USDT
+ native_symbol: WLFI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WLFI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: WLFI
+ groupId: '4'
+ instFamily: WLFI-USDT
+ instIdCode: '224581'
+ uly: WLFI-USDT
+- instrument_uid: 9413e3e7-2a07-5580-a1e2-c94693917f36
+ instrument_id: OKX.SWAP.PERPETUAL.WOO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: WOO-USDT
+ native_symbol: WOO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: WOO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: WOO
+ groupId: '4'
+ instFamily: WOO-USDT
+ instIdCode: '114961'
+ uly: WOO-USDT
+- instrument_uid: d5a36311-364a-5c91-bdc1-e4aa7a6a6847
+ instrument_id: OKX.SWAP.PERPETUAL.XLM-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: XLM-USDT
+ native_symbol: XLM-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: XLM
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '0.1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: XLM
+ groupId: '4'
+ instFamily: XLM-USDT
+ instIdCode: '10481'
+ uly: XLM-USDT
+- instrument_uid: ea7a81ea-5876-5db2-89f2-1af550f455ef
+ instrument_id: OKX.SWAP.PERPETUAL.XPL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: XPL-USDT
+ native_symbol: XPL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: XPL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: XPL
+ groupId: '4'
+ instFamily: XPL-USDT
+ instIdCode: '225095'
+ uly: XPL-USDT
+- instrument_uid: 529720c7-b5fc-5cbf-a468-bf7d090de894
+ instrument_id: OKX.SWAP.PERPETUAL.XRP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: XRP-USDT
+ native_symbol: XRP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: XRP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '0.01'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: XRP
+ groupId: '4'
+ instFamily: XRP-USDT
+ instIdCode: '10471'
+ uly: XRP-USDT
+- instrument_uid: 7d0a90b7-1135-5fda-9dd3-1679af5ca334
+ instrument_id: OKX.SWAP.PERPETUAL.XTZ-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: XTZ-USDT
+ native_symbol: XTZ-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: XTZ
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: XTZ
+ groupId: '4'
+ instFamily: XTZ-USDT
+ instIdCode: '10549'
+ uly: XTZ-USDT
+- instrument_uid: caa279de-37c7-5511-aa49-c173cd3b2208
+ instrument_id: OKX.SWAP.PERPETUAL.YB-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: YB-USDT
+ native_symbol: YB-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: YB
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: YB
+ groupId: '4'
+ instFamily: YB-USDT
+ instIdCode: '231478'
+ uly: YB-USDT
+- instrument_uid: 25eef1f1-eee5-5f91-8312-4e63c09d3a06
+ instrument_id: OKX.SWAP.PERPETUAL.YFI-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: YFI-USDT
+ native_symbol: YFI-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: YFI
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '1'
+ quantity_step: '1'
+ contract_multiplier: '0.0001'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.0001'
+ ctValCcy: YFI
+ groupId: '4'
+ instFamily: YFI-USDT
+ instIdCode: '10551'
+ uly: YFI-USDT
+- instrument_uid: 7d199ba4-65b9-5d0a-a61e-0329cad893f2
+ instrument_id: OKX.SWAP.PERPETUAL.YGG-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: YGG-USDT
+ native_symbol: YGG-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: YGG
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: YGG
+ groupId: '4'
+ instFamily: YGG-USDT
+ instIdCode: '27541'
+ uly: YGG-USDT
+- instrument_uid: 748fd517-7800-5b0c-a9b0-fbd43c6fa65f
+ instrument_id: OKX.SWAP.PERPETUAL.ZAMA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZAMA-USDT
+ native_symbol: ZAMA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZAMA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ZAMA
+ groupId: '4'
+ instFamily: ZAMA-USDT
+ instIdCode: '243639'
+ uly: ZAMA-USDT
+- instrument_uid: 0e38b4ee-be80-5bf8-9c23-2ff2172781bd
+ instrument_id: OKX.SWAP.PERPETUAL.ZBT-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZBT-USDT
+ native_symbol: ZBT-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZBT
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ZBT
+ groupId: '4'
+ instFamily: ZBT-USDT
+ instIdCode: '232342'
+ uly: ZBT-USDT
+- instrument_uid: 6eab37a2-e239-501a-9c28-bdb217207626
+ instrument_id: OKX.SWAP.PERPETUAL.ZEC-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZEC-USDT
+ native_symbol: ZEC-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZEC
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.01'
+ quantity_step: '1'
+ contract_multiplier: '0.01'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.01'
+ ctValCcy: ZEC
+ groupId: '4'
+ instFamily: ZEC-USDT
+ instIdCode: '234991'
+ uly: ZEC-USDT
+- instrument_uid: 7550c6c6-2f96-55cf-b1ba-d4cc98f0ff29
+ instrument_id: OKX.SWAP.PERPETUAL.ZEN-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZEN-USDT
+ native_symbol: ZEN-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZEN
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.001'
+ quantity_step: '1'
+ contract_multiplier: '0.1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '0.1'
+ ctValCcy: ZEN
+ groupId: '4'
+ instFamily: ZEN-USDT
+ instIdCode: '234440'
+ uly: ZEN-USDT
+- instrument_uid: a06885be-3b01-5dcf-80a0-a06da823219d
+ instrument_id: OKX.SWAP.PERPETUAL.ZETA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZETA-USDT
+ native_symbol: ZETA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZETA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ZETA
+ groupId: '4'
+ instFamily: ZETA-USDT
+ instIdCode: '146706'
+ uly: ZETA-USDT
+- instrument_uid: 8d68ba2a-28c6-597c-94ec-a34cbda836d1
+ instrument_id: OKX.SWAP.PERPETUAL.ZIL-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZIL-USDT
+ native_symbol: ZIL-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZIL
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '100'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '100'
+ ctValCcy: ZIL
+ groupId: '4'
+ instFamily: ZIL-USDT
+ instIdCode: '10557'
+ uly: ZIL-USDT
+- instrument_uid: 75ca584b-3205-54bf-81bf-e1e712bbb724
+ instrument_id: OKX.SWAP.PERPETUAL.ZK-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZK-USDT
+ native_symbol: ZK-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZK
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ZK
+ groupId: '4'
+ instFamily: ZK-USDT
+ instIdCode: '162969'
+ uly: ZK-USDT
+- instrument_uid: 71f6156c-a6f2-5cc1-b917-0a60c5966bd3
+ instrument_id: OKX.SWAP.PERPETUAL.ZKP-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZKP-USDT
+ native_symbol: ZKP-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZKP
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ZKP
+ groupId: '4'
+ instFamily: ZKP-USDT
+ instIdCode: '243374'
+ uly: ZKP-USDT
+- instrument_uid: 5d2fbdcc-38dd-56be-b409-25f9a6e292eb
+ instrument_id: OKX.SWAP.PERPETUAL.ZORA-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZORA-USDT
+ native_symbol: ZORA-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZORA
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.000001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ZORA
+ groupId: '4'
+ instFamily: ZORA-USDT
+ instIdCode: '230935'
+ uly: ZORA-USDT
+- instrument_uid: d7657b6a-8c62-5c36-b0cf-865b310a50e0
+ instrument_id: OKX.SWAP.PERPETUAL.ZRO-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZRO-USDT
+ native_symbol: ZRO-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZRO
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.0001'
+ quantity_step: '1'
+ contract_multiplier: '1'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '1'
+ ctValCcy: ZRO
+ groupId: '4'
+ instFamily: ZRO-USDT
+ instIdCode: '163161'
+ uly: ZRO-USDT
+- instrument_uid: 895966bd-d394-5110-81da-212f87eb5f1b
+ instrument_id: OKX.SWAP.PERPETUAL.ZRX-USDT
+ metadata_revision: 1
+ venue: OKX
+ market: SWAP
+ product_type: PERPETUAL
+ canonical_symbol: ZRX-USDT
+ native_symbol: ZRX-USDT-SWAP
+ asset_class: DERIVATIVE
+ base_asset: ZRX
+ quote_asset: USDT
+ settlement_asset: USDT
+ price_tick: '0.00001'
+ quantity_step: '1'
+ contract_multiplier: '10'
+ session_calendar_id: CRYPTO_24X7
+ attributes:
+ ctMult: '1'
+ ctType: linear
+ ctVal: '10'
+ ctValCcy: ZRX
+ groupId: '4'
+ instFamily: ZRX-USDT
+ instIdCode: '10558'
+ uly: ZRX-USDT
bindings:
- binding_id: binance-spot-btcusdt-bar-1m
instrument_uid: 26edfffd-6824-5e75-a620-5a122b3e1086
feed: BAR
- interval: 1m
+ interval: 1m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-spot-btcusdt-bar-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-spot/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-spot-btcusdt-quote
+ instrument_uid: 26edfffd-6824-5e75-a620-5a122b3e1086
+ feed: QUOTE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-spot-btcusdt-quote-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-spot/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-spot-btcusdt-trade
+ instrument_uid: 26edfffd-6824-5e75-a620-5a122b3e1086
+ feed: TRADE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-spot-btcusdt-trade-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-spot/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: BINANCE_TRADE_MARKET_ONLY
+- binding_id: binance-usdm-0gusdt-bar-1d
+ instrument_uid: 52a78a60-e48b-5507-b823-e5b8867db2df
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-0gusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-1000bonkusdt-bar-1d
+ instrument_uid: 9591218d-358d-5d5b-aa1c-7d9653e487ad
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-1000bonkusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-1000flokiusdt-bar-1d
+ instrument_uid: da43e311-fa63-5201-ba73-a92e3672a3b4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-1000flokiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-1000pepeusdt-bar-1d
+ instrument_uid: d4316760-92df-50ad-b291-79b043564d85
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-1000pepeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-1000satsusdt-bar-1d
+ instrument_uid: c07b42ad-ab20-599a-b33f-053209030c55
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-1000satsusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-1000shibusdt-bar-1d
+ instrument_uid: 123ff4ea-21a7-54a0-9ad3-e56059b81bde
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-1000shibusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-1inchusdt-bar-1d
+ instrument_uid: 879ff3cb-0774-5705-b2fa-82101137410c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-1inchusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-2zusdt-bar-1d
+ instrument_uid: 9d5eafc6-2af9-5f86-9950-c9bc0beef049
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-2zusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aaveusdt-bar-1d
+ instrument_uid: 47871e91-fb6a-5273-9f22-fc663cdc2f32
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aaveusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-actusdt-bar-1d
+ instrument_uid: 7d9c02f5-b2cd-507c-a478-ccfeba874b5d
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-actusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-acuusdt-bar-1d
+ instrument_uid: afd75136-bcc0-57ed-a85b-10d470fb8336
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-acuusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-adausdt-bar-1d
+ instrument_uid: 6e48b1c7-2340-5e07-aacf-1c6048498b00
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-adausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aerousdt-bar-1d
+ instrument_uid: 3c6f6997-1b46-5e9e-acf9-df60b2075142
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aerousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aevousdt-bar-1d
+ instrument_uid: 49355b7d-5da7-5768-bded-cf08dfe0ddca
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aevousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-agldusdt-bar-1d
+ instrument_uid: a0e845a9-a853-50b1-b256-913925fbf1d2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-agldusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aixbtusdt-bar-1d
+ instrument_uid: b41b2b3f-65b7-509d-a0b3-e7f3440d9a6a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aixbtusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-algousdt-bar-1d
+ instrument_uid: 39392d40-34f4-5531-85db-da715726cec4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-algousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-allousdt-bar-1d
+ instrument_uid: 9e012444-b0b9-55ab-a994-a6a2b8384b02
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-allousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-animeusdt-bar-1d
+ instrument_uid: dd71effc-462a-5862-997d-74a587a49b61
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-animeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-apeusdt-bar-1d
+ instrument_uid: 46aca998-9432-55d5-a619-72ae55c92f7e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-apeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-api3usdt-bar-1d
+ instrument_uid: 4275cccf-ed9f-5948-904f-e4b1ae933e66
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-api3usdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aprusdt-bar-1d
+ instrument_uid: 54de4137-c09a-52f0-ad34-696fdd5b4f04
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aprusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aptusdt-bar-1d
+ instrument_uid: ecfceb71-472a-5e6b-8228-51fe99af10dd
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aptusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-arbusdt-bar-1d
+ instrument_uid: e840b0bc-066b-5a63-9368-8654ade8462f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-arbusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-arkmusdt-bar-1d
+ instrument_uid: db35329e-fec3-5e5e-8dea-0e0e42aa71df
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-arkmusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-arusdt-bar-1d
+ instrument_uid: b6af67f3-e4ea-5982-a4d2-e2a4ed8b823e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-arusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-arxusdt-bar-1d
+ instrument_uid: 48c9207b-c6c9-5901-ad33-368f55774c47
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-arxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-asterusdt-bar-1d
+ instrument_uid: f51c770c-f711-54e5-ab83-8ef6cc63d247
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-asterusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-athusdt-bar-1d
+ instrument_uid: c26690f5-48a3-5cc3-8997-3c10a2a8b413
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-athusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-atomusdt-bar-1d
+ instrument_uid: e178f3a4-1ceb-5e0e-adc2-a3123c89d420
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-atomusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-atusdt-bar-1d
+ instrument_uid: bf1f6c47-30eb-5467-aea4-a66760bf5e5e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-atusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-auctionusdt-bar-1d
+ instrument_uid: be6c712f-0218-5350-b162-75cd18a1e8d1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-auctionusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ausdt-bar-1d
+ instrument_uid: 355cdfa9-18a0-5274-b761-ad8dffa29ed3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-avaxusdt-bar-1d
+ instrument_uid: 34043a94-1386-58d7-a507-e80a173199d7
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-avaxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-avntusdt-bar-1d
+ instrument_uid: f1fa334d-15e7-5ca3-9e11-5b805b3426a1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-avntusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-axsusdt-bar-1d
+ instrument_uid: 18b9b339-1a7f-5110-bdd1-5b3585e2ebff
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-axsusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-aztecusdt-bar-1d
+ instrument_uid: e2688e6c-660f-5deb-ba4b-5690d98ee452
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-aztecusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-babyusdt-bar-1d
+ instrument_uid: 7107b106-eed7-513c-8c1b-0a1ff512afee
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-babyusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bandusdt-bar-1d
+ instrument_uid: 132d4a1b-3464-5de1-b9ad-1f3ebe728589
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bandusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bardusdt-bar-1d
+ instrument_uid: 07b68da9-76a6-5e50-9de1-bf5ffe70711f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bardusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-basedusdt-bar-1d
+ instrument_uid: 56075a4c-2f7b-5773-a88c-a7b00323721a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-basedusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-batusdt-bar-1d
+ instrument_uid: 7524658d-fa43-5121-91c5-fd55afea5953
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-batusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bchusdt-bar-1d
+ instrument_uid: 6cf90303-3b4a-58e9-94f8-3574c64c3fa2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bchusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-beatusdt-bar-1d
+ instrument_uid: e0377966-ec4b-5dd6-994b-ad4c0542e214
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-beatusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-berausdt-bar-1d
+ instrument_uid: 64e64842-f7cc-52a3-a72b-8400375f5505
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-berausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bicousdt-bar-1d
+ instrument_uid: 4aaf2734-e6e6-5ad1-b5dd-1dac4aa549a5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bicousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bigtimeusdt-bar-1d
+ instrument_uid: b616b571-b4db-5d27-ae73-0e03e71e3125
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bigtimeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-billusdt-bar-1d
+ instrument_uid: 56277e8e-e8d2-56ec-bf9b-cb742cf17883
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-billusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-biousdt-bar-1d
+ instrument_uid: 789ea412-0d8d-5d54-a4a4-a0ea2dee338c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-biousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-blurusdt-bar-1d
+ instrument_uid: a76839ab-ecdd-59ef-9416-17ac1af4b3d0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-blurusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-12h
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 12h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-15m
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 15m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-1d
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-1h
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 1h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-1m
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 1m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-1w
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 1w
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-2h
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 2h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-30m
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 30m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-3d
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 3d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-3m
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 3m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-4h
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 4h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-5m
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 5m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-6h
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 6h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-bar-8h
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ interval: 8h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-bar-8h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 86400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bnbusdt-book_delta
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-bnbusdt-book_snapshot
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-bnbusdt-mark_index_price
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: binance-usdm-bnbusdt-quote
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: QUOTE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-quote-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: binance-usdm-bnbusdt-trade
+ instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: TRADE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bnbusdt-trade-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
+- binding_id: binance-usdm-bomeusdt-bar-1d
+ instrument_uid: 0dc95513-2b93-56c1-8966-78e06012e967
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bomeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-brettusdt-bar-1d
+ instrument_uid: a2ded063-b730-5294-a024-b1c4abcadc5e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-brettusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-brevusdt-bar-1d
+ instrument_uid: 24ed3fe9-70d2-5715-a0e6-d2dd06e02d0e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-brevusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-bsbusdt-bar-1d
+ instrument_uid: 115fba5d-673e-5ad8-b14d-53c6b077d8b8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-bsbusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-261225-book_delta
+ instrument_uid: a1bf2602-781a-56be-9922-52d1fbf327e5
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-261225-book_snapshot
+ instrument_uid: a1bf2602-781a-56be-9922-52d1fbf327e5
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-bar-12h
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 12h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-15m
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 15m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-1d
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-1h
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 1h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-1m
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 1m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-bar-1w
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 1w
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-2h
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 2h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-30m
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 30m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-3d
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 3d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-3m
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 3m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-4h
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 4h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-5m
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 5m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-6h
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 6h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-bar-8h
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ interval: 8h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-bar-8h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 86400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-btcusdt-book_delta
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-book_snapshot
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-mark_index_price
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-quote
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: QUOTE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-quote-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: binance-usdm-btcusdt-trade
+ instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: TRADE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-btcusdt-trade-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
+- binding_id: binance-usdm-capusdt-bar-1d
+ instrument_uid: 49fd25fe-bbe4-5c84-97c2-510dd94dddd9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-capusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ccusdt-bar-1d
+ instrument_uid: 35eea6b0-e366-5885-9c58-f1c850631acc
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ccusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-celousdt-bar-1d
+ instrument_uid: b7b0141d-1de2-5b79-af97-a4d60ff6a9f5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-celousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-cfxusdt-bar-1d
+ instrument_uid: 98d54c7c-3319-5a73-9c36-6a66dcbabd6a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-cfxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-chipusdt-bar-1d
+ instrument_uid: f975d17f-3347-5fcf-b56a-fb8b8f6b0de2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-chipusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-chzusdt-bar-1d
+ instrument_uid: f0fc7947-d63b-5d68-9693-e57180133118
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-chzusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-coaiusdt-bar-1d
+ instrument_uid: 3726da06-2869-5143-b334-db8e1546f540
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-coaiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-compusdt-bar-1d
+ instrument_uid: a0053062-3a08-5328-8869-5148cf4def68
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-compusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-crvusdt-bar-1d
+ instrument_uid: e85dc2e1-f82f-544f-b55e-3176925d996c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-crvusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-cvxusdt-bar-1d
+ instrument_uid: 0c8454bd-825f-53f9-801c-1d1edc623a87
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-cvxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dashusdt-bar-1d
+ instrument_uid: 6c00dc57-9aad-5881-910c-6dab3b593b53
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dashusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-12h
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 12h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-15m
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 15m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-1d
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-1h
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 1h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-1m
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 1m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-1w
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 1w
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-2h
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 2h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-30m
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 30m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-3d
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 3d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-3m
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 3m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-4h
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 4h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-5m
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 5m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-6h
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 6h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-bar-8h
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ interval: 8h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-bar-8h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 86400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dogeusdt-book_delta
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-dogeusdt-book_snapshot
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-dogeusdt-mark_index_price
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: binance-usdm-dogeusdt-quote
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: QUOTE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-quote-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: binance-usdm-dogeusdt-trade
+ instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: TRADE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dogeusdt-trade-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
+- binding_id: binance-usdm-doodusdt-bar-1d
+ instrument_uid: 9cea9ea3-bffb-5af7-ba48-266c77a830bf
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-doodusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dosusdt-bar-1d
+ instrument_uid: 6bb5fd3e-27ef-5cbd-b535-df991800b752
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dosusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dotusdt-bar-1d
+ instrument_uid: fdde788f-16a2-5b0b-a66b-19ae99a38d08
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dotusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-dydxusdt-bar-1d
+ instrument_uid: 82c3d1ea-8098-5e21-b841-e51469ca5bb0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-dydxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-edenusdt-bar-1d
+ instrument_uid: 0bb4ca88-2c89-5118-a7de-5d58985ba27b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-edenusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-edgeusdt-bar-1d
+ instrument_uid: a9813a7f-04b3-537b-abbb-8bc599de3873
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-edgeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-egldusdt-bar-1d
+ instrument_uid: 46f4fd8b-58db-578c-9c23-01d890296726
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-egldusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-eigenusdt-bar-1d
+ instrument_uid: 8876d78b-3edf-5e4f-9be4-7be3b2db1966
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-eigenusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-enausdt-bar-1d
+ instrument_uid: f3d07537-e856-5793-9fe4-75d9f1e54e5b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-enausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-enjusdt-bar-1d
+ instrument_uid: f41d64f2-dc4f-53f1-8911-bf8dd7a59249
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-enjusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ensousdt-bar-1d
+ instrument_uid: d0b4908a-8eb5-5155-9c19-0880eb94aace
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ensousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ensusdt-bar-1d
+ instrument_uid: 6d64b790-bb5c-5d6c-9377-09b12c56b5eb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ensusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-espusdt-bar-1d
+ instrument_uid: c684a346-4477-5d60-a3a2-07907ea6657c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-espusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-etcusdt-bar-1d
+ instrument_uid: e11e62f8-26b3-5d07-8bfe-1d4603547dc9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-etcusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethfiusdt-bar-1d
+ instrument_uid: 0723c5e4-0af0-59a3-a7c6-d9c9c36968af
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethfiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-261225-book_delta
+ instrument_uid: bc0775be-e02e-5ad4-a0fd-1fff10a4451c
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-261225-book_snapshot
+ instrument_uid: bc0775be-e02e-5ad4-a0fd-1fff10a4451c
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-bar-12h
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 12h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-15m
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 15m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-1d
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-1h
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 1h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-1m
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 1m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-bar-1w
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 1w
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-2h
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 2h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-30m
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 30m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-3d
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 3d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-3m
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 3m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-4h
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 4h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-5m
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 5m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-6h
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 6h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-bar-8h
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BAR
+ interval: 8h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-bar-8h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 86400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ethusdt-book_delta
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-book_snapshot
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-mark_index_price
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-quote
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: QUOTE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-quote-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: binance-usdm-ethusdt-trade
+ instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ feed: TRADE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethusdt-trade-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
+- binding_id: binance-usdm-ethwusdt-bar-1d
+ instrument_uid: 870270bb-8d67-5eee-82e5-93f24b2fcdb1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ethwusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-fartcoinusdt-bar-1d
+ instrument_uid: 3a14f40f-96cf-5810-8931-35ac5b2538b1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-fartcoinusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-filusdt-bar-1d
+ instrument_uid: e70f56d4-69db-5b2c-9484-de67bd4ec8bf
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-filusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-flowusdt-bar-1d
+ instrument_uid: 30e34c60-350e-5d13-8341-fe76633080c3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-flowusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-fogousdt-bar-1d
+ instrument_uid: d3a82a86-2d20-5b86-b9fe-5e53176d94d7
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-fogousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-fusdt-bar-1d
+ instrument_uid: 922e938c-8c6b-5c10-a6bd-8e21a0db4b35
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-fusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-galausdt-bar-1d
+ instrument_uid: f2816e98-1b6c-5558-a201-02b744d72cc3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-galausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-gasusdt-bar-1d
+ instrument_uid: e52590aa-7cd3-5cc9-9fd6-71026ee0eb26
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-gasusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-giggleusdt-bar-1d
+ instrument_uid: cf1b39f8-e1e2-5826-9683-67f3a1e11da8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-giggleusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-glmusdt-bar-1d
+ instrument_uid: 24a32009-108b-54bd-b8ba-3806976c4053
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-glmusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-gmtusdt-bar-1d
+ instrument_uid: 78148a03-d1cf-5907-a639-ccbcbb0975fd
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-gmtusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-gmxusdt-bar-1d
+ instrument_uid: 77296e5e-bb08-5aa2-94e0-96d7e7adb517
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-gmxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-gpsusdt-bar-1d
+ instrument_uid: 935b8777-171b-5d46-94d7-cc6d55e57ea3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-gpsusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-gramusdt-bar-1d
+ instrument_uid: 23552d71-b038-5575-97b9-3ae8604876d0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-gramusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-grassusdt-bar-1d
+ instrument_uid: e395cb40-0cbd-5603-83b9-9c30ec14b062
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-grassusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-grtusdt-bar-1d
+ instrument_uid: a1899d6f-1b1b-53e4-9f6d-53850d91f93b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-grtusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-grvtusdt-bar-1d
+ instrument_uid: 6765fdee-a03e-5596-bed2-a33b415087d8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-grvtusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-hbarusdt-bar-1d
+ instrument_uid: bfbd909d-851e-5b08-93f3-197719ad65e2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-hbarusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-hmstrusdt-bar-1d
+ instrument_uid: 05658343-bcbb-5aed-87b2-1ce21349e227
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-hmstrusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-homeusdt-bar-1d
+ instrument_uid: 933546f2-5d49-5a75-9313-231ce70bf001
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-homeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-humausdt-bar-1d
+ instrument_uid: 486818ad-fab1-522c-bb5c-9258c3911afe
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-humausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-husdt-bar-1d
+ instrument_uid: 72f3bbcf-3630-5e35-b583-5721f484266b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-husdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-hypeusdt-bar-1d
+ instrument_uid: fdfdbfc0-5545-5fb1-bd8f-5c4a345ada59
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-hypeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-icpusdt-bar-1d
+ instrument_uid: 61352f58-1260-5a3f-a4c3-389c74b74ec5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-icpusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-imxusdt-bar-1d
+ instrument_uid: 6aeb7e7c-9024-5160-8ede-be20c6d489d3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-imxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-initusdt-bar-1d
+ instrument_uid: dfbcd529-82a2-52f0-892c-529e0a38c350
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-initusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-injusdt-bar-1d
+ instrument_uid: 2ba7c8e9-f2a8-5816-8b2d-9d6b0b0a6cd3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-injusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-iostusdt-bar-1d
+ instrument_uid: 00d1d68e-45b0-5cbf-9825-15ba00cb6a66
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-iostusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-iotausdt-bar-1d
+ instrument_uid: 0f8b8578-7850-5863-929a-d3292a9cba31
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-iotausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-irysusdt-bar-1d
+ instrument_uid: 9492e60f-ef93-54c1-8a82-120a66af229a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-irysusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-jellyjellyusdt-bar-1d
+ instrument_uid: e8fe4622-da4d-5922-a87c-eddfb07c88f6
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-jellyjellyusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-jtousdt-bar-1d
+ instrument_uid: ab468c88-f893-52e4-8334-f04ec8907fa6
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-jtousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-jupusdt-bar-1d
+ instrument_uid: 2e9f13cf-f529-575b-bb66-6caea3ee1a14
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-jupusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-kaitousdt-bar-1d
+ instrument_uid: 47574e33-d716-5573-ab29-c2a3635f6aeb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-kaitousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-katusdt-bar-1d
+ instrument_uid: 0d772919-4b2c-57f4-9543-a60eb316e676
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-katusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-kgenusdt-bar-1d
+ instrument_uid: a570e234-e1e3-5c85-aade-f95859ac928a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-kgenusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-kiteusdt-bar-1d
+ instrument_uid: 7270dafa-54f4-5bc8-8190-71b330ee95b5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-kiteusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-kmnousdt-bar-1d
+ instrument_uid: 6a503e86-9477-53de-be2a-2e9af1fd5163
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-kmnousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ksmusdt-bar-1d
+ instrument_uid: 5a5e88ec-7e10-5f61-9b23-78aacd43ad1d
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ksmusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-labusdt-bar-1d
+ instrument_uid: 2a8062eb-9c40-5101-9711-45c6d0a0b02a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-labusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-lausdt-bar-1d
+ instrument_uid: 91733082-acf5-569b-8029-1e38ed470d51
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-lausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-layerusdt-bar-1d
+ instrument_uid: ed47715e-b8e0-53b8-a82c-686b40c69eaa
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-layerusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ldousdt-bar-1d
+ instrument_uid: 01c74f7d-2449-5630-b743-f563a900108b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ldousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-lineausdt-bar-1d
+ instrument_uid: 334e1fb1-c81f-5660-b445-87aa58b5e0b4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-lineausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-linkusdt-bar-1d
+ instrument_uid: de05bab8-6979-5f2a-ac65-fe3ca6141157
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-linkusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-litusdt-bar-1d
+ instrument_uid: 8832e103-2121-5ef4-b1c0-d8e55e1f40e9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-litusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-lptusdt-bar-1d
+ instrument_uid: 746233b9-ee75-5cbc-8a6c-daa63a4d82ce
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-lptusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-lqtyusdt-bar-1d
+ instrument_uid: 327e2814-ea95-5cc6-a8d9-d6c2952dae9f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-lqtyusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ltcusdt-bar-1d
+ instrument_uid: e4cebf99-5916-5aa6-ab39-f66cbecba1ca
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ltcusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-magicusdt-bar-1d
+ instrument_uid: a478a674-5118-59a0-8a89-49f9d9d17910
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-magicusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-manausdt-bar-1d
+ instrument_uid: 2a49a9f8-c5b7-546d-b55f-9cacf4855532
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-manausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-maskusdt-bar-1d
+ instrument_uid: d3583ef9-febd-54a0-9d23-5a2f62f6dbbe
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-maskusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-megausdt-bar-1d
+ instrument_uid: 8425e4e9-5eef-59fe-aee3-50a5616aa529
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-megausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-memeusdt-bar-1d
+ instrument_uid: 6253da80-82c8-5692-9d71-73a071d66ca8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-memeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-merlusdt-bar-1d
+ instrument_uid: 4948e3b5-3037-57ba-88da-3b10f69d0627
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-merlusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-metisusdt-bar-1d
+ instrument_uid: af23ec18-0a39-56bf-ac1b-87d5e2248251
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-metisusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-metusdt-bar-1d
+ instrument_uid: d397ccef-78a6-582e-a22a-52f39137a180
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-metusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-meusdt-bar-1d
+ instrument_uid: 7fec48ed-999d-52ef-8872-bbda8b1dffe7
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-meusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-mewusdt-bar-1d
+ instrument_uid: 9446e524-b1ae-5e7b-96ac-b699a171c87b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-mewusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-minausdt-bar-1d
+ instrument_uid: f5fb66fd-577f-59cf-87a4-9d1d43547626
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-minausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-mmtusdt-bar-1d
+ instrument_uid: b96798e4-730a-5634-8c1a-8a4094b01660
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-mmtusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-monusdt-bar-1d
+ instrument_uid: 9fb02777-3d2f-51bd-86e9-a37e52224326
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-monusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-moodengusdt-bar-1d
+ instrument_uid: d155abb8-8f0f-5934-81cc-39f102c4f2f5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-moodengusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-morphousdt-bar-1d
+ instrument_uid: d4f4fccc-77ba-584a-893d-db5c7fe40d9a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-morphousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-moveusdt-bar-1d
+ instrument_uid: 5dd80de2-abd6-5fd9-aae6-2eb0fc73738b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-moveusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-mubarakusdt-bar-1d
+ instrument_uid: 841529df-3a07-505f-b19e-dde3762242cf
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-mubarakusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-nearusdt-bar-1d
+ instrument_uid: be066d07-eee6-50a8-a137-73949877eeea
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-nearusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-neirousdt-bar-1d
+ instrument_uid: 47ad1648-48ef-50a8-9daf-c8beadd93cdb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-neirousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-neousdt-bar-1d
+ instrument_uid: 18112b74-b3c6-5c66-aeac-33daaf604127
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-neousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-nightusdt-bar-1d
+ instrument_uid: 28387599-f1ea-5df6-a4f2-a04aa341c5d0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-nightusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-nmrusdt-bar-1d
+ instrument_uid: 13d30031-2c7c-5df3-a625-d9aa62e58106
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-nmrusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-notusdt-bar-1d
+ instrument_uid: afb33b46-b1fd-53cf-8df6-7c881c12f6a1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-notusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ondousdt-bar-1d
+ instrument_uid: d909a518-8b6e-5286-ad80-ac435c739328
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ondousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-oneusdt-bar-1d
+ instrument_uid: 473238ca-4cf4-5dcf-8dd6-8731dd1d10f5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-oneusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ontusdt-bar-1d
+ instrument_uid: ef08a051-1cfb-5456-83e2-a0ceff1a1bf4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ontusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-onusdt-bar-1d
+ instrument_uid: f888a2f7-79c3-5a8f-9170-cca6be1325f5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-onusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-opgusdt-bar-1d
+ instrument_uid: 5c42b635-5750-5801-82a7-95ed1d3d6e31
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-opgusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-opnusdt-bar-1d
+ instrument_uid: 172daa75-28b7-5d37-a0bd-86a43f7d17b9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-opnusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-opusdt-bar-1d
+ instrument_uid: 944cf7e3-3429-5f32-9b47-594aa0c525c1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-opusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-orderusdt-bar-1d
+ instrument_uid: 9603abcf-8d45-588f-a676-2872dc3c62ba
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-orderusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ordiusdt-bar-1d
+ instrument_uid: ea9b707d-7913-5476-b9c7-a17a3c42d7c9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ordiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ousdt-bar-1d
+ instrument_uid: 830f340b-3646-5066-b5e7-4d0b126a44fe
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-pendleusdt-bar-1d
+ instrument_uid: af73725a-ff81-59f4-980d-06bd4cc2c082
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-pendleusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-penguusdt-bar-1d
+ instrument_uid: c76c9c52-1ca5-5d63-a9c4-03b9df5954b6
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-penguusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-peopleusdt-bar-1d
+ instrument_uid: af7e715a-ccad-5012-9fd4-bd7c16d4fcc2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-peopleusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-pieverseusdt-bar-1d
+ instrument_uid: e4e0e48e-9508-50c5-bce5-0abce19965b9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-pieverseusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-pippinusdt-bar-1d
+ instrument_uid: bdf97724-b6a0-5891-801a-a6a951c9174e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-pippinusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-plumeusdt-bar-1d
+ instrument_uid: 7d3db013-5ac0-5483-ba8b-0f03441f5672
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-plumeusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-pnutusdt-bar-1d
+ instrument_uid: 8b09286f-23d1-5740-8372-4a34941d74b7
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-pnutusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-polusdt-bar-1d
+ instrument_uid: d152df3e-e0d3-59b1-ba1f-7fa427418803
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-polusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-popcatusdt-bar-1d
+ instrument_uid: 145d10f1-0ec4-56ef-8098-050c7991da3a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-popcatusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-proveusdt-bar-1d
+ instrument_uid: 8375c606-0c2b-5e50-8f16-64650fcdedc0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-proveusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-pumpusdt-bar-1d
+ instrument_uid: aa92932b-1957-545f-825d-8d62cff956cb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-pumpusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-pythusdt-bar-1d
+ instrument_uid: a0d9742b-a58d-5cbf-808a-efe8de857cbe
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-pythusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-qntusdt-bar-1d
+ instrument_uid: 9c67e4be-b8bd-5203-ae50-445479a4a48e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-qntusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-qtumusdt-bar-1d
+ instrument_uid: 875e2059-18c6-5e10-bfbe-67894b86386c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-qtumusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-raveusdt-bar-1d
+ instrument_uid: d0a88aa5-d055-594d-9db7-fb56b8c06680
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-raveusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-recallusdt-bar-1d
+ instrument_uid: a5b65023-ca4e-522a-a14a-42d57ed978a9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-recallusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-renderusdt-bar-1d
+ instrument_uid: 26260988-93d4-536e-8400-f3fadbd530de
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-renderusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-resolvusdt-bar-1d
+ instrument_uid: b7b526a6-9361-5d6f-b4cc-f33a0ed80d47
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-resolvusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-reusdt-bar-1d
+ instrument_uid: 8540dfa8-3e81-5216-88b2-9a551d94fd6f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-reusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-riverusdt-bar-1d
+ instrument_uid: 397bdb54-bb4c-57d8-ba48-ab6b6712428a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-riverusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-robousdt-bar-1d
+ instrument_uid: b9c46ba4-1d0f-5fbe-a751-b2bd086f5a23
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-robousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-rsrusdt-bar-1d
+ instrument_uid: 0eee0320-f54c-50c6-8c31-cedc978f4246
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-rsrusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-rvnusdt-bar-1d
+ instrument_uid: 555b8bc8-ad58-5bea-83ef-0a59f7d8032f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-rvnusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-saharausdt-bar-1d
+ instrument_uid: cc0ebfed-f4ea-55dd-a7a6-fa83ff72befc
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-saharausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-sandusdt-bar-1d
+ instrument_uid: f693e7fa-26b4-554f-b4ab-5d34841777e5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-sandusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-sapienusdt-bar-1d
+ instrument_uid: 17c00406-ec03-5025-8703-ed77896ef07c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-sapienusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-seiusdt-bar-1d
+ instrument_uid: bcd51a8d-2e9f-5c7e-9796-eda0427c43b1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-seiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-sentusdt-bar-1d
+ instrument_uid: 3e2393ec-4ff4-5722-bc6d-01f7085e84d5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-sentusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-signusdt-bar-1d
+ instrument_uid: 6af3697a-83a0-5c72-9e1f-22a111c47cd4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-signusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-skyusdt-bar-1d
+ instrument_uid: c62e2e82-9528-5d8b-96d5-2b22eaa4badd
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-skyusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-slxusdt-bar-1d
+ instrument_uid: d7ab8d28-d6c2-5fab-876c-c968296b482d
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-slxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-snxusdt-bar-1d
+ instrument_uid: e1c5a42c-cd07-53de-b750-372fe3f3879a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-snxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-12h
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 12h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-15m
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 15m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-1d
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-1h
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 1h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-1m
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 1m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-1w
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 1w
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-2h
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 2h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-30m
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 30m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-3d
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 3d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-3m
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 3m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-4h
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 4h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-5m
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 5m
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-6h
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 6h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-bar-8h
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BAR
+ interval: 8h
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-bar-8h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 86400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-solusdt-book_delta
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-solusdt-book_snapshot
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: binance-usdm-solusdt-mark_index_price
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: binance-usdm-solusdt-quote
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: QUOTE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-quote-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: binance-usdm-solusdt-trade
+ instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ feed: TRADE
+ interval: null
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-solusdt-trade-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
+- binding_id: binance-usdm-soonusdt-bar-1d
+ instrument_uid: a2ecb519-7c65-5c8e-b489-b6b0aa663e53
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-soonusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-sophusdt-bar-1d
+ instrument_uid: 1422c865-e99b-5cad-90dc-8f3ba4166691
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-sophusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-spaceusdt-bar-1d
+ instrument_uid: 0e94d287-5960-5af4-89d2-a14bf24d8595
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-spaceusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-spkusdt-bar-1d
+ instrument_uid: d4ab40bf-f09d-5fe5-9d04-e9f3fef19d69
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-spkusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-spxusdt-bar-1d
+ instrument_uid: 3d2403d3-44cb-5989-924f-946704ccc6b8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-spxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ssvusdt-bar-1d
+ instrument_uid: 6f42584d-668f-5dab-80a1-a00058020e24
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ssvusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-stableusdt-bar-1d
+ instrument_uid: bc65c082-4ca8-5450-8597-f7f65a0ba923
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-stableusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-strkusdt-bar-1d
+ instrument_uid: 921f65bb-ef9f-5869-9a43-52655e58aad9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-strkusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-stxusdt-bar-1d
+ instrument_uid: 64f3b5bb-feb8-5035-909d-fd5aaff1f7cc
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-stxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-suiusdt-bar-1d
+ instrument_uid: 3c70b7c6-b026-5feb-8e8b-6693b7674f0a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-suiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-susdt-bar-1d
+ instrument_uid: 29b5753d-f377-5c23-8df5-e40e8f7df423
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-susdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-sushiusdt-bar-1d
+ instrument_uid: 28486f53-7cf2-5fc7-a18c-3b39524c2969
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-sushiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-syrupusdt-bar-1d
+ instrument_uid: 463ef46b-8665-5a5b-a9c8-259d2a4f18f6
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-syrupusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-taousdt-bar-1d
+ instrument_uid: fe2efca0-97a3-5b71-977a-e64af44d657c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-taousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-thetausdt-bar-1d
+ instrument_uid: 4e448108-2fdd-506a-9cf6-ca999736f8fb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-thetausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-tiausdt-bar-1d
+ instrument_uid: 966b2e80-c83a-5ad2-bb60-af1daea63fca
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-tiausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-trbusdt-bar-1d
+ instrument_uid: 07d4bbcf-2e5a-581c-81f5-a13caa3bfb0b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-trbusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-triausdt-bar-1d
+ instrument_uid: 40ecf915-b50f-5552-ae3b-b11ba6ce7aac
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-triausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-trumpusdt-bar-1d
+ instrument_uid: c7717222-2721-54a5-9119-4397db9205f0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-trumpusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-trustusdt-bar-1d
+ instrument_uid: f6b38750-2d9a-52ff-b76e-9f26fb70bd46
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-trustusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-truthusdt-bar-1d
+ instrument_uid: f122c0e0-d424-55af-a030-a421e88e6549
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-truthusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-trxusdt-bar-1d
+ instrument_uid: 19c3628a-2fce-505b-bd05-aceefe47132e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-trxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-turbousdt-bar-1d
+ instrument_uid: 51cce06a-7b90-5c59-be0e-433d02cc4f7e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-turbousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ubusdt-bar-1d
+ instrument_uid: a90edd17-ed7a-5b6e-90c6-b38c9de23edd
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ubusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-umausdt-bar-1d
+ instrument_uid: 54dfc708-50c9-5cb4-aff3-3a7b372014b3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-umausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-uniusdt-bar-1d
+ instrument_uid: c494f843-964d-549c-ae22-7831f47327ea
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-uniusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-uselessusdt-bar-1d
+ instrument_uid: 96004c94-3fb4-5eba-863e-3e0167e7a606
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-uselessusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-vanausdt-bar-1d
+ instrument_uid: 2832d236-116d-5e82-92d8-c4faae68ab1e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-vanausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-virtualusdt-bar-1d
+ instrument_uid: 8871d17f-b326-5ae6-9e7b-fd3dff2b0815
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-virtualusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-vvvusdt-bar-1d
+ instrument_uid: f75e5f45-7f1b-5282-9acc-18800ba9364e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-vvvusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-walusdt-bar-1d
+ instrument_uid: be32efaa-307f-595b-bc0a-4f1e5e00aba2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-walusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-wctusdt-bar-1d
+ instrument_uid: ad64efb9-c362-5e43-a52d-369589b8f662
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-wctusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-wetusdt-bar-1d
+ instrument_uid: 7228c509-3bf3-510f-9f00-63625011fc9b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-wetusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-wifusdt-bar-1d
+ instrument_uid: 1de09ca8-0a41-5153-96f2-edfb42bd4cd6
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-wifusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-wldusdt-bar-1d
+ instrument_uid: c4f936dd-3d28-54c6-8b01-30296462bbb9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-wldusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-wlfiusdt-bar-1d
+ instrument_uid: bf08776d-5b74-54e8-8330-dd87635e9435
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-wlfiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-woousdt-bar-1d
+ instrument_uid: a76febbe-c89f-5d57-b68a-3089e7b1a512
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-woousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-wusdt-bar-1d
+ instrument_uid: 47d98081-d269-5aeb-9766-5f689e2c6b35
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-wusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-xlmusdt-bar-1d
+ instrument_uid: fa2e9712-8ce9-538a-8b92-37c85401156c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-xlmusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-xplusdt-bar-1d
+ instrument_uid: bf47b0d3-dd95-53fe-be70-52a0d8975e44
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-xplusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-xrpusdt-bar-1d
+ instrument_uid: 8947d88d-729a-59a7-bb25-3e1189b7a5ac
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-xrpusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-xtzusdt-bar-1d
+ instrument_uid: f6a20794-dd2f-5d62-943e-dadb6e05749b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-xtzusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-ybusdt-bar-1d
+ instrument_uid: afdb7e7f-fd83-5bd7-ac2b-5bfa08397f66
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-ybusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-yfiusdt-bar-1d
+ instrument_uid: 44cfd3f6-82e1-54be-981c-254d7f805ce5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-yfiusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-yggusdt-bar-1d
+ instrument_uid: 94469df5-8e0e-5839-85c1-f6464481b1d3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-yggusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zamausdt-bar-1d
+ instrument_uid: d4b0d87b-fdeb-5b7b-86bc-381ee82ecd1f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zamausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zbtusdt-bar-1d
+ instrument_uid: 21b23463-7fd8-5950-9f2b-7fe1e67fedc0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zbtusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zecusdt-bar-1d
+ instrument_uid: 86b2ba7e-454f-53d0-b404-803f937583a5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zecusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zenusdt-bar-1d
+ instrument_uid: ceddccfd-3365-5c05-bfb8-660f7ec23bad
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zenusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zetausdt-bar-1d
+ instrument_uid: 5a093e28-0a61-5d94-adbf-5f88f221496a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zetausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zilusdt-bar-1d
+ instrument_uid: 4266e54f-5d02-511f-a9df-549689ea7361
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zilusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zkpusdt-bar-1d
+ instrument_uid: 1efbe499-8627-57ba-bb85-3a4546926231
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zkpusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zkusdt-bar-1d
+ instrument_uid: 0638ba89-f890-535a-9fc7-3358aa53179f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zkusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zorausdt-bar-1d
+ instrument_uid: 1bee6fd7-6bff-59ec-8d72-50ffce31b6ed
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zorausdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zrousdt-bar-1d
+ instrument_uid: e10c1a3c-f11a-57d8-ba19-c3c04dbeb028
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zrousdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: binance-usdm-zrxusdt-bar-1d
+ instrument_uid: 5068359f-b79a-5501-833c-4bc0bdcddb8c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: BINANCE_DIRECT
+ source_id: binance-usdm-zrxusdt-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: binance-usdm/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: BINANCE_BAR_GENERIC
+- binding_id: dnse-fpt-bar-1m
+ instrument_uid: 6f025ab7-c0b4-5e08-866d-34ce62aef52f
+ feed: BAR
+ interval: 1m
+ source:
+ provider: DNSE_DIRECT
+ source_id: dnse-fpt-bar-stable-001
+ source_role: PRIMARY
+ source_policy_id: vn_primary_v2
+ authoritative: true
+ adapter_version: dnse-openapi/2.0.1
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: false
+ v1_compatibility: NONE
+- binding_id: dnse-fpt-trade
+ instrument_uid: 6f025ab7-c0b4-5e08-866d-34ce62aef52f
+ feed: TRADE
+ interval: null
+ source:
+ provider: DNSE_DIRECT
+ source_id: dnse-fpt-trade-stable-001
+ source_role: PRIMARY
+ source_policy_id: vn_primary_v2
+ authoritative: true
+ adapter_version: dnse-openapi/2.0.1
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: false
+ v1_compatibility: VN_TRADE_GENERIC
+- binding_id: dnse-vn30f1m-bar-1m
+ instrument_uid: d0ac3d4c-2374-5690-8af5-b970448f91d3
+ feed: BAR
+ interval: 1m
+ source:
+ provider: DNSE_DIRECT
+ source_id: dnse-vn30f1m-bar-stable-001
+ source_role: PRIMARY
+ source_policy_id: vn_primary_v2
+ authoritative: true
+ adapter_version: dnse-openapi/2.0.1
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: false
+ v1_compatibility: NONE
+- binding_id: dnse-vn30f1m-trade
+ instrument_uid: d0ac3d4c-2374-5690-8af5-b970448f91d3
+ feed: TRADE
+ interval: null
+ source:
+ provider: DNSE_DIRECT
+ source_id: dnse-vn30f1m-trade-stable-001
+ source_role: PRIMARY
+ source_policy_id: vn_primary_v2
+ authoritative: true
+ adapter_version: dnse-openapi/2.0.1
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: false
+ v1_compatibility: VN_TRADE_GENERIC
+- binding_id: okx-futures-btc-usd-261225-book_delta
+ instrument_uid: 4da91f9c-187c-55a3-be4e-ab0856cf9da2
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-btc-usd-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-btc-usd-261225-book_snapshot
+ instrument_uid: 4da91f9c-187c-55a3-be4e-ab0856cf9da2
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-btc-usd-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-btc-usd-270326-book_delta
+ instrument_uid: 25394e32-7c78-5a0c-bc0f-922b5459e130
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-btc-usd-270326-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-btc-usd-270326-book_snapshot
+ instrument_uid: 25394e32-7c78-5a0c-bc0f-922b5459e130
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-btc-usd-270326-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-eth-usd-261225-book_delta
+ instrument_uid: 0d522cb3-d764-5066-9e96-19f1817e84d7
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-eth-usd-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-eth-usd-261225-book_snapshot
+ instrument_uid: 0d522cb3-d764-5066-9e96-19f1817e84d7
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-eth-usd-261225-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-eth-usd-270326-book_delta
+ instrument_uid: a2cd7118-c7c0-5096-b42f-9ac658783ab3
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-eth-usd-270326-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-futures-eth-usd-270326-book_snapshot
+ instrument_uid: a2cd7118-c7c0-5096-b42f-9ac658783ab3
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-futures-eth-usd-270326-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-spot-btcusdt-bar-1m
+ instrument_uid: 9e996914-aa98-5ea0-b0a0-a78dc51e1f8d
+ feed: BAR
+ interval: 1m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-spot-btcusdt-bar-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-spot-btcusdt-quote
+ instrument_uid: 9e996914-aa98-5ea0-b0a0-a78dc51e1f8d
+ feed: QUOTE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-spot-btcusdt-quote-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-spot-btcusdt-trade
+ instrument_uid: 9e996914-aa98-5ea0-b0a0-a78dc51e1f8d
+ feed: TRADE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-spot-btcusdt-trade-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-0g-usdt-swap-bar-1d
+ instrument_uid: a3b5105d-867a-5642-8bd6-839890060801
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-0g-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-1inch-usdt-swap-bar-1d
+ instrument_uid: 289763f0-b5a1-54c7-bba4-056f17165f0c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-1inch-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-2z-usdt-swap-bar-1d
+ instrument_uid: adc4bf83-b054-5f94-8ff6-7678579db124
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-2z-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-a-usdt-swap-bar-1d
+ instrument_uid: a2098fe2-1ea7-524b-973a-51a12170995b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-a-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-aave-usdt-swap-bar-1d
+ instrument_uid: f5a63ee0-7db9-5696-b84e-ab0d4b06ce2a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-aave-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-act-usdt-swap-bar-1d
+ instrument_uid: d51c82b5-73b7-59ac-9619-162ae56cbf31
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-act-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-acu-usdt-swap-bar-1d
+ instrument_uid: 256ec9a1-8d20-597a-b2fb-38f5dc1fe565
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-acu-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-ada-usdt-swap-bar-1d
+ instrument_uid: 4dfc6d0e-ead5-5b66-b680-ab4be9fcb006
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-ada-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-aero-usdt-swap-bar-1d
+ instrument_uid: f356265e-f401-5851-8157-ff8e294f34d2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-aero-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-aevo-usdt-swap-bar-1d
+ instrument_uid: 8c029be8-d578-5909-b2af-10ed4d7092c4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-aevo-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-agld-usdt-swap-bar-1d
+ instrument_uid: 235049a1-cf7f-5522-b01e-e37d40f9369a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-agld-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-aixbt-usdt-swap-bar-1d
+ instrument_uid: 6060943d-4f6b-5a3f-a7b7-33e32b136f9f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-aixbt-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-algo-usdt-swap-bar-1d
+ instrument_uid: fd7ff987-a411-5139-9f6b-e70c7f03d6e4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-algo-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-allo-usdt-swap-bar-1d
+ instrument_uid: a640fd51-235d-59b7-b21a-c2e6b42e8eea
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-allo-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-anime-usdt-swap-bar-1d
+ instrument_uid: 8d97188f-2e7d-5da4-8119-f0a72b370ce0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-anime-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-ape-usdt-swap-bar-1d
+ instrument_uid: 65a8ce81-79af-5f85-9e44-4475ae3605d2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-ape-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-api3-usdt-swap-bar-1d
+ instrument_uid: ea9eb608-383e-5b81-9669-6a4afbf2b530
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-api3-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-apr-usdt-swap-bar-1d
+ instrument_uid: 3972e5a1-86e2-5ad3-b618-fb0c3c3883b5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-apr-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-apt-usdt-swap-bar-1d
+ instrument_uid: 5165ddf3-9ae3-58de-ac8a-8d63ccaee28b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-apt-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-ar-usdt-swap-bar-1d
+ instrument_uid: f8054e3a-1f79-57fb-9b98-a21a24348e74
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-ar-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-arb-usdt-swap-bar-1d
+ instrument_uid: c93702ef-d71b-512e-8cc8-5ecd3615a644
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-arb-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-arkm-usdt-swap-bar-1d
+ instrument_uid: 98d5b8b5-75af-5e2b-b9ce-1d0480d98316
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-arkm-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-arx-usdt-swap-bar-1d
+ instrument_uid: 79f2eb58-b5bc-5319-8e8a-4b7951365d67
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-arx-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-aster-usdt-swap-bar-1d
+ instrument_uid: 48ab37f6-4785-5ad6-b3e3-916d52a99fcd
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-aster-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-at-usdt-swap-bar-1d
+ instrument_uid: c5b36eb9-1f69-5f18-90db-6d517c0488bb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-at-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-ath-usdt-swap-bar-1d
+ instrument_uid: f869a1e1-e714-53d9-9dfe-828b42ae81c3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-ath-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-atom-usdt-swap-bar-1d
+ instrument_uid: 3ffaf140-0a92-512f-9024-d5e2ee2fe059
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-atom-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-auction-usdt-swap-bar-1d
+ instrument_uid: 7d65b700-2308-5a0c-a7a9-252d41c80981
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-auction-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-avax-usdt-swap-bar-1d
+ instrument_uid: 507e7575-15f4-5f2e-bd0b-e846fe5526a0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-avax-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-avnt-usdt-swap-bar-1d
+ instrument_uid: 178533cf-690f-53b6-892b-8d2064e856cb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-avnt-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-axs-usdt-swap-bar-1d
+ instrument_uid: 3225191d-c00c-585f-b9b2-38638a334156
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-axs-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-aztec-usdt-swap-bar-1d
+ instrument_uid: 203a98b3-8a3e-5453-8355-e54e502f3e0e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-aztec-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-baby-usdt-swap-bar-1d
+ instrument_uid: 3b9dba04-5e62-5afa-9646-1ea56ea22c71
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-baby-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-band-usdt-swap-bar-1d
+ instrument_uid: 95294011-4f97-5df4-bac8-b9a1e128e595
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-band-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bard-usdt-swap-bar-1d
+ instrument_uid: edb2816d-e9d4-5547-bf3b-abb14dec58bb
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bard-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-based-usdt-swap-bar-1d
+ instrument_uid: fe539963-7719-5e2b-85f8-213f889f2433
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-based-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bat-usdt-swap-bar-1d
+ instrument_uid: 60a93fc7-e0c2-5bf1-baba-91248afba2d0
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bat-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bch-usdt-swap-bar-1d
+ instrument_uid: e1dbf2df-216a-589f-9d50-160825eec9c3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bch-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-beat-usdt-swap-bar-1d
+ instrument_uid: 319aae36-a24a-5e82-9b70-aa2770aabbee
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-beat-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bera-usdt-swap-bar-1d
+ instrument_uid: 71938fe0-fd7b-55ea-b43d-569751b83945
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bera-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bico-usdt-swap-bar-1d
+ instrument_uid: e20788ab-5f1e-54f9-9db7-eb43eadcd6d9
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bico-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bigtime-usdt-swap-bar-1d
+ instrument_uid: 90c794b3-17ca-5335-876f-244747669c7f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bigtime-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bill-usdt-swap-bar-1d
+ instrument_uid: 0c9901a2-d4ff-53d6-b55e-66bc1fe92f23
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bill-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bio-usdt-swap-bar-1d
+ instrument_uid: 07013277-a316-5034-b845-949aef2c6d33
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bio-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-blur-usdt-swap-bar-1d
+ instrument_uid: 3c1609c9-5606-53bd-ba2f-92ee45eadf5c
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-blur-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-12h
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 12h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-15m
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 15m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-1d
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-1h
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 1h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-1m
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 1m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-1w
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 1w
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-2d
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 2d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-2d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 518400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-2h
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 2h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-30m
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 30m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-3d
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 3d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-3m
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 3m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-4h
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 4h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-5m
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 5m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-bar-6h
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BAR
+ interval: 6h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-book_delta
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-book_snapshot
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-mark_index_price
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-quote
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: QUOTE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-quote-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: okx-swap-bnb-usdt-swap-trade
+ instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: TRADE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bnb-usdt-swap-trade-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bome-usdt-swap-bar-1d
+ instrument_uid: 911d8f09-a9c1-5d0f-b448-8ff475f26fac
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bome-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bonk-usdt-swap-bar-1d
+ instrument_uid: 9f885fc0-baed-514b-8208-93680d827cd5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bonk-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-brett-usdt-swap-bar-1d
+ instrument_uid: 71811c18-9781-5d02-9d09-26e6177ae6c2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-brett-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-brev-usdt-swap-bar-1d
+ instrument_uid: 6d3356bb-1bd4-53ae-9e44-f6f5f922c113
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-brev-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-bsb-usdt-swap-bar-1d
+ instrument_uid: c464706c-3b06-56e0-944e-f267bc9a6ce3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-bsb-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-12h
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 12h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-15m
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 15m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-1d
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-1h
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 1h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-1w
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 1w
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-2d
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 2d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-2d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 518400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-2h
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 2h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-30m
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 30m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-3d
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 3d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-3m
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 3m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-4h
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 4h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-5m
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 5m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-bar-6h
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 6h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-book_delta
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-book_snapshot
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btc-usdt-swap-mark_index_price
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btc-usdt-swap-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: okx-swap-btcusdt-bar-1m
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: BAR
+ interval: 1m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btcusdt-bar-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-btcusdt-quote
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: QUOTE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btcusdt-quote-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: okx-swap-btcusdt-trade
+ instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: TRADE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-btcusdt-trade-stable-001
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-cap-usdt-swap-bar-1d
+ instrument_uid: 0414ddcb-cdf9-5526-bee6-c1e163b0dddc
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-cap-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-cc-usdt-swap-bar-1d
+ instrument_uid: d7d32090-97db-5095-8253-b5de3e21d5d1
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-cc-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-celo-usdt-swap-bar-1d
+ instrument_uid: 6725804c-2929-5315-bd4e-4a21d3825f75
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-celo-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-cfx-usdt-swap-bar-1d
+ instrument_uid: 0dcec1fa-50ad-5331-9f21-54a763d63728
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-cfx-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-chip-usdt-swap-bar-1d
+ instrument_uid: 7d5325c8-5aca-5be3-9f12-f32e1ee54403
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-chip-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-chz-usdt-swap-bar-1d
+ instrument_uid: 73db6ef0-8d34-55fa-ae44-a531598b5c19
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-chz-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-coai-usdt-swap-bar-1d
+ instrument_uid: 17b0014a-f8aa-54b3-aba3-8bb3b53a0cb5
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-coai-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-comp-usdt-swap-bar-1d
+ instrument_uid: b1eba3de-3bef-55a7-9f3d-a83b0f5b2883
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-comp-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-crv-usdt-swap-bar-1d
+ instrument_uid: afefd678-4d6f-51a9-82aa-8cf6584c1280
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-crv-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-cvx-usdt-swap-bar-1d
+ instrument_uid: 4577295f-71f8-5786-b492-3860d3628a0b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-cvx-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-dash-usdt-swap-bar-1d
+ instrument_uid: c86dd48a-f192-5370-9023-cc8654f83f30
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-dash-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-12h
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 12h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-12h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 129600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-15m
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 15m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-15m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2700000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-1d
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-1h
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 1h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-1h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 10800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-1m
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 1m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-1w
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 1w
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-1w-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 1814400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-2d
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 2d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-2d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 518400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-2h
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 2h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-2h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 21600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-30m
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 30m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-30m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-3d
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 3d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-3d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 777600000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-3m
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 3m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-3m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 540000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-4h
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 4h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-4h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 43200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-5m
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 5m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-5m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 900000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-bar-6h
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ interval: 6h
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-bar-6h-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 64800000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-book_delta
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BOOK_DELTA
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-book_snapshot
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BOOK_SNAPSHOT
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-book-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 60000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-mark_index_price
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: MARK_INDEX_PRICE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-mark_index_price-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_liquid_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 2000
+ require_final_bar: false
+ continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-quote
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: QUOTE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-quote-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 5000
+ require_final_bar: false
+ continuous_calendar: true
+ delivery_semantics: ON_CHANGE
+ v1_compatibility: NONE
+- binding_id: okx-swap-doge-usdt-swap-trade
+ instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: TRADE
+ interval: null
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-doge-usdt-swap-trade-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 15000
+ require_final_bar: false
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-dood-usdt-swap-bar-1d
+ instrument_uid: 235dac6d-c8f4-5fdf-9e43-c63b7acb2695
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-dood-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-dos-usdt-swap-bar-1d
+ instrument_uid: 8c38db3b-1506-5cb8-aad8-88eff197632b
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-dos-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-dot-usdt-swap-bar-1d
+ instrument_uid: 292be648-85a0-5bc0-b2ac-a92b78bf59b3
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-dot-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-dydx-usdt-swap-bar-1d
+ instrument_uid: 4546dfee-c278-5efd-932e-6c7d70fe7614
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-dydx-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-eden-usdt-swap-bar-1d
+ instrument_uid: f0218fe0-e2bf-56b3-b9c0-de1182f1c5f8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-eden-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-edge-usdt-swap-bar-1d
+ instrument_uid: 24c96a8e-7426-5015-b35c-6f3d68a07ab2
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-edge-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-egld-usdt-swap-bar-1d
+ instrument_uid: 4ed9c3b0-c7a2-5503-9b76-6e55bfd2796b
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-spot-btcusdt-bar-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-egld-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-spot/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-spot-btcusdt-quote
- instrument_uid: 26edfffd-6824-5e75-a620-5a122b3e1086
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-eigen-usdt-swap-bar-1d
+ instrument_uid: 5cdb4aec-8296-5fe4-8819-4d4c59359237
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-spot-btcusdt-quote-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-eigen-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-spot/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-spot-btcusdt-trade
- instrument_uid: 26edfffd-6824-5e75-a620-5a122b3e1086
- feed: TRADE
- interval: null
+- binding_id: okx-swap-ena-usdt-swap-bar-1d
+ instrument_uid: 489ea514-438e-557d-afd0-1f45af70d83e
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-spot-btcusdt-trade-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-ena-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-spot/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_TRADE_MARKET_ONLY
-- binding_id: binance-usdm-bnbusdt-bar-12h
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-enj-usdt-swap-bar-1d
+ instrument_uid: 26baedc8-2048-50f2-9a1c-af80f289753e
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-enj-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-ens-usdt-swap-bar-1d
+ instrument_uid: 1d51893f-f23d-5ea1-a0db-e98d5d85ddf8
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-ens-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-enso-usdt-swap-bar-1d
+ instrument_uid: 82032262-6777-5cf9-8f1a-bf683a6ddb41
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-enso-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-esp-usdt-swap-bar-1d
+ instrument_uid: 63b3db9e-afe4-5b72-821a-184be6395dd4
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-esp-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-etc-usdt-swap-bar-1d
+ instrument_uid: 387cd038-59b0-5bbc-a1d0-b70c809fdbaf
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-etc-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-12h
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 12h
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-12h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-12h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 129600000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-15m
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-15m
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 15m
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-15m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-15m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 2700000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-1d
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-1d
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-1d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-1h
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-1h
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 1h
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-1h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-1h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 10800000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-1m
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-1m
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 1m
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-1m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-1m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 180000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-1w
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-1w
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 1w
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-1w-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-1w-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 1814400000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-2h
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-2d
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: BAR
+ interval: 2d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-2d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 518400000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-2h
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 2h
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-2h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-2h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 21600000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-30m
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-30m
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 30m
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-30m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-30m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 5400000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-3d
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-3d
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 3d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-3d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-3d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 777600000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-3m
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-3m
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 3m
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-3m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-3m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 540000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-4h
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-4h
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 4h
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-4h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-4h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 43200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-5m
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-5m
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 5m
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-5m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-5m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 900000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-6h
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-bar-6h
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
interval: 6h
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-6h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-bar-6h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 64800000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-bar-8h
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BAR
- interval: 8h
- source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-bar-8h-primary-v2
- source_role: PRIMARY
- source_policy_id: crypto_primary_v2
- authoritative: true
- adapter_version: binance-usdm/2.0.0
- normalizer_version: qdl-rust-core/2.0.0
- quality:
- stale_after_ms: 86400000
- require_final_bar: true
- continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-bnbusdt-book_delta
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ v1_compatibility: NONE
+- binding_id: okx-swap-eth-usdt-swap-book_delta
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BOOK_DELTA
interval: null
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-book-primary-v2
source_role: PRIMARY
source_policy_id: crypto_liquid_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
+ stale_after_ms: 60000
require_final_bar: false
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-bnbusdt-book_snapshot
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+- binding_id: okx-swap-eth-usdt-swap-book_snapshot
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BOOK_SNAPSHOT
interval: null
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-book-primary-v2
source_role: PRIMARY
source_policy_id: crypto_liquid_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 60000
require_final_bar: false
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-bnbusdt-mark_index_price
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+- binding_id: okx-swap-eth-usdt-swap-mark_index_price
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: MARK_INDEX_PRICE
interval: null
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-mark_index_price-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-mark_index_price-primary-v2
source_role: PRIMARY
source_policy_id: crypto_liquid_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 2000
@@ -820,17 +20018,17 @@ bindings:
continuous_calendar: true
freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: binance-usdm-bnbusdt-quote
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+- binding_id: okx-swap-eth-usdt-swap-quote
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: QUOTE
interval: null
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-quote-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-quote-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 5000
@@ -838,1755 +20036,1781 @@ bindings:
continuous_calendar: true
delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: binance-usdm-bnbusdt-trade
- instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+- binding_id: okx-swap-eth-usdt-swap-trade
+ instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: TRADE
interval: null
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-bnbusdt-trade-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-eth-usdt-swap-trade-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 15000
require_final_bar: false
continuous_calendar: true
- v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
-- binding_id: binance-usdm-btcusdt-260925-book_delta
- instrument_uid: f1228887-3053-5b61-9aea-11d3833f8a62
- feed: BOOK_DELTA
- interval: null
+ v1_compatibility: NONE
+- binding_id: okx-swap-ethfi-usdt-swap-bar-1d
+ instrument_uid: 5e2aad21-b8c6-5a22-badf-df62fcfd8b8b
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-260925-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ethfi-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-260925-book_snapshot
- instrument_uid: f1228887-3053-5b61-9aea-11d3833f8a62
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-ethw-usdt-swap-bar-1d
+ instrument_uid: 9f8acd08-a48b-5250-8f11-cfba5a08d003
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-260925-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ethw-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-261225-book_delta
- instrument_uid: a1bf2602-781a-56be-9922-52d1fbf327e5
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-f-usdt-swap-bar-1d
+ instrument_uid: e653b192-ecf4-5325-88a8-a04551746c1a
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-261225-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-f-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-261225-book_snapshot
- instrument_uid: a1bf2602-781a-56be-9922-52d1fbf327e5
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-fartcoin-usdt-swap-bar-1d
+ instrument_uid: 20646822-2fc8-5481-b537-5512f04bbfcd
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-261225-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-fartcoin-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-bar-12h
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+- binding_id: okx-swap-fil-usdt-swap-bar-1d
+ instrument_uid: fcb15aad-f5e9-5245-9f5c-3aa66b4d6507
feed: BAR
- interval: 12h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-12h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-fil-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-15m
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-floki-usdt-swap-bar-1d
+ instrument_uid: 36634174-d68e-5d1b-8a57-0746757d61ae
feed: BAR
- interval: 15m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-15m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-floki-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-1d
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-flow-usdt-swap-bar-1d
+ instrument_uid: a0a4d5db-8302-5642-9bd4-b2793fe1be87
feed: BAR
interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-1d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-flow-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-1h
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-fogo-usdt-swap-bar-1d
+ instrument_uid: bd0199bd-f1ef-591c-b8e8-302087a52eb8
feed: BAR
- interval: 1h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-1h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-fogo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-1m
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-gala-usdt-swap-bar-1d
+ instrument_uid: e8d8b9ac-61c8-53d9-aa43-f8015e885f58
feed: BAR
- interval: 1m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-gala-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-bar-1w
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+- binding_id: okx-swap-gas-usdt-swap-bar-1d
+ instrument_uid: 65f789bb-7953-55b3-88ed-bb47357ad12a
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-gas-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-giggle-usdt-swap-bar-1d
+ instrument_uid: 2a20f1eb-ccd6-591d-aea6-310c5273eef7
+ feed: BAR
+ interval: 1d
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-giggle-usdt-swap-bar-1d-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-glm-usdt-swap-bar-1d
+ instrument_uid: 15fc9a9d-0df2-5151-a349-584edc626597
feed: BAR
- interval: 1w
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-1w-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-glm-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-2h
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-gmt-usdt-swap-bar-1d
+ instrument_uid: 5336b28c-d8c6-5ec9-a71d-f35fffe2b35d
feed: BAR
- interval: 2h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-2h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-gmt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-30m
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-gmx-usdt-swap-bar-1d
+ instrument_uid: fc938060-7733-5efe-9050-68be8f156a9e
feed: BAR
- interval: 30m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-30m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-gmx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-3d
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-gps-usdt-swap-bar-1d
+ instrument_uid: 176b8d35-f51e-5abb-8eda-fcd70b43b2f0
feed: BAR
- interval: 3d
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-3d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-gps-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-3m
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-gram-usdt-swap-bar-1d
+ instrument_uid: 183d6b91-1ac1-5334-9b0c-f86a98316df3
feed: BAR
- interval: 3m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-3m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-gram-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-4h
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-grass-usdt-swap-bar-1d
+ instrument_uid: 1e759e5a-7609-57d9-8376-dd32765a78a6
feed: BAR
- interval: 4h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-4h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-grass-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-5m
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-grt-usdt-swap-bar-1d
+ instrument_uid: 20df3a21-188b-5d43-bd86-89cdb130b05f
feed: BAR
- interval: 5m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-5m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-grt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-6h
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-grvt-usdt-swap-bar-1d
+ instrument_uid: c2577593-ef21-50d4-ad40-3c23bb0fa4cc
feed: BAR
- interval: 6h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-6h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-grvt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-bar-8h
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ v1_compatibility: NONE
+- binding_id: okx-swap-h-usdt-swap-bar-1d
+ instrument_uid: 0c366f91-4035-5e8f-a90d-79b7fe6f9d8f
feed: BAR
- interval: 8h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-bar-8h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-h-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 86400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-btcusdt-book_delta
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
- feed: BOOK_DELTA
- interval: null
+ v1_compatibility: NONE
+- binding_id: okx-swap-hbar-usdt-swap-bar-1d
+ instrument_uid: 61db3057-2ee1-5185-a84f-639b8bc5f0e8
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-hbar-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-book_snapshot
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-hmstr-usdt-swap-bar-1d
+ instrument_uid: a34f42e7-0573-5df3-80cd-9084b7f75687
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-hmstr-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-mark_index_price
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-home-usdt-swap-bar-1d
+ instrument_uid: 17b7003c-122e-5e83-9347-757a0f55deb8
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-mark_index_price-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-home-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-quote
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-huma-usdt-swap-bar-1d
+ instrument_uid: 31fa85a6-84af-5460-a60b-60d36d7dd9c1
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-quote-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-huma-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: binance-usdm-btcusdt-trade
- instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
- feed: TRADE
- interval: null
+- binding_id: okx-swap-hype-usdt-swap-bar-1d
+ instrument_uid: a94e40cf-8e6a-5861-ba13-dafed1d90271
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-btcusdt-trade-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-hype-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-12h
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-icp-usdt-swap-bar-1d
+ instrument_uid: de72f091-5621-58d0-af8a-db73f1c171ee
feed: BAR
- interval: 12h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-12h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-icp-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-15m
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-imx-usdt-swap-bar-1d
+ instrument_uid: 570343fe-2838-5406-bbfb-f33f719eeb93
feed: BAR
- interval: 15m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-15m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-imx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-1d
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-init-usdt-swap-bar-1d
+ instrument_uid: 35b1c49f-18fe-5ef3-945c-e49b6201ffc7
feed: BAR
interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-1d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-init-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-1h
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-inj-usdt-swap-bar-1d
+ instrument_uid: a583d89b-cbb8-522a-b0ef-2d45958b97be
feed: BAR
- interval: 1h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-1h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-inj-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-1m
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-iost-usdt-swap-bar-1d
+ instrument_uid: 86b10bc8-6dd9-51a0-ad1d-5c56b1491bee
feed: BAR
- interval: 1m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-1m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-iost-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-1w
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-iota-usdt-swap-bar-1d
+ instrument_uid: b825c1a3-edec-52b7-999c-a336a4bcd817
feed: BAR
- interval: 1w
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-1w-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-iota-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-2h
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-irys-usdt-swap-bar-1d
+ instrument_uid: bfef0630-a478-5996-a534-78a181d72cbc
feed: BAR
- interval: 2h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-2h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-irys-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-30m
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-jellyjelly-usdt-swap-bar-1d
+ instrument_uid: 318696f4-cfb2-52b1-9f52-105f6a8ac140
feed: BAR
- interval: 30m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-30m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-jellyjelly-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-3d
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-jto-usdt-swap-bar-1d
+ instrument_uid: a447abdb-17fa-52da-9499-aaf4cf51048e
feed: BAR
- interval: 3d
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-3d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-jto-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-3m
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-jup-usdt-swap-bar-1d
+ instrument_uid: 14d5f443-1410-568b-9cad-ea30566aa1f2
feed: BAR
- interval: 3m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-3m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-jup-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-4h
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-kaito-usdt-swap-bar-1d
+ instrument_uid: e8f4a1d8-7c75-5271-9f2c-cebed1e317c0
feed: BAR
- interval: 4h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-4h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-kaito-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-5m
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-kat-usdt-swap-bar-1d
+ instrument_uid: 195652dd-5450-5ed1-8059-3a90ff9d2e3d
feed: BAR
- interval: 5m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-5m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-kat-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-6h
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-kgen-usdt-swap-bar-1d
+ instrument_uid: 884cf4b4-b78d-5b31-862f-92f6c3a59781
feed: BAR
- interval: 6h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-6h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-kgen-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-bar-8h
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ v1_compatibility: NONE
+- binding_id: okx-swap-kite-usdt-swap-bar-1d
+ instrument_uid: ae998e95-9c34-5d87-9e0e-8677dcea9e1f
feed: BAR
- interval: 8h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-bar-8h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-kite-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 86400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-dogeusdt-book_delta
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: BOOK_DELTA
- interval: null
+ v1_compatibility: NONE
+- binding_id: okx-swap-kmno-usdt-swap-bar-1d
+ instrument_uid: 646c3736-dfab-5991-b6da-630371e190dd
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-kmno-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-dogeusdt-book_snapshot
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-ksm-usdt-swap-bar-1d
+ instrument_uid: 99a4b5da-751f-54f9-85b2-b37fac4f1c84
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ksm-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-dogeusdt-mark_index_price
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-la-usdt-swap-bar-1d
+ instrument_uid: 3a3e5936-9911-56a6-8c11-f74a5df1ae48
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-mark_index_price-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-la-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: binance-usdm-dogeusdt-quote
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-lab-usdt-swap-bar-1d
+ instrument_uid: 270bf956-2840-5f96-8280-f4d6086edf9f
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-quote-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-lab-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: binance-usdm-dogeusdt-trade
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: TRADE
- interval: null
+- binding_id: okx-swap-layer-usdt-swap-bar-1d
+ instrument_uid: 4ad24830-64f9-5e62-b115-f11c5619bdef
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-dogeusdt-trade-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-layer-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
-- binding_id: binance-usdm-ethusdt-260925-book_delta
- instrument_uid: 9e24d8dd-e74b-5f9b-a770-2556bbc89d37
- feed: BOOK_DELTA
- interval: null
+ v1_compatibility: NONE
+- binding_id: okx-swap-ldo-usdt-swap-bar-1d
+ instrument_uid: cc8696da-de35-5b97-a735-305be3007c5d
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-260925-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ldo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-260925-book_snapshot
- instrument_uid: 9e24d8dd-e74b-5f9b-a770-2556bbc89d37
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-linea-usdt-swap-bar-1d
+ instrument_uid: 3da91678-916e-5b47-89e8-f17415a6c86f
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-260925-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-linea-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-261225-book_delta
- instrument_uid: bc0775be-e02e-5ad4-a0fd-1fff10a4451c
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-link-usdt-swap-bar-1d
+ instrument_uid: b05f357a-776d-5fb2-a701-483e0838bf6d
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-261225-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-link-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-261225-book_snapshot
- instrument_uid: bc0775be-e02e-5ad4-a0fd-1fff10a4451c
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-lit-usdt-swap-bar-1d
+ instrument_uid: 25e71abf-12a5-5592-bb66-01aeb4ec654e
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-261225-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-lit-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-bar-12h
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+- binding_id: okx-swap-lpt-usdt-swap-bar-1d
+ instrument_uid: 5c0400ee-5571-5e36-ae79-5898f75f7e49
feed: BAR
- interval: 12h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-12h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-lpt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-15m
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-lqty-usdt-swap-bar-1d
+ instrument_uid: 853e2ca1-d5ec-5ce1-b7aa-2d0384a242f2
feed: BAR
- interval: 15m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-15m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-lqty-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-1d
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-ltc-usdt-swap-bar-1d
+ instrument_uid: 35774e81-f965-5c8e-accf-3324fecc1fa5
feed: BAR
interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-1d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ltc-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-1h
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-magic-usdt-swap-bar-1d
+ instrument_uid: f6f6342f-5ea9-5491-be55-0d2cac840f88
feed: BAR
- interval: 1h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-1h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-magic-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-1m
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-mana-usdt-swap-bar-1d
+ instrument_uid: 5b8fa4b3-8e22-527e-9c5f-1bc4bce52ea1
feed: BAR
- interval: 1m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-1m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mana-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-bar-1w
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+- binding_id: okx-swap-mask-usdt-swap-bar-1d
+ instrument_uid: ccdc25a6-00a2-593f-bf6c-98d6a45441fd
feed: BAR
- interval: 1w
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-1w-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mask-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-2h
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-me-usdt-swap-bar-1d
+ instrument_uid: 4c64df18-1b0c-5421-8fa7-311e99b8f2c3
feed: BAR
- interval: 2h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-2h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-me-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-30m
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-mega-usdt-swap-bar-1d
+ instrument_uid: 584edfc0-b4dc-55fb-92ba-6c11d6c23beb
feed: BAR
- interval: 30m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-30m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mega-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-3d
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-meme-usdt-swap-bar-1d
+ instrument_uid: c3b6e04c-e7ea-5345-8bf7-53548d7ca3e6
feed: BAR
- interval: 3d
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-3d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-meme-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-3m
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-merl-usdt-swap-bar-1d
+ instrument_uid: 7e348480-a4c5-564c-b594-8c78c1b61c38
feed: BAR
- interval: 3m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-3m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-merl-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-4h
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-met-usdt-swap-bar-1d
+ instrument_uid: be5ea6cc-f563-51fa-bc10-9c058c425bf3
feed: BAR
- interval: 4h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-4h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-met-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-5m
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-metis-usdt-swap-bar-1d
+ instrument_uid: c6ae2a4c-3338-544d-b14e-05035b0976cb
feed: BAR
- interval: 5m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-5m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-metis-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-6h
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-mew-usdt-swap-bar-1d
+ instrument_uid: eac1a50e-ee45-5720-9299-5aedf9727450
feed: BAR
- interval: 6h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-6h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mew-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-bar-8h
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ v1_compatibility: NONE
+- binding_id: okx-swap-mina-usdt-swap-bar-1d
+ instrument_uid: c2a4cfc9-f776-5b5f-92e5-93968a3b5f7f
feed: BAR
- interval: 8h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-bar-8h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mina-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 86400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-ethusdt-book_delta
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: BOOK_DELTA
- interval: null
+ v1_compatibility: NONE
+- binding_id: okx-swap-mmt-usdt-swap-bar-1d
+ instrument_uid: 2d9b86aa-6d14-5b37-9606-cbeb7f9fb99f
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mmt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-book_snapshot
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-mon-usdt-swap-bar-1d
+ instrument_uid: 0894b131-b84e-5572-8739-cdf71c3635d9
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mon-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-mark_index_price
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-moodeng-usdt-swap-bar-1d
+ instrument_uid: 65ff2489-e48d-5bf9-add1-c6914ee0256a
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-mark_index_price-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-moodeng-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-quote
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-morpho-usdt-swap-bar-1d
+ instrument_uid: 00014941-4c7d-5d7a-92cc-00a83d5cf499
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-quote-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-morpho-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: binance-usdm-ethusdt-trade
- instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: TRADE
- interval: null
+- binding_id: okx-swap-move-usdt-swap-bar-1d
+ instrument_uid: 9351416b-7e70-583d-8b77-869eb6c5bea0
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-ethusdt-trade-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-move-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
-- binding_id: binance-usdm-solusdt-bar-12h
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-mubarak-usdt-swap-bar-1d
+ instrument_uid: fab3bb0f-c0e5-58b6-94b9-7515d3fef752
feed: BAR
- interval: 12h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-12h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-mubarak-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-15m
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-near-usdt-swap-bar-1d
+ instrument_uid: 62df6d23-97c0-56d2-b692-2599900de181
feed: BAR
- interval: 15m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-15m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-near-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-1d
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-neiro-usdt-swap-bar-1d
+ instrument_uid: 2938c47d-5ce9-5831-902c-39668fde211f
feed: BAR
interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-1d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-neiro-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-1h
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-neo-usdt-swap-bar-1d
+ instrument_uid: aeb5de89-5b1b-55ee-9168-09d36928c04d
feed: BAR
- interval: 1h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-1h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-neo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-1m
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-night-usdt-swap-bar-1d
+ instrument_uid: 8f467d3f-0a67-5b81-82f9-16f0d8385b39
feed: BAR
- interval: 1m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-1m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-night-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-1w
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-nmr-usdt-swap-bar-1d
+ instrument_uid: ac172201-2cdd-5d63-906a-5e567bf2a6f7
feed: BAR
- interval: 1w
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-1w-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-nmr-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-2h
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-not-usdt-swap-bar-1d
+ instrument_uid: 27982e73-8051-5150-9427-09d97acfe909
feed: BAR
- interval: 2h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-2h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-not-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-30m
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-o-usdt-swap-bar-1d
+ instrument_uid: 1ff01016-b08e-5be8-b10f-30e4a459c5e3
feed: BAR
- interval: 30m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-30m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-o-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-3d
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-on-usdt-swap-bar-1d
+ instrument_uid: ef06e949-902e-5a7b-86fc-f4513675ca51
feed: BAR
- interval: 3d
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-3d-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-on-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-3m
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-ondo-usdt-swap-bar-1d
+ instrument_uid: 2b84d2ac-ae1c-5f7b-892d-0ee66ea524ce
feed: BAR
- interval: 3m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-3m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ondo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-4h
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-one-usdt-swap-bar-1d
+ instrument_uid: a0ae3b67-529c-5c60-b1d5-992b2a5dfe90
feed: BAR
- interval: 4h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-4h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-one-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-5m
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-ont-usdt-swap-bar-1d
+ instrument_uid: eef06df7-cf51-5d7c-9642-e7a4309c225b
feed: BAR
- interval: 5m
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-5m-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ont-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-6h
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-op-usdt-swap-bar-1d
+ instrument_uid: 5788acc3-3acc-56dc-91b5-3864d190995f
feed: BAR
- interval: 6h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-6h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-op-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-bar-8h
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ v1_compatibility: NONE
+- binding_id: okx-swap-opg-usdt-swap-bar-1d
+ instrument_uid: baa311c7-ab43-5131-b076-64337b2e2c39
feed: BAR
- interval: 8h
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-bar-8h-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-opg-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 86400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_BAR_GENERIC
-- binding_id: binance-usdm-solusdt-book_delta
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
- feed: BOOK_DELTA
- interval: null
+ v1_compatibility: NONE
+- binding_id: okx-swap-opn-usdt-swap-bar-1d
+ instrument_uid: 1386e6fa-2743-506b-90e9-e312c87d0b30
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-opn-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-solusdt-book_snapshot
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-order-usdt-swap-bar-1d
+ instrument_uid: 33e59369-e856-5e56-a8ce-7353901b4145
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-book-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-order-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: binance-usdm-solusdt-mark_index_price
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-ordi-usdt-swap-bar-1d
+ instrument_uid: bad074bb-5acd-5bcd-943c-0219c7fd7beb
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-mark_index_price-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-ordi-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: binance-usdm-solusdt-quote
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-pendle-usdt-swap-bar-1d
+ instrument_uid: 8d648cb4-d326-52d5-8812-5b75a638c275
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-quote-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-pendle-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: binance-usdm-solusdt-trade
- instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
- feed: TRADE
- interval: null
+- binding_id: okx-swap-pengu-usdt-swap-bar-1d
+ instrument_uid: 99660d9e-89eb-5e36-82a9-386a20e9456a
+ feed: BAR
+ interval: 1d
source:
- provider: BINANCE_DIRECT
- source_id: binance-usdm-solusdt-trade-primary-v2
+ provider: OKX_DIRECT
+ source_id: okx-swap-pengu-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: binance-usdm/2.0.0
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- v1_compatibility: BINANCE_TRADE_MARKET_AND_GENERIC
-- binding_id: dnse-fpt-bar-1m
- instrument_uid: 6f025ab7-c0b4-5e08-866d-34ce62aef52f
+ v1_compatibility: NONE
+- binding_id: okx-swap-people-usdt-swap-bar-1d
+ instrument_uid: cfb1b966-854f-5ae3-ada3-a20f775cc056
feed: BAR
- interval: 1m
+ interval: 1d
source:
- provider: DNSE_DIRECT
- source_id: dnse-fpt-bar-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-people-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: vn_primary_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: dnse-openapi/2.0.1
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
- continuous_calendar: false
+ continuous_calendar: true
v1_compatibility: NONE
-- binding_id: dnse-fpt-trade
- instrument_uid: 6f025ab7-c0b4-5e08-866d-34ce62aef52f
- feed: TRADE
- interval: null
+- binding_id: okx-swap-pepe-usdt-swap-bar-1d
+ instrument_uid: c3705bd0-6cfc-5fce-b553-a7a9cadfae83
+ feed: BAR
+ interval: 1d
source:
- provider: DNSE_DIRECT
- source_id: dnse-fpt-trade-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-pepe-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: vn_primary_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: dnse-openapi/2.0.1
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
- continuous_calendar: false
- v1_compatibility: VN_TRADE_GENERIC
-- binding_id: dnse-vn30f1m-bar-1m
- instrument_uid: d0ac3d4c-2374-5690-8af5-b970448f91d3
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-pieverse-usdt-swap-bar-1d
+ instrument_uid: fe9a679f-abf6-5670-9aa4-06c0c82e4af2
feed: BAR
- interval: 1m
+ interval: 1d
source:
- provider: DNSE_DIRECT
- source_id: dnse-vn30f1m-bar-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-pieverse-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: vn_primary_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: dnse-openapi/2.0.1
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
- continuous_calendar: false
+ continuous_calendar: true
v1_compatibility: NONE
-- binding_id: dnse-vn30f1m-trade
- instrument_uid: d0ac3d4c-2374-5690-8af5-b970448f91d3
- feed: TRADE
- interval: null
+- binding_id: okx-swap-pippin-usdt-swap-bar-1d
+ instrument_uid: e00eeab2-0a7b-50a1-ba68-05d951812aac
+ feed: BAR
+ interval: 1d
source:
- provider: DNSE_DIRECT
- source_id: dnse-vn30f1m-trade-stable-001
+ provider: OKX_DIRECT
+ source_id: okx-swap-pippin-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: vn_primary_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
- adapter_version: dnse-openapi/2.0.1
+ adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
- continuous_calendar: false
- v1_compatibility: VN_TRADE_GENERIC
-- binding_id: okx-futures-btc-usd-261225-book_delta
- instrument_uid: 4da91f9c-187c-55a3-be4e-ab0856cf9da2
- feed: BOOK_DELTA
- interval: null
+ stale_after_ms: 259200000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-plume-usdt-swap-bar-1d
+ instrument_uid: ab646932-485c-5c6f-92c1-65427d0c4a96
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-btc-usd-261225-book-primary-v2
+ source_id: okx-swap-plume-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-btc-usd-261225-book_snapshot
- instrument_uid: 4da91f9c-187c-55a3-be4e-ab0856cf9da2
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-pnut-usdt-swap-bar-1d
+ instrument_uid: 2d440aae-79d3-5944-821b-0dca146f4f5a
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-btc-usd-261225-book-primary-v2
+ source_id: okx-swap-pnut-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-btc-usd-270326-book_delta
- instrument_uid: 25394e32-7c78-5a0c-bc0f-922b5459e130
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-pol-usdt-swap-bar-1d
+ instrument_uid: 26e96bfc-418b-534a-b86b-8845cec5b53b
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-btc-usd-270326-book-primary-v2
+ source_id: okx-swap-pol-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-btc-usd-270326-book_snapshot
- instrument_uid: 25394e32-7c78-5a0c-bc0f-922b5459e130
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-popcat-usdt-swap-bar-1d
+ instrument_uid: 690463df-9bd3-5454-a02c-5f4ed16d0cc3
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-btc-usd-270326-book-primary-v2
+ source_id: okx-swap-popcat-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-eth-usd-261225-book_delta
- instrument_uid: 0d522cb3-d764-5066-9e96-19f1817e84d7
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-prove-usdt-swap-bar-1d
+ instrument_uid: e0acf5c2-36a0-586c-aa61-f605130f80b7
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-eth-usd-261225-book-primary-v2
+ source_id: okx-swap-prove-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-eth-usd-261225-book_snapshot
- instrument_uid: 0d522cb3-d764-5066-9e96-19f1817e84d7
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-pump-usdt-swap-bar-1d
+ instrument_uid: cf6b9041-4ee3-5085-b4fe-96dca6d5e559
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-eth-usd-261225-book-primary-v2
+ source_id: okx-swap-pump-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-eth-usd-270326-book_delta
- instrument_uid: a2cd7118-c7c0-5096-b42f-9ac658783ab3
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-pyth-usdt-swap-bar-1d
+ instrument_uid: 30f599c1-3235-58aa-a8cb-734f70804b89
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-eth-usd-270326-book-primary-v2
+ source_id: okx-swap-pyth-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-futures-eth-usd-270326-book_snapshot
- instrument_uid: a2cd7118-c7c0-5096-b42f-9ac658783ab3
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-qnt-usdt-swap-bar-1d
+ instrument_uid: f2d5dfed-750e-5fe4-adc2-b7e0a731eff7
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-futures-eth-usd-270326-book-primary-v2
+ source_id: okx-swap-qnt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-spot-btcusdt-bar-1m
- instrument_uid: 9e996914-aa98-5ea0-b0a0-a78dc51e1f8d
+- binding_id: okx-swap-qtum-usdt-swap-bar-1d
+ instrument_uid: 695383b0-8790-5789-9eac-4704b3087cbb
feed: BAR
- interval: 1m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-spot-btcusdt-bar-stable-001
+ source_id: okx-swap-qtum-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-spot-btcusdt-quote
- instrument_uid: 9e996914-aa98-5ea0-b0a0-a78dc51e1f8d
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-rave-usdt-swap-bar-1d
+ instrument_uid: 1ddf760f-6bde-550c-81ab-928b528b0796
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-spot-btcusdt-quote-stable-001
+ source_id: okx-swap-rave-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-spot-btcusdt-trade
- instrument_uid: 9e996914-aa98-5ea0-b0a0-a78dc51e1f8d
- feed: TRADE
- interval: null
+- binding_id: okx-swap-re-usdt-swap-bar-1d
+ instrument_uid: d35d084c-ebb6-5fc0-9e7c-f71a1a0b1228
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-spot-btcusdt-trade-stable-001
+ source_id: okx-swap-re-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-12h
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-recall-usdt-swap-bar-1d
+ instrument_uid: 0937b736-4c89-563f-ab1d-ffdab60ff40a
feed: BAR
- interval: 12h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-12h-primary-v2
+ source_id: okx-swap-recall-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-15m
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-render-usdt-swap-bar-1d
+ instrument_uid: bee2d394-e836-518d-ab8e-2df7c5d2f804
feed: BAR
- interval: 15m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-15m-primary-v2
+ source_id: okx-swap-render-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-1d
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-resolv-usdt-swap-bar-1d
+ instrument_uid: e25cd054-6591-5215-ab8e-acea61b96e3b
feed: BAR
interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-1d-primary-v2
+ source_id: okx-swap-resolv-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2597,287 +21821,285 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-1h
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-river-usdt-swap-bar-1d
+ instrument_uid: 0641ed20-dbfb-52af-be4c-fa513302dda6
feed: BAR
- interval: 1h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-1h-primary-v2
+ source_id: okx-swap-river-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-1m
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-robo-usdt-swap-bar-1d
+ instrument_uid: 08aae292-6843-515e-9dc0-b3df41676f40
feed: BAR
- interval: 1m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-1m-primary-v2
+ source_id: okx-swap-robo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-1w
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-rsr-usdt-swap-bar-1d
+ instrument_uid: b07cf454-cbe6-58ab-a0db-c6f2cd0c9aaa
feed: BAR
- interval: 1w
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-1w-primary-v2
+ source_id: okx-swap-rsr-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-2d
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-rvn-usdt-swap-bar-1d
+ instrument_uid: 2f110c43-e43d-5784-8ceb-9970d2d16742
feed: BAR
- interval: 2d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-2d-primary-v2
+ source_id: okx-swap-rvn-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 518400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-2h
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-s-usdt-swap-bar-1d
+ instrument_uid: 38720d66-4542-519f-8340-f51bc0435fc5
feed: BAR
- interval: 2h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-2h-primary-v2
+ source_id: okx-swap-s-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-30m
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-sahara-usdt-swap-bar-1d
+ instrument_uid: 0c4da48d-3f48-5d08-a5ab-077db6880253
feed: BAR
- interval: 30m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-30m-primary-v2
+ source_id: okx-swap-sahara-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-3d
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-sand-usdt-swap-bar-1d
+ instrument_uid: fc7a72ab-a650-5172-993f-9d097b16dcac
feed: BAR
- interval: 3d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-3d-primary-v2
+ source_id: okx-swap-sand-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-3m
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-sapien-usdt-swap-bar-1d
+ instrument_uid: 8ae72fb1-bcd8-59de-8a72-dce8afc111b9
feed: BAR
- interval: 3m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-3m-primary-v2
+ source_id: okx-swap-sapien-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-4h
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-sats-usdt-swap-bar-1d
+ instrument_uid: b62cec8c-d821-5a30-bb62-3fccb691e94c
feed: BAR
- interval: 4h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-4h-primary-v2
+ source_id: okx-swap-sats-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-5m
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-sei-usdt-swap-bar-1d
+ instrument_uid: 20b68200-9172-5ad5-9bbf-de59df6bf723
feed: BAR
- interval: 5m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-5m-primary-v2
+ source_id: okx-swap-sei-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-bar-6h
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+- binding_id: okx-swap-sent-usdt-swap-bar-1d
+ instrument_uid: 5f170209-f395-577f-8871-bac517578c30
feed: BAR
- interval: 6h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-bar-6h-primary-v2
+ source_id: okx-swap-sent-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-book_delta
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-shib-usdt-swap-bar-1d
+ instrument_uid: a6acc2cc-47b2-5408-956c-6d9516376d78
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-book-primary-v2
+ source_id: okx-swap-shib-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-book_snapshot
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-sign-usdt-swap-bar-1d
+ instrument_uid: cdb92414-5c7b-5513-a600-371746aa36fb
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-book-primary-v2
+ source_id: okx-swap-sign-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-mark_index_price
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-sky-usdt-swap-bar-1d
+ instrument_uid: 8b6e8b7c-bbef-5f4b-bd43-26d6807b7ed3
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-mark_index_price-primary-v2
+ source_id: okx-swap-sky-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-quote
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-slx-usdt-swap-bar-1d
+ instrument_uid: c82e28aa-40a0-50b0-94b1-67d52f67689e
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-quote-primary-v2
+ source_id: okx-swap-slx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: okx-swap-bnb-usdt-swap-trade
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: TRADE
- interval: null
+- binding_id: okx-swap-snx-usdt-swap-bar-1d
+ instrument_uid: 3a073d46-0cc7-52c3-84ab-7e9dcc070d29
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-bnb-usdt-swap-trade-primary-v2
+ source_id: okx-swap-snx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-12h
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-12h
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 12h
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-12h-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-12h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2888,13 +22110,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-15m
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-15m
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 15m
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-15m-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-15m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2905,13 +22127,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-1d
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-1d
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-1d-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2922,13 +22144,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-1h
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-1h
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 1h
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-1h-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-1h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2939,13 +22161,30 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-1w
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-1m
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ interval: 1m
+ source:
+ provider: OKX_DIRECT
+ source_id: okx-swap-sol-usdt-swap-bar-1m-primary-v2
+ source_role: PRIMARY
+ source_policy_id: crypto_primary_v2
+ authoritative: true
+ adapter_version: okx-v5/2.0.0
+ normalizer_version: qdl-rust-core/2.0.0
+ quality:
+ stale_after_ms: 180000
+ require_final_bar: true
+ continuous_calendar: true
+ v1_compatibility: NONE
+- binding_id: okx-swap-sol-usdt-swap-bar-1w
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 1w
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-1w-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-1w-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2956,13 +22195,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-2d
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-2d
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 2d
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-2d-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-2d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2973,13 +22212,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-2h
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-2h
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 2h
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-2h-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-2h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -2990,13 +22229,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-30m
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-30m
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 30m
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-30m-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-30m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3007,13 +22246,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-3d
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-3d
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 3d
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-3d-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-3d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3024,13 +22263,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-3m
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-3m
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 3m
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-3m-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-3m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3041,13 +22280,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-4h
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-4h
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 4h
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-4h-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-4h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3058,13 +22297,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-5m
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-5m
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 5m
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-5m-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-5m-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3075,13 +22314,13 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-bar-6h
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-bar-6h
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BAR
interval: 6h
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-bar-6h-primary-v2
+ source_id: okx-swap-sol-usdt-swap-bar-6h-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3092,82 +22331,65 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-book_delta
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-book_delta
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BOOK_DELTA
interval: null
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-book-primary-v2
+ source_id: okx-swap-sol-usdt-swap-book-primary-v2
source_role: PRIMARY
source_policy_id: crypto_liquid_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
+ stale_after_ms: 2000
require_final_bar: false
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-book_snapshot
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-book_snapshot
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: BOOK_SNAPSHOT
interval: null
source:
provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-book-primary-v2
- source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
- authoritative: true
- adapter_version: okx-v5/2.0.0
- normalizer_version: qdl-rust-core/2.0.0
- quality:
- stale_after_ms: 60000
- require_final_bar: false
- continuous_calendar: true
- v1_compatibility: NONE
-- binding_id: okx-swap-btc-usdt-swap-mark_index_price
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: MARK_INDEX_PRICE
- interval: null
- source:
- provider: OKX_DIRECT
- source_id: okx-swap-btc-usdt-swap-mark_index_price-primary-v2
+ source_id: okx-swap-sol-usdt-swap-book-primary-v2
source_role: PRIMARY
source_policy_id: crypto_liquid_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
+ stale_after_ms: 60000
require_final_bar: false
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: okx-swap-btcusdt-bar-1m
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: BAR
- interval: 1m
+- binding_id: okx-swap-sol-usdt-swap-mark_index_price
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: MARK_INDEX_PRICE
+ interval: null
source:
provider: OKX_DIRECT
- source_id: okx-swap-btcusdt-bar-stable-001
+ source_id: okx-swap-sol-usdt-swap-mark_index_price-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_primary_v2
+ source_policy_id: crypto_liquid_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
- require_final_bar: true
+ stale_after_ms: 2000
+ require_final_bar: false
continuous_calendar: true
+ freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: okx-swap-btcusdt-quote
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-quote
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: QUOTE
interval: null
source:
provider: OKX_DIRECT
- source_id: okx-swap-btcusdt-quote-stable-001
+ source_id: okx-swap-sol-usdt-swap-quote-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3179,13 +22401,13 @@ bindings:
continuous_calendar: true
delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: okx-swap-btcusdt-trade
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+- binding_id: okx-swap-sol-usdt-swap-trade
+ instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: TRADE
interval: null
source:
provider: OKX_DIRECT
- source_id: okx-swap-btcusdt-trade-stable-001
+ source_id: okx-swap-sol-usdt-swap-trade-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3196,47 +22418,47 @@ bindings:
require_final_bar: false
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-12h
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-soon-usdt-swap-bar-1d
+ instrument_uid: 1df523d5-6806-57a8-80d0-7a86598b321b
feed: BAR
- interval: 12h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-12h-primary-v2
+ source_id: okx-swap-soon-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-15m
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-soph-usdt-swap-bar-1d
+ instrument_uid: 45d2fda2-8fd6-58da-a98f-7f88ecfdb233
feed: BAR
- interval: 15m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-15m-primary-v2
+ source_id: okx-swap-soph-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-1d
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-space-usdt-swap-bar-1d
+ instrument_uid: 3bf03be6-473d-5b0d-98c1-229146bb1ca9
feed: BAR
interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-1d-primary-v2
+ source_id: okx-swap-space-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3247,321 +22469,285 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-1h
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-spk-usdt-swap-bar-1d
+ instrument_uid: 7152cd4d-c839-54cb-9380-833718f8ed53
feed: BAR
- interval: 1h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-1h-primary-v2
+ source_id: okx-swap-spk-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-1m
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-spx-usdt-swap-bar-1d
+ instrument_uid: 35bf552b-63d1-5895-9701-0250484053ab
feed: BAR
- interval: 1m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-1m-primary-v2
+ source_id: okx-swap-spx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-1w
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-ssv-usdt-swap-bar-1d
+ instrument_uid: c3b75c12-276b-5a3d-8313-dc7145c321e7
feed: BAR
- interval: 1w
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-1w-primary-v2
+ source_id: okx-swap-ssv-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-2d
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-stable-usdt-swap-bar-1d
+ instrument_uid: ed4319f7-8e4a-5570-a34d-88118cb1c276
feed: BAR
- interval: 2d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-2d-primary-v2
+ source_id: okx-swap-stable-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 518400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-2h
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-strk-usdt-swap-bar-1d
+ instrument_uid: 1a495947-d440-5313-b4b5-491c73ded166
feed: BAR
- interval: 2h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-2h-primary-v2
+ source_id: okx-swap-strk-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-30m
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-stx-usdt-swap-bar-1d
+ instrument_uid: 15e8ca6e-7618-524c-8548-dab9d49d155c
feed: BAR
- interval: 30m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-30m-primary-v2
+ source_id: okx-swap-stx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-3d
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-sui-usdt-swap-bar-1d
+ instrument_uid: 3e398787-071d-5908-a5e1-2ce40fdc1ab5
feed: BAR
- interval: 3d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-3d-primary-v2
+ source_id: okx-swap-sui-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-3m
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-sushi-usdt-swap-bar-1d
+ instrument_uid: 2bf7bb7d-d4be-51fa-934f-89687d9c89f9
feed: BAR
- interval: 3m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-3m-primary-v2
+ source_id: okx-swap-sushi-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-4h
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-syrup-usdt-swap-bar-1d
+ instrument_uid: 6ce36c6d-918e-59a9-8b5d-372b6ab95d52
feed: BAR
- interval: 4h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-4h-primary-v2
+ source_id: okx-swap-syrup-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-5m
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-tao-usdt-swap-bar-1d
+ instrument_uid: ab30f1b5-36ae-5ed3-8d53-75389fa69760
feed: BAR
- interval: 5m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-5m-primary-v2
+ source_id: okx-swap-tao-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-bar-6h
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+- binding_id: okx-swap-theta-usdt-swap-bar-1d
+ instrument_uid: 58d2c7fc-59d2-5269-9523-6303dfc8bcce
feed: BAR
- interval: 6h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-bar-6h-primary-v2
+ source_id: okx-swap-theta-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-book_delta
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: BOOK_DELTA
- interval: null
- source:
- provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-book-primary-v2
- source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
- authoritative: true
- adapter_version: okx-v5/2.0.0
- normalizer_version: qdl-rust-core/2.0.0
- quality:
- stale_after_ms: 2000
- require_final_bar: false
- continuous_calendar: true
- v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-book_snapshot
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: BOOK_SNAPSHOT
- interval: null
- source:
- provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-book-primary-v2
- source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
- authoritative: true
- adapter_version: okx-v5/2.0.0
- normalizer_version: qdl-rust-core/2.0.0
- quality:
- stale_after_ms: 60000
- require_final_bar: false
- continuous_calendar: true
- v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-mark_index_price
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-tia-usdt-swap-bar-1d
+ instrument_uid: d10ee13d-a2a2-5305-bb0d-678a9c63c5e2
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-mark_index_price-primary-v2
+ source_id: okx-swap-tia-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-quote
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-trb-usdt-swap-bar-1d
+ instrument_uid: cf8247ac-2438-5123-90c0-5774c79d0ca2
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-quote-primary-v2
+ source_id: okx-swap-trb-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: okx-swap-doge-usdt-swap-trade
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: TRADE
- interval: null
+- binding_id: okx-swap-tria-usdt-swap-bar-1d
+ instrument_uid: cec3acd8-dd93-5666-8aaa-257f41cd90ef
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-doge-usdt-swap-trade-primary-v2
+ source_id: okx-swap-tria-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-12h
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-trump-usdt-swap-bar-1d
+ instrument_uid: ebeef153-4f05-50b4-8152-fc22e2d2c5fe
feed: BAR
- interval: 12h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-12h-primary-v2
+ source_id: okx-swap-trump-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-15m
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-trust-usdt-swap-bar-1d
+ instrument_uid: 54f7a9c4-b91b-50d5-a8d9-8c4e0481f2ec
feed: BAR
- interval: 15m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-15m-primary-v2
+ source_id: okx-swap-trust-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-1d
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-truth-usdt-swap-bar-1d
+ instrument_uid: 58356b9a-8f38-5bb9-b04a-9f6955732264
feed: BAR
interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-1d-primary-v2
+ source_id: okx-swap-truth-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3572,321 +22758,319 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-1h
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-trx-usdt-swap-bar-1d
+ instrument_uid: ae8a6bb7-2cd4-54c3-b4f8-361b9e8975d1
feed: BAR
- interval: 1h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-1h-primary-v2
+ source_id: okx-swap-trx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-1m
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-turbo-usdt-swap-bar-1d
+ instrument_uid: 0d6874fd-9a88-5f6f-bb81-61233d9870db
feed: BAR
- interval: 1m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-1m-primary-v2
+ source_id: okx-swap-turbo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-1w
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-ub-usdt-swap-bar-1d
+ instrument_uid: 90f3b14e-e641-5e4f-a838-139b568ae459
feed: BAR
- interval: 1w
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-1w-primary-v2
+ source_id: okx-swap-ub-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-2d
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-uma-usdt-swap-bar-1d
+ instrument_uid: fe05b11d-24ac-5fe8-8f49-f393e6a50748
feed: BAR
- interval: 2d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-2d-primary-v2
+ source_id: okx-swap-uma-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 518400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-2h
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-uni-usdt-swap-bar-1d
+ instrument_uid: fefc51a7-8247-5790-bf82-6817bf12e7b3
feed: BAR
- interval: 2h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-2h-primary-v2
+ source_id: okx-swap-uni-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-30m
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-useless-usdt-swap-bar-1d
+ instrument_uid: c7931346-0c07-52e2-86ff-54453b265e14
feed: BAR
- interval: 30m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-30m-primary-v2
+ source_id: okx-swap-useless-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-3d
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-vana-usdt-swap-bar-1d
+ instrument_uid: b9e653fa-d3cf-5fae-bd8e-c5abc89f8a0f
feed: BAR
- interval: 3d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-3d-primary-v2
+ source_id: okx-swap-vana-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-3m
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-virtual-usdt-swap-bar-1d
+ instrument_uid: 12db7dc2-d833-569e-ade1-36d630dc90a8
feed: BAR
- interval: 3m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-3m-primary-v2
+ source_id: okx-swap-virtual-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-4h
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-vvv-usdt-swap-bar-1d
+ instrument_uid: 3fc9f34e-9f0b-51f7-88e5-541bce2ffa01
feed: BAR
- interval: 4h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-4h-primary-v2
+ source_id: okx-swap-vvv-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-5m
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-w-usdt-swap-bar-1d
+ instrument_uid: 8198b1a1-966b-584b-95cf-40fd8877de2c
feed: BAR
- interval: 5m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-5m-primary-v2
+ source_id: okx-swap-w-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-bar-6h
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+- binding_id: okx-swap-wal-usdt-swap-bar-1d
+ instrument_uid: 9662e66c-84cc-5cfa-a5e6-28339c41bdc2
feed: BAR
- interval: 6h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-bar-6h-primary-v2
+ source_id: okx-swap-wal-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-book_delta
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-wct-usdt-swap-bar-1d
+ instrument_uid: 3146ec6a-27dc-5e20-9a42-39063691ca94
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-book-primary-v2
+ source_id: okx-swap-wct-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-book_snapshot
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-wet-usdt-swap-bar-1d
+ instrument_uid: 42cadfc3-bbc5-57c8-9dd7-3db712ea2c50
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-book-primary-v2
+ source_id: okx-swap-wet-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-mark_index_price
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-wif-usdt-swap-bar-1d
+ instrument_uid: 2e519d06-1197-50f2-acf8-62f5dfc66e2a
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-mark_index_price-primary-v2
+ source_id: okx-swap-wif-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-quote
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-wld-usdt-swap-bar-1d
+ instrument_uid: da4e0df9-0b8c-54c1-9a9c-309187cbb94d
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-quote-primary-v2
+ source_id: okx-swap-wld-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: okx-swap-eth-usdt-swap-trade
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
- feed: TRADE
- interval: null
+- binding_id: okx-swap-wlfi-usdt-swap-bar-1d
+ instrument_uid: d3d01f05-c55c-5871-bac8-26ccfe5af5b0
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-eth-usdt-swap-trade-primary-v2
+ source_id: okx-swap-wlfi-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-12h
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-woo-usdt-swap-bar-1d
+ instrument_uid: 9413e3e7-2a07-5580-a1e2-c94693917f36
feed: BAR
- interval: 12h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-12h-primary-v2
+ source_id: okx-swap-woo-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 129600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-15m
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-xlm-usdt-swap-bar-1d
+ instrument_uid: d5a36311-364a-5c91-bdc1-e4aa7a6a6847
feed: BAR
- interval: 15m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-15m-primary-v2
+ source_id: okx-swap-xlm-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2700000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-1d
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-xpl-usdt-swap-bar-1d
+ instrument_uid: ea7a81ea-5876-5db2-89f2-1af550f455ef
feed: BAR
interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-1d-primary-v2
+ source_id: okx-swap-xpl-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
@@ -3897,277 +23081,275 @@ bindings:
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-1h
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-xrp-usdt-swap-bar-1d
+ instrument_uid: 529720c7-b5fc-5cbf-a468-bf7d090de894
feed: BAR
- interval: 1h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-1h-primary-v2
+ source_id: okx-swap-xrp-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 10800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-1m
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-xtz-usdt-swap-bar-1d
+ instrument_uid: 7d0a90b7-1135-5fda-9dd3-1679af5ca334
feed: BAR
- interval: 1m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-1m-primary-v2
+ source_id: okx-swap-xtz-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 180000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-1w
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-yb-usdt-swap-bar-1d
+ instrument_uid: caa279de-37c7-5511-aa49-c173cd3b2208
feed: BAR
- interval: 1w
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-1w-primary-v2
+ source_id: okx-swap-yb-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 1814400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-2d
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-yfi-usdt-swap-bar-1d
+ instrument_uid: 25eef1f1-eee5-5f91-8312-4e63c09d3a06
feed: BAR
- interval: 2d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-2d-primary-v2
+ source_id: okx-swap-yfi-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 518400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-2h
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-ygg-usdt-swap-bar-1d
+ instrument_uid: 7d199ba4-65b9-5d0a-a61e-0329cad893f2
feed: BAR
- interval: 2h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-2h-primary-v2
+ source_id: okx-swap-ygg-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 21600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-30m
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-zama-usdt-swap-bar-1d
+ instrument_uid: 748fd517-7800-5b0c-a9b0-fbd43c6fa65f
feed: BAR
- interval: 30m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-30m-primary-v2
+ source_id: okx-swap-zama-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5400000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-3d
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-zbt-usdt-swap-bar-1d
+ instrument_uid: 0e38b4ee-be80-5bf8-9c23-2ff2172781bd
feed: BAR
- interval: 3d
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-3d-primary-v2
+ source_id: okx-swap-zbt-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 777600000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-3m
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-zec-usdt-swap-bar-1d
+ instrument_uid: 6eab37a2-e239-501a-9c28-bdb217207626
feed: BAR
- interval: 3m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-3m-primary-v2
+ source_id: okx-swap-zec-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 540000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-4h
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-zen-usdt-swap-bar-1d
+ instrument_uid: 7550c6c6-2f96-55cf-b1ba-d4cc98f0ff29
feed: BAR
- interval: 4h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-4h-primary-v2
+ source_id: okx-swap-zen-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 43200000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-5m
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-zeta-usdt-swap-bar-1d
+ instrument_uid: a06885be-3b01-5dcf-80a0-a06da823219d
feed: BAR
- interval: 5m
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-5m-primary-v2
+ source_id: okx-swap-zeta-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 900000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-bar-6h
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+- binding_id: okx-swap-zil-usdt-swap-bar-1d
+ instrument_uid: 8d68ba2a-28c6-597c-94ec-a34cbda836d1
feed: BAR
- interval: 6h
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-bar-6h-primary-v2
+ source_id: okx-swap-zil-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 64800000
+ stale_after_ms: 259200000
require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-book_delta
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: BOOK_DELTA
- interval: null
+- binding_id: okx-swap-zk-usdt-swap-bar-1d
+ instrument_uid: 75ca584b-3205-54bf-81bf-e1e712bbb724
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-book-primary-v2
+ source_id: okx-swap-zk-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-book_snapshot
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: BOOK_SNAPSHOT
- interval: null
+- binding_id: okx-swap-zkp-usdt-swap-bar-1d
+ instrument_uid: 71f6156c-a6f2-5cc1-b917-0a60c5966bd3
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-book-primary-v2
+ source_id: okx-swap-zkp-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 60000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-mark_index_price
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: MARK_INDEX_PRICE
- interval: null
+- binding_id: okx-swap-zora-usdt-swap-bar-1d
+ instrument_uid: 5d2fbdcc-38dd-56be-b409-25f9a6e292eb
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-mark_index_price-primary-v2
+ source_id: okx-swap-zora-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
- source_policy_id: crypto_liquid_v2
+ source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 2000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- freshness_basis: PROVIDER_CONFIRMATION
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-quote
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: QUOTE
- interval: null
+- binding_id: okx-swap-zro-usdt-swap-bar-1d
+ instrument_uid: d7657b6a-8c62-5c36-b0cf-865b310a50e0
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-quote-primary-v2
+ source_id: okx-swap-zro-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 5000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
- delivery_semantics: ON_CHANGE
v1_compatibility: NONE
-- binding_id: okx-swap-sol-usdt-swap-trade
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: TRADE
- interval: null
+- binding_id: okx-swap-zrx-usdt-swap-bar-1d
+ instrument_uid: 895966bd-d394-5110-81da-212f87eb5f1b
+ feed: BAR
+ interval: 1d
source:
provider: OKX_DIRECT
- source_id: okx-swap-sol-usdt-swap-trade-primary-v2
+ source_id: okx-swap-zrx-usdt-swap-bar-1d-primary-v2
source_role: PRIMARY
source_policy_id: crypto_primary_v2
authoritative: true
adapter_version: okx-v5/2.0.0
normalizer_version: qdl-rust-core/2.0.0
quality:
- stale_after_ms: 15000
- require_final_bar: false
+ stale_after_ms: 259200000
+ require_final_bar: true
continuous_calendar: true
v1_compatibility: NONE
diff --git a/config/v2/stable-v2-release-routing.yaml b/config/v2/stable-v2-release-routing.yaml
index 220f5ce3..48b71bf5 100644
--- a/config/v2/stable-v2-release-routing.yaml
+++ b/config/v2/stable-v2-release-routing.yaml
@@ -1,14 +1,14 @@
schema: qdl.v2.stable-release-routing.v1
-revision: 22
+revision: 27
contract_version: 2.0.0
source_catalog:
path: /app/config/v2/stable-source-bindings.yaml
- sha256: 2072202c76683788cf1d59905038787e4db194209df8266b5da44b6487f4947e
- revision: 9
+ sha256: 9d4ab51e4880a3615e4171fe4cebc244c02522a20bbd3273973478ef32ec275d
+ revision: 11
crypto_demand:
path: /app/config/v2/stable-crypto-demand.yaml
- sha256: 9ace71cd3e4ed6e224151e31699cfc3fe57ba2a6c17664c832da07eb1c6aa30f
- revision: 6
+ sha256: be49571c31c6de515e1d47bbdaa47bf17e4fc233928cb463c21db0539619358b
+ revision: 7
capability_matrix:
path: /app/config/v2/stable-capabilities.yaml
sha256: 81347a88866a54ed99cfbf25979d8e5912c98084f97f8a997a608dc9e03af6bf
@@ -29,7 +29,7 @@ consumers:
manifest: /app/consumers/stable/monitoring-multivenue.yaml
manifest_revision: 2
manifest_sha256: eaf828db40cac3b256fee087fa4cb7730fcb4894c9300ce4a319433aec4d88ea
- demand_revision: 6
+ demand_revision: 7
products:
- requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:TRADE::crypto_primary_v2
route: V2_PRIMARY
@@ -53,660 +53,2552 @@ consumers:
reason: V1_OKX_TRADE_EQUIVALENCE_UNPROVEN
- consumer_id: alpha.binance.paper.stable
manifest: /app/consumers/stable/alpha-binance-paper.yaml
- manifest_revision: 12
- manifest_sha256: ed44dc306d62379bfacd8032ad2016da14617aaf44ec8fb6eb82183600dbaaea
- demand_revision: 6
+ manifest_revision: 14
+ manifest_sha256: 96a06ce715055804a0695abcf5159235b4d7ba13738698983833de5f3ec5bc5f
+ demand_revision: 7
products:
+ - requirement_key: 00d1d68e-45b0-5cbf-9825-15ba00cb6a66:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 01c74f7d-2449-5630-b743-f563a900108b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 05658343-bcbb-5aed-87b2-1ce21349e227:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0638ba89-f890-535a-9fc7-3358aa53179f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0723c5e4-0af0-59a3-a7c6-d9c9c36968af:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 07b68da9-76a6-5e50-9de1-bf5ffe70711f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 07d4bbcf-2e5a-581c-81f5-a13caa3bfb0b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0bb4ca88-2c89-5118-a7de-5d58985ba27b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0c8454bd-825f-53f9-801c-1d1edc623a87:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0d772919-4b2c-57f4-9543-a60eb316e676:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0dc95513-2b93-56c1-8966-78e06012e967:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0e94d287-5960-5af4-89d2-a14bf24d8595:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0eee0320-f54c-50c6-8c31-cedc978f4246:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0f8b8578-7850-5863-929a-d3292a9cba31:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 115fba5d-673e-5ad8-b14d-53c6b077d8b8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 123ff4ea-21a7-54a0-9ad3-e56059b81bde:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 132d4a1b-3464-5de1-b9ad-1f3ebe728589:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 13d30031-2c7c-5df3-a625-d9aa62e58106:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1422c865-e99b-5cad-90dc-8f3ba4166691:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 145d10f1-0ec4-56ef-8098-050c7991da3a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 172daa75-28b7-5d37-a0bd-86a43f7d17b9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 17c00406-ec03-5025-8703-ed77896ef07c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 18112b74-b3c6-5c66-aeac-33daaf604127:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 18b9b339-1a7f-5110-bdd1-5b3585e2ebff:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 19c3628a-2fce-505b-bd05-aceefe47132e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1bee6fd7-6bff-59ec-8d72-50ffce31b6ed:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1de09ca8-0a41-5153-96f2-edfb42bd4cd6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1efbe499-8627-57ba-bb85-3a4546926231:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 21b23463-7fd8-5950-9f2b-7fe1e67fedc0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 23552d71-b038-5575-97b9-3ae8604876d0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 24a32009-108b-54bd-b8ba-3806976c4053:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 24ed3fe9-70d2-5715-a0e6-d2dd06e02d0e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 26260988-93d4-536e-8400-f3fadbd530de:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2832d236-116d-5e82-92d8-c4faae68ab1e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 28387599-f1ea-5df6-a4f2-a04aa341c5d0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 28486f53-7cf2-5fc7-a18c-3b39524c2969:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 29b5753d-f377-5c23-8df5-e40e8f7df423:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2a49a9f8-c5b7-546d-b55f-9cacf4855532:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2a8062eb-9c40-5101-9711-45c6d0a0b02a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2ba7c8e9-f2a8-5816-8b2d-9d6b0b0a6cd3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2e9f13cf-f529-575b-bb66-6caea3ee1a14:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 30e34c60-350e-5d13-8341-fe76633080c3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 327e2814-ea95-5cc6-a8d9-d6c2952dae9f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 334e1fb1-c81f-5660-b445-87aa58b5e0b4:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 34043a94-1386-58d7-a507-e80a173199d7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 355cdfa9-18a0-5274-b761-ad8dffa29ed3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 35eea6b0-e366-5885-9c58-f1c850631acc:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3726da06-2869-5143-b334-db8e1546f540:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 39392d40-34f4-5531-85db-da715726cec4:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 397bdb54-bb4c-57d8-ba48-ab6b6712428a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3a14f40f-96cf-5810-8931-35ac5b2538b1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3c6f6997-1b46-5e9e-acf9-df60b2075142:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3c70b7c6-b026-5feb-8e8b-6693b7674f0a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3d2403d3-44cb-5989-924f-946704ccc6b8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3e2393ec-4ff4-5722-bc6d-01f7085e84d5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 40ecf915-b50f-5552-ae3b-b11ba6ce7aac:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4266e54f-5d02-511f-a9df-549689ea7361:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4275cccf-ed9f-5948-904f-e4b1ae933e66:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 44cfd3f6-82e1-54be-981c-254d7f805ce5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 463ef46b-8665-5a5b-a9c8-259d2a4f18f6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 46aca998-9432-55d5-a619-72ae55c92f7e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 46f4fd8b-58db-578c-9c23-01d890296726:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 473238ca-4cf4-5dcf-8dd6-8731dd1d10f5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 47574e33-d716-5573-ab29-c2a3635f6aeb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 47871e91-fb6a-5273-9f22-fc663cdc2f32:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 47ad1648-48ef-50a8-9daf-c8beadd93cdb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 47d98081-d269-5aeb-9766-5f689e2c6b35:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 486818ad-fab1-522c-bb5c-9258c3911afe:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 48c9207b-c6c9-5901-ad33-368f55774c47:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 49355b7d-5da7-5768-bded-cf08dfe0ddca:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4948e3b5-3037-57ba-88da-3b10f69d0627:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 49fd25fe-bbe4-5c84-97c2-510dd94dddd9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4aaf2734-e6e6-5ad1-b5dd-1dac4aa549a5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4e448108-2fdd-506a-9cf6-ca999736f8fb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 5068359f-b79a-5501-833c-4bc0bdcddb8c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 51cce06a-7b90-5c59-be0e-433d02cc4f7e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 52a78a60-e48b-5507-b823-e5b8867db2df:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 54de4137-c09a-52f0-ad34-696fdd5b4f04:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 54dfc708-50c9-5cb4-aff3-3a7b372014b3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 555b8bc8-ad58-5bea-83ef-0a59f7d8032f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 56075a4c-2f7b-5773-a88c-a7b00323721a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 56277e8e-e8d2-56ec-bf9b-cb742cf17883:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 5a093e28-0a61-5d94-adbf-5f88f221496a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 5a5e88ec-7e10-5f61-9b23-78aacd43ad1d:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 5c42b635-5750-5801-82a7-95ed1d3d6e31:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 5dd80de2-abd6-5fd9-aae6-2eb0fc73738b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 61352f58-1260-5a3f-a4c3-389c74b74ec5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6253da80-82c8-5692-9d71-73a071d66ca8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 64e64842-f7cc-52a3-a72b-8400375f5505:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 64f3b5bb-feb8-5035-909d-fd5aaff1f7cc:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6765fdee-a03e-5596-bed2-a33b415087d8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6a503e86-9477-53de-be2a-2e9af1fd5163:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6aeb7e7c-9024-5160-8ede-be20c6d489d3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6af3697a-83a0-5c72-9e1f-22a111c47cd4:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6bb5fd3e-27ef-5cbd-b535-df991800b752:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c00dc57-9aad-5881-910c-6dab3b593b53:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6cf90303-3b4a-58e9-94f8-3574c64c3fa2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6d64b790-bb5c-5d6c-9377-09b12c56b5eb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6e48b1c7-2340-5e07-aacf-1c6048498b00:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6f42584d-668f-5dab-80a1-a00058020e24:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7107b106-eed7-513c-8c1b-0a1ff512afee:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7228c509-3bf3-510f-9f00-63625011fc9b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7270dafa-54f4-5bc8-8190-71b330ee95b5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 72f3bbcf-3630-5e35-b583-5721f484266b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 746233b9-ee75-5cbc-8a6c-daa63a4d82ce:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7524658d-fa43-5121-91c5-fd55afea5953:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 77296e5e-bb08-5aa2-94e0-96d7e7adb517:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 78148a03-d1cf-5907-a639-ccbcbb0975fd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 789ea412-0d8d-5d54-a4a4-a0ea2dee338c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7d3db013-5ac0-5483-ba8b-0f03441f5672:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7d9c02f5-b2cd-507c-a478-ccfeba874b5d:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 7fec48ed-999d-52ef-8872-bbda8b1dffe7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 82c3d1ea-8098-5e21-b841-e51469ca5bb0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 830f340b-3646-5066-b5e7-4d0b126a44fe:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8375c606-0c2b-5e50-8f16-64650fcdedc0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 841529df-3a07-505f-b19e-dde3762242cf:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8425e4e9-5eef-59fe-aee3-50a5616aa529:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8540dfa8-3e81-5216-88b2-9a551d94fd6f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 86b2ba7e-454f-53d0-b404-803f937583a5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 870270bb-8d67-5eee-82e5-93f24b2fcdb1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 875e2059-18c6-5e10-bfbe-67894b86386c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 879ff3cb-0774-5705-b2fa-82101137410c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8832e103-2121-5ef4-b1c0-d8e55e1f40e9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8871d17f-b326-5ae6-9e7b-fd3dff2b0815:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8876d78b-3edf-5e4f-9be4-7be3b2db1966:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8947d88d-729a-59a7-bb25-3e1189b7a5ac:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:TRADE::crypto_primary_v2
route: V2_PRIMARY
- fallback: V1
- reason: null
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:QUOTE::crypto_primary_v2
+ fallback: V1
+ reason: null
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:QUOTE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:3m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:5m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:15m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:30m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:2h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:4h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:6h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:8h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:12h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:3d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BOOK_SNAPSHOT::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BOOK_DELTA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8b09286f-23d1-5740-8372-4a34941d74b7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 91733082-acf5-569b-8029-1e38ed470d51:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 921f65bb-ef9f-5869-9a43-52655e58aad9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 922e938c-8c6b-5c10-a6bd-8e21a0db4b35:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 933546f2-5d49-5a75-9313-231ce70bf001:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 935b8777-171b-5d46-94d7-cc6d55e57ea3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 94469df5-8e0e-5839-85c1-f6464481b1d3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9446e524-b1ae-5e7b-96ac-b699a171c87b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 944cf7e3-3429-5f32-9b47-594aa0c525c1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9492e60f-ef93-54c1-8a82-120a66af229a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9591218d-358d-5d5b-aa1c-7d9653e487ad:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 96004c94-3fb4-5eba-863e-3e0167e7a606:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9603abcf-8d45-588f-a676-2872dc3c62ba:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 966b2e80-c83a-5ad2-bb60-af1daea63fca:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 98d54c7c-3319-5a73-9c36-6a66dcbabd6a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9c67e4be-b8bd-5203-ae50-445479a4a48e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9cea9ea3-bffb-5af7-ba48-266c77a830bf:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9d5eafc6-2af9-5f86-9950-c9bc0beef049:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9e012444-b0b9-55ab-a994-a6a2b8384b02:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9fb02777-3d2f-51bd-86e9-a37e52224326:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a0053062-3a08-5328-8869-5148cf4def68:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a0d9742b-a58d-5cbf-808a-efe8de857cbe:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a0e845a9-a853-50b1-b256-913925fbf1d2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a1899d6f-1b1b-53e4-9f6d-53850d91f93b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a2ded063-b730-5294-a024-b1c4abcadc5e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a2ecb519-7c65-5c8e-b489-b6b0aa663e53:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a478a674-5118-59a0-8a89-49f9d9d17910:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a570e234-e1e3-5c85-aade-f95859ac928a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a5b65023-ca4e-522a-a14a-42d57ed978a9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a76839ab-ecdd-59ef-9416-17ac1af4b3d0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a76febbe-c89f-5d57-b68a-3089e7b1a512:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a90edd17-ed7a-5b6e-90c6-b38c9de23edd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:TRADE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: V1
+ reason: null
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:QUOTE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:3m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:5m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:15m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:30m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:2h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:4h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:6h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:8h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:12h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:3d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BOOK_SNAPSHOT::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BOOK_DELTA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: a9813a7f-04b3-537b-abbb-8bc599de3873:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: aa92932b-1957-545f-825d-8d62cff956cb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ab468c88-f893-52e4-8334-f04ec8907fa6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ad64efb9-c362-5e43-a52d-369589b8f662:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: af23ec18-0a39-56bf-ac1b-87d5e2248251:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: af73725a-ff81-59f4-980d-06bd4cc2c082:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: af7e715a-ccad-5012-9fd4-bd7c16d4fcc2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: afb33b46-b1fd-53cf-8df6-7c881c12f6a1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: afd75136-bcc0-57ed-a85b-10d470fb8336:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: afdb7e7f-fd83-5bd7-ac2b-5bfa08397f66:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:TRADE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: V1
+ reason: null
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:QUOTE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:3m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:5m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:15m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:30m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:2h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:4h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:6h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:8h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:12h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:3d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BOOK_SNAPSHOT::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BOOK_DELTA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: b41b2b3f-65b7-509d-a0b3-e7f3440d9a6a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b616b571-b4db-5d27-ae73-0e03e71e3125:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b6af67f3-e4ea-5982-a4d2-e2a4ed8b823e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b7b0141d-1de2-5b79-af97-a4d60ff6a9f5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b7b526a6-9361-5d6f-b4cc-f33a0ed80d47:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b96798e4-730a-5634-8c1a-8a4094b01660:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b9c46ba4-1d0f-5fbe-a751-b2bd086f5a23:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bc65c082-4ca8-5450-8597-f7f65a0ba923:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bcd51a8d-2e9f-5c7e-9796-eda0427c43b1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bdf97724-b6a0-5891-801a-a6a951c9174e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: be066d07-eee6-50a8-a137-73949877eeea:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: be32efaa-307f-595b-bc0a-4f1e5e00aba2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: be6c712f-0218-5350-b162-75cd18a1e8d1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bf08776d-5b74-54e8-8330-dd87635e9435:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bf1f6c47-30eb-5467-aea4-a66760bf5e5e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bf47b0d3-dd95-53fe-be70-52a0d8975e44:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bfbd909d-851e-5b08-93f3-197719ad65e2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c07b42ad-ab20-599a-b33f-053209030c55:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c26690f5-48a3-5cc3-8997-3c10a2a8b413:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c494f843-964d-549c-ae22-7831f47327ea:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c4f936dd-3d28-54c6-8b01-30296462bbb9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c62e2e82-9528-5d8b-96d5-2b22eaa4badd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c684a346-4477-5d60-a3a2-07907ea6657c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c76c9c52-1ca5-5d63-a9c4-03b9df5954b6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c7717222-2721-54a5-9119-4397db9205f0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cc0ebfed-f4ea-55dd-a7a6-fa83ff72befc:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ceddccfd-3365-5c05-bfb8-660f7ec23bad:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cf1b39f8-e1e2-5826-9683-67f3a1e11da8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d0a88aa5-d055-594d-9db7-fb56b8c06680:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d0b4908a-8eb5-5155-9c19-0880eb94aace:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d152df3e-e0d3-59b1-ba1f-7fa427418803:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d155abb8-8f0f-5934-81cc-39f102c4f2f5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d3583ef9-febd-54a0-9d23-5a2f62f6dbbe:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d397ccef-78a6-582e-a22a-52f39137a180:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d3a82a86-2d20-5b86-b9fe-5e53176d94d7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d4316760-92df-50ad-b291-79b043564d85:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d4ab40bf-f09d-5fe5-9d04-e9f3fef19d69:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d4b0d87b-fdeb-5b7b-86bc-381ee82ecd1f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d4f4fccc-77ba-584a-893d-db5c7fe40d9a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d7ab8d28-d6c2-5fab-876c-c968296b482d:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d909a518-8b6e-5286-ad80-ac435c739328:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: da43e311-fa63-5201-ba73-a92e3672a3b4:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: db35329e-fec3-5e5e-8dea-0e0e42aa71df:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: dd71effc-462a-5862-997d-74a587a49b61:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: de05bab8-6979-5f2a-ac65-fe3ca6141157:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: dfbcd529-82a2-52f0-892c-529e0a38c350:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e0377966-ec4b-5dd6-994b-ad4c0542e214:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e10c1a3c-f11a-57d8-ba19-c3c04dbeb028:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e11e62f8-26b3-5d07-8bfe-1d4603547dc9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e178f3a4-1ceb-5e0e-adc2-a3123c89d420:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e1c5a42c-cd07-53de-b750-372fe3f3879a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e2688e6c-660f-5deb-ba4b-5690d98ee452:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e395cb40-0cbd-5603-83b9-9c30ec14b062:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:TRADE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: V1
+ reason: null
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:QUOTE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:3m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:5m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:15m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:30m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:2h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:4h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:6h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:8h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:12h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:3d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BOOK_SNAPSHOT::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BOOK_DELTA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4cebf99-5916-5aa6-ab39-f66cbecba1ca:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4e0e48e-9508-50c5-bce5-0abce19965b9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e52590aa-7cd3-5cc9-9fd6-71026ee0eb26:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e70f56d4-69db-5b2c-9484-de67bd4ec8bf:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e840b0bc-066b-5a63-9368-8654ade8462f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e85dc2e1-f82f-544f-b55e-3176925d996c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e8fe4622-da4d-5922-a87c-eddfb07c88f6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ea9b707d-7913-5476-b9c7-a17a3c42d7c9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ecfceb71-472a-5e6b-8228-51fe99af10dd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ed47715e-b8e0-53b8-a82c-686b40c69eaa:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:TRADE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: V1
+ reason: null
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:QUOTE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:3m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:5m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:15m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:30m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:2h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:4h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:6h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:8h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:12h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:3d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BOOK_SNAPSHOT::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BOOK_DELTA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: ef08a051-1cfb-5456-83e2-a0ceff1a1bf4:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f0fc7947-d63b-5d68-9693-e57180133118:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f122c0e0-d424-55af-a030-a421e88e6549:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f1fa334d-15e7-5ca3-9e11-5b805b3426a1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f2816e98-1b6c-5558-a201-02b744d72cc3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f3d07537-e856-5793-9fe4-75d9f1e54e5b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f41d64f2-dc4f-53f1-8911-bf8dd7a59249:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f51c770c-f711-54e5-ab83-8ef6cc63d247:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f5fb66fd-577f-59cf-87a4-9d1d43547626:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f693e7fa-26b4-554f-b4ab-5d34841777e5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f6a20794-dd2f-5d62-943e-dadb6e05749b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f6b38750-2d9a-52ff-b76e-9f26fb70bd46:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f75e5f45-7f1b-5282-9acc-18800ba9364e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f888a2f7-79c3-5a8f-9170-cca6be1325f5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f975d17f-3347-5fcf-b56a-fb8b8f6b0de2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fa2e9712-8ce9-538a-8b92-37c85401156c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fdde788f-16a2-5b0b-a66b-19ae99a38d08:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fdfdbfc0-5545-5fb1-bd8f-5c4a345ada59:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fe2efca0-97a3-5b71-977a-e64af44d657c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BASIS:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:CONTRACT_METADATA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:FUNDING_RATE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:MARK_INDEX_PRICE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BASIS:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:CONTRACT_METADATA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:FUNDING_RATE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:MARK_INDEX_PRICE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BASIS:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:CONTRACT_METADATA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:FUNDING_RATE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:MARK_INDEX_PRICE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BASIS:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:CONTRACT_METADATA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:FUNDING_RATE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:MARK_INDEX_PRICE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BASIS:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:CONTRACT_METADATA::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:FUNDING_RATE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:MARK_INDEX_PRICE::crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+- consumer_id: alpha.okx.paper.stable
+ manifest: /app/consumers/stable/alpha-okx-paper.yaml
+ manifest_revision: 14
+ manifest_sha256: 9e48000e26c1283dd6e786c17d51a79e812bfa2bb97e122f8b944641b8329cdf
+ demand_revision: 7
+ products:
+ - requirement_key: 00014941-4c7d-5d7a-92cc-00a83d5cf499:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0414ddcb-cdf9-5526-bee6-c1e163b0dddc:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0641ed20-dbfb-52af-be4c-fa513302dda6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 07013277-a316-5034-b845-949aef2c6d33:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0894b131-b84e-5572-8739-cdf71c3635d9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 08aae292-6843-515e-9dc0-b3df41676f40:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0937b736-4c89-563f-ab1d-ffdab60ff40a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0c366f91-4035-5e8f-a90d-79b7fe6f9d8f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0c4da48d-3f48-5d08-a5ab-077db6880253:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0c9901a2-d4ff-53d6-b55e-66bc1fe92f23:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0d6874fd-9a88-5f6f-bb81-61233d9870db:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0dcec1fa-50ad-5331-9f21-54a763d63728:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 0e38b4ee-be80-5bf8-9c23-2ff2172781bd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 12db7dc2-d833-569e-ade1-36d630dc90a8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1386e6fa-2743-506b-90e9-e312c87d0b30:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 14d5f443-1410-568b-9cad-ea30566aa1f2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 15e8ca6e-7618-524c-8548-dab9d49d155c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 15fc9a9d-0df2-5151-a349-584edc626597:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 176b8d35-f51e-5abb-8eda-fcd70b43b2f0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 178533cf-690f-53b6-892b-8d2064e856cb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 17b0014a-f8aa-54b3-aba3-8bb3b53a0cb5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 17b7003c-122e-5e83-9347-757a0f55deb8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 183d6b91-1ac1-5334-9b0c-f86a98316df3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 195652dd-5450-5ed1-8059-3a90ff9d2e3d:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1a495947-d440-5313-b4b5-491c73ded166:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1d51893f-f23d-5ea1-a0db-e98d5d85ddf8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1ddf760f-6bde-550c-81ab-928b528b0796:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1df523d5-6806-57a8-80d0-7a86598b321b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1e759e5a-7609-57d9-8376-dd32765a78a6:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 1ff01016-b08e-5be8-b10f-30e4a459c5e3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 203a98b3-8a3e-5453-8355-e54e502f3e0e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 20646822-2fc8-5481-b537-5512f04bbfcd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 20b68200-9172-5ad5-9bbf-de59df6bf723:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 20df3a21-188b-5d43-bd86-89cdb130b05f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 235049a1-cf7f-5522-b01e-e37d40f9369a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 235dac6d-c8f4-5fdf-9e43-c63b7acb2695:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 24c96a8e-7426-5015-b35c-6f3d68a07ab2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 256ec9a1-8d20-597a-b2fb-38f5dc1fe565:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 25e71abf-12a5-5592-bb66-01aeb4ec654e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 25eef1f1-eee5-5f91-8312-4e63c09d3a06:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 26baedc8-2048-50f2-9a1c-af80f289753e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 26e96bfc-418b-534a-b86b-8845cec5b53b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 270bf956-2840-5f96-8280-f4d6086edf9f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 27982e73-8051-5150-9427-09d97acfe909:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 289763f0-b5a1-54c7-bba4-056f17165f0c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 292be648-85a0-5bc0-b2ac-a92b78bf59b3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2938c47d-5ce9-5831-902c-39668fde211f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2a20f1eb-ccd6-591d-aea6-310c5273eef7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2b84d2ac-ae1c-5f7b-892d-0ee66ea524ce:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2bf7bb7d-d4be-51fa-934f-89687d9c89f9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2d440aae-79d3-5944-821b-0dca146f4f5a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2d9b86aa-6d14-5b37-9606-cbeb7f9fb99f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2e519d06-1197-50f2-acf8-62f5dfc66e2a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 2f110c43-e43d-5784-8ceb-9970d2d16742:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 30f599c1-3235-58aa-a8cb-734f70804b89:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3146ec6a-27dc-5e20-9a42-39063691ca94:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 318696f4-cfb2-52b1-9f52-105f6a8ac140:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 319aae36-a24a-5e82-9b70-aa2770aabbee:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 31fa85a6-84af-5460-a60b-60d36d7dd9c1:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3225191d-c00c-585f-b9b2-38638a334156:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 33e59369-e856-5e56-a8ce-7353901b4145:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 35774e81-f965-5c8e-accf-3324fecc1fa5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 35b1c49f-18fe-5ef3-945c-e49b6201ffc7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 35bf552b-63d1-5895-9701-0250484053ab:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 36634174-d68e-5d1b-8a57-0746757d61ae:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 38720d66-4542-519f-8340-f51bc0435fc5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 387cd038-59b0-5bbc-a1d0-b70c809fdbaf:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3972e5a1-86e2-5ad3-b618-fb0c3c3883b5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3a073d46-0cc7-52c3-84ab-7e9dcc070d29:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3a3e5936-9911-56a6-8c11-f74a5df1ae48:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3b9dba04-5e62-5afa-9646-1ea56ea22c71:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3bf03be6-473d-5b0d-98c1-229146bb1ca9:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3c1609c9-5606-53bd-ba2f-92ee45eadf5c:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3da91678-916e-5b47-89e8-f17415a6c86f:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3e398787-071d-5908-a5e1-2ce40fdc1ab5:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3fc9f34e-9f0b-51f7-88e5-541bce2ffa01:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 3ffaf140-0a92-512f-9024-d5e2ee2fe059:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 42cadfc3-bbc5-57c8-9dd7-3db712ea2c50:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4546dfee-c278-5efd-932e-6c7d70fe7614:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4577295f-71f8-5786-b492-3860d3628a0b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 45d2fda2-8fd6-58da-a98f-7f88ecfdb233:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 489ea514-438e-557d-afd0-1f45af70d83e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 48ab37f6-4785-5ad6-b3e3-916d52a99fcd:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4ad24830-64f9-5e62-b115-f11c5619bdef:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4c64df18-1b0c-5421-8fa7-311e99b8f2c3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4dfc6d0e-ead5-5b66-b680-ab4be9fcb006:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 4ed9c3b0-c7a2-5503-9b76-6e55bfd2796b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 507e7575-15f4-5f2e-bd0b-e846fe5526a0:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 5165ddf3-9ae3-58de-ac8a-8d63ccaee28b:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:3m:crypto_primary_v2
+ - requirement_key: 529720c7-b5fc-5cbf-a468-bf7d090de894:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:5m:crypto_primary_v2
+ - requirement_key: 5336b28c-d8c6-5ec9-a71d-f35fffe2b35d:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:15m:crypto_primary_v2
+ - requirement_key: 54f7a9c4-b91b-50d5-a8d9-8c4e0481f2ec:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:30m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 570343fe-2838-5406-bbfb-f33f719eeb93:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1h:crypto_primary_v2
+ - requirement_key: 5788acc3-3acc-56dc-91b5-3864d190995f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:2h:crypto_primary_v2
+ - requirement_key: 58356b9a-8f38-5bb9-b04a-9f6955732264:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:4h:crypto_primary_v2
+ - requirement_key: 584edfc0-b4dc-55fb-92ba-6c11d6c23beb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:6h:crypto_primary_v2
+ - requirement_key: 58d2c7fc-59d2-5269-9523-6303dfc8bcce:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:8h:crypto_primary_v2
+ - requirement_key: 5b8fa4b3-8e22-527e-9c5f-1bc4bce52ea1:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:12h:crypto_primary_v2
+ - requirement_key: 5c0400ee-5571-5e36-ae79-5898f75f7e49:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1d:crypto_primary_v2
+ - requirement_key: 5cdb4aec-8296-5fe4-8819-4d4c59359237:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:3d:crypto_primary_v2
+ - requirement_key: 5d2fbdcc-38dd-56be-b409-25f9a6e292eb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BAR:1w:crypto_primary_v2
+ - requirement_key: 5e2aad21-b8c6-5a22-badf-df62fcfd8b8b:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: 5f170209-f395-577f-8871-bac517578c30:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BOOK_DELTA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6060943d-4f6b-5a3f-a7b7-33e32b136f9f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:TRADE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 60a93fc7-e0c2-5bf1-baba-91248afba2d0:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
- fallback: V1
- reason: null
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:QUOTE::crypto_primary_v2
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 61db3057-2ee1-5185-a84f-639b8bc5f0e8:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 62df6d23-97c0-56d2-b692-2599900de181:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:3m:crypto_primary_v2
+ - requirement_key: 63b3db9e-afe4-5b72-821a-184be6395dd4:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:5m:crypto_primary_v2
+ - requirement_key: 646c3736-dfab-5991-b6da-630371e190dd:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:15m:crypto_primary_v2
+ - requirement_key: 65a8ce81-79af-5f85-9e44-4475ae3605d2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:30m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 65f789bb-7953-55b3-88ed-bb47357ad12a:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1h:crypto_primary_v2
+ - requirement_key: 65ff2489-e48d-5bf9-add1-c6914ee0256a:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:2h:crypto_primary_v2
+ - requirement_key: 6725804c-2929-5315-bd4e-4a21d3825f75:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:4h:crypto_primary_v2
+ - requirement_key: 690463df-9bd3-5454-a02c-5f4ed16d0cc3:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:6h:crypto_primary_v2
+ - requirement_key: 695383b0-8790-5789-9eac-4704b3087cbb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:8h:crypto_primary_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:TRADE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_OKX_TRADE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:QUOTE::crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1m:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_OKX_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:3m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:12h:crypto_primary_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:5m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1d:crypto_primary_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:15m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:3d:crypto_primary_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:30m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BAR:1w:crypto_primary_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:2h:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:4h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:6h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:12h:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:2d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:3d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BOOK_SNAPSHOT::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BOOK_DELTA::crypto_liquid_v2
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BOOK_DELTA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:TRADE::crypto_primary_v2
+ - requirement_key: 6ce36c6d-918e-59a9-8b5d-372b6ab95d52:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
- fallback: V1
- reason: null
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:QUOTE::crypto_primary_v2
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6d3356bb-1bd4-53ae-9e44-f6f5f922c113:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6eab37a2-e239-501a-9c28-bdb217207626:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:3m:crypto_primary_v2
+ - requirement_key: 7152cd4d-c839-54cb-9380-833718f8ed53:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:5m:crypto_primary_v2
+ - requirement_key: 71811c18-9781-5d02-9d09-26e6177ae6c2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:15m:crypto_primary_v2
+ - requirement_key: 71938fe0-fd7b-55ea-b43d-569751b83945:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:30m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 71f6156c-a6f2-5cc1-b917-0a60c5966bd3:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1h:crypto_primary_v2
+ - requirement_key: 73db6ef0-8d34-55fa-ae44-a531598b5c19:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:2h:crypto_primary_v2
+ - requirement_key: 748fd517-7800-5b0c-a9b0-fbd43c6fa65f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:4h:crypto_primary_v2
+ - requirement_key: 7550c6c6-2f96-55cf-b1ba-d4cc98f0ff29:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:6h:crypto_primary_v2
+ - requirement_key: 75ca584b-3205-54bf-81bf-e1e712bbb724:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:8h:crypto_primary_v2
+ - requirement_key: 79f2eb58-b5bc-5319-8e8a-4b7951365d67:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:12h:crypto_primary_v2
+ - requirement_key: 7d0a90b7-1135-5fda-9dd3-1679af5ca334:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1d:crypto_primary_v2
+ - requirement_key: 7d199ba4-65b9-5d0a-a61e-0329cad893f2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:3d:crypto_primary_v2
+ - requirement_key: 7d5325c8-5aca-5be3-9f12-f32e1ee54403:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BAR:1w:crypto_primary_v2
+ - requirement_key: 7d65b700-2308-5a0c-a7a9-252d41c80981:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: 7e348480-a4c5-564c-b594-8c78c1b61c38:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BOOK_DELTA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8198b1a1-966b-584b-95cf-40fd8877de2c:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:TRADE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 82032262-6777-5cf9-8f1a-bf683a6ddb41:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
- fallback: V1
- reason: null
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:QUOTE::crypto_primary_v2
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 853e2ca1-d5ec-5ce1-b7aa-2d0384a242f2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 86b10bc8-6dd9-51a0-ad1d-5c56b1491bee:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:3m:crypto_primary_v2
+ - requirement_key: 884cf4b4-b78d-5b31-862f-92f6c3a59781:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:5m:crypto_primary_v2
+ - requirement_key: 895966bd-d394-5110-81da-212f87eb5f1b:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:15m:crypto_primary_v2
+ - requirement_key: 8ae72fb1-bcd8-59de-8a72-dce8afc111b9:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:30m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 8b6e8b7c-bbef-5f4b-bd43-26d6807b7ed3:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1h:crypto_primary_v2
+ - requirement_key: 8c029be8-d578-5909-b2af-10ed4d7092c4:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:2h:crypto_primary_v2
+ - requirement_key: 8c38db3b-1506-5cb8-aad8-88eff197632b:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:4h:crypto_primary_v2
+ - requirement_key: 8d648cb4-d326-52d5-8812-5b75a638c275:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:6h:crypto_primary_v2
+ - requirement_key: 8d68ba2a-28c6-597c-94ec-a34cbda836d1:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:8h:crypto_primary_v2
+ - requirement_key: 8d97188f-2e7d-5da4-8119-f0a72b370ce0:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:12h:crypto_primary_v2
+ - requirement_key: 8f467d3f-0a67-5b81-82f9-16f0d8385b39:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1d:crypto_primary_v2
+ - requirement_key: 90c794b3-17ca-5335-876f-244747669c7f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:3d:crypto_primary_v2
+ - requirement_key: 90f3b14e-e641-5e4f-a838-139b568ae459:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BAR:1w:crypto_primary_v2
+ - requirement_key: 911d8f09-a9c1-5d0f-b448-8ff475f26fac:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: 9351416b-7e70-583d-8b77-869eb6c5bea0:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BOOK_DELTA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9413e3e7-2a07-5580-a1e2-c94693917f36:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:TRADE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 95294011-4f97-5df4-bac8-b9a1e128e595:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
- fallback: V1
- reason: null
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:QUOTE::crypto_primary_v2
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9662e66c-84cc-5cfa-a5e6-28339c41bdc2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 98d5b8b5-75af-5e2b-b9ce-1d0480d98316:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:3m:crypto_primary_v2
+ - requirement_key: 99660d9e-89eb-5e36-82a9-386a20e9456a:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:5m:crypto_primary_v2
+ - requirement_key: 99a4b5da-751f-54f9-85b2-b37fac4f1c84:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:15m:crypto_primary_v2
+ - requirement_key: 9f885fc0-baed-514b-8208-93680d827cd5:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:30m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: 9f8acd08-a48b-5250-8f11-cfba5a08d003:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1h:crypto_primary_v2
+ - requirement_key: a06885be-3b01-5dcf-80a0-a06da823219d:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:2h:crypto_primary_v2
+ - requirement_key: a0a4d5db-8302-5642-9bd4-b2793fe1be87:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:4h:crypto_primary_v2
+ - requirement_key: a0ae3b67-529c-5c60-b1d5-992b2a5dfe90:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:6h:crypto_primary_v2
+ - requirement_key: a2098fe2-1ea7-524b-973a-51a12170995b:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:8h:crypto_primary_v2
+ - requirement_key: a34f42e7-0573-5df3-80cd-9084b7f75687:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:12h:crypto_primary_v2
+ - requirement_key: a3b5105d-867a-5642-8bd6-839890060801:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1d:crypto_primary_v2
+ - requirement_key: a447abdb-17fa-52da-9499-aaf4cf51048e:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:3d:crypto_primary_v2
+ - requirement_key: a583d89b-cbb8-522a-b0ef-2d45958b97be:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BAR:1w:crypto_primary_v2
+ - requirement_key: a640fd51-235d-59b7-b21a-c2e6b42e8eea:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:TRADE::crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BOOK_DELTA::crypto_liquid_v2
+ reason: V1_OKX_TRADE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:QUOTE::crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:BASIS:1d:crypto_liquid_v2
+ reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:CONTRACT_METADATA::crypto_liquid_v2
+ reason: V1_OKX_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:3m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:FUNDING_RATE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:5m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:15m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:MARK_INDEX_PRICE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:30m:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:OPEN_INTEREST:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1h:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: 8aedd349-6999-5874-b0dd-34c6451c0b3a:TAKER_FLOW:1d:crypto_liquid_v2
+ reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:2h:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:BASIS:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:4h:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:CONTRACT_METADATA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:6h:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:FUNDING_RATE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:12h:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:MARK_INDEX_PRICE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:2d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:OPEN_INTEREST:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:3d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:TAKER_FLOW:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1w:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BOOK_SNAPSHOT::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:BASIS:1d:crypto_liquid_v2
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BOOK_DELTA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:CONTRACT_METADATA::crypto_liquid_v2
+ reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6acc2cc-47b2-5408-956c-6d9516376d78:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:FUNDING_RATE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: a94e40cf-8e6a-5861-ba13-dafed1d90271:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ab30f1b5-36ae-5ed3-8d53-75389fa69760:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:MARK_INDEX_PRICE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ab646932-485c-5c6f-92c1-65427d0c4a96:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:OPEN_INTEREST:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ac172201-2cdd-5d63-906a-5e567bf2a6f7:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: b2d78145-b541-58e2-941b-06c44c65e45f:TAKER_FLOW:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: adc4bf83-b054-5f94-8ff6-7678579db124:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:BASIS:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ae8a6bb7-2cd4-54c3-b4f8-361b9e8975d1:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:CONTRACT_METADATA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ae998e95-9c34-5d87-9e0e-8677dcea9e1f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:FUNDING_RATE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: aeb5de89-5b1b-55ee-9168-09d36928c04d:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: afefd678-4d6f-51a9-82aa-8cf6584c1280:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:MARK_INDEX_PRICE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b05f357a-776d-5fb2-a701-483e0838bf6d:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:OPEN_INTEREST:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b07cf454-cbe6-58ab-a0db-c6f2cd0c9aaa:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: e4ce7249-a4e8-5073-beb8-dab908596c34:TAKER_FLOW:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b1eba3de-3bef-55a7-9f3d-a83b0f5b2883:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:BASIS:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b62cec8c-d821-5a30-bb62-3fccb691e94c:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:CONTRACT_METADATA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b825c1a3-edec-52b7-999c-a336a4bcd817:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:FUNDING_RATE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: b9e653fa-d3cf-5fae-bd8e-c5abc89f8a0f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: baa311c7-ab43-5131-b076-64337b2e2c39:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:MARK_INDEX_PRICE::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bad074bb-5acd-5bcd-943c-0219c7fd7beb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:OPEN_INTEREST:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bd0199bd-f1ef-591c-b8e8-302087a52eb8:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- - requirement_key: ee93fabf-68df-5b50-8924-51bf25a5a757:TAKER_FLOW:1d:crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: be5ea6cc-f563-51fa-bc10-9c058c425bf3:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
-- consumer_id: alpha.okx.paper.stable
- manifest: /app/consumers/stable/alpha-okx-paper.yaml
- manifest_revision: 11
- manifest_sha256: 3b39c485e1043a9dd648121e9f62cdd94f4f801565e021ace13d59f56c23bc4e
- demand_revision: 6
- products:
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:TRADE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bee2d394-e836-518d-ab8e-2df7c5d2f804:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_OKX_TRADE_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:QUOTE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: bfef0630-a478-5996-a534-78a181d72cbc:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c2577593-ef21-50d4-ad40-3c23bb0fa4cc:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_OKX_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:3m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c2a4cfc9-f776-5b5f-92e5-93968a3b5f7f:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:5m:crypto_primary_v2
+ - requirement_key: c3705bd0-6cfc-5fce-b553-a7a9cadfae83:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:15m:crypto_primary_v2
+ - requirement_key: c3b6e04c-e7ea-5345-8bf7-53548d7ca3e6:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:30m:crypto_primary_v2
+ - requirement_key: c3b75c12-276b-5a3d-8313-dc7145c321e7:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1h:crypto_primary_v2
+ - requirement_key: c464706c-3b06-56e0-944e-f267bc9a6ce3:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:2h:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: c5b36eb9-1f69-5f18-90db-6d517c0488bb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:4h:crypto_primary_v2
+ - requirement_key: c6ae2a4c-3338-544d-b14e-05035b0976cb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:6h:crypto_primary_v2
+ - requirement_key: c7931346-0c07-52e2-86ff-54453b265e14:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:12h:crypto_primary_v2
+ - requirement_key: c82e28aa-40a0-50b0-94b1-67d52f67689e:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1d:crypto_primary_v2
+ - requirement_key: c86dd48a-f192-5370-9023-cc8654f83f30:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:2d:crypto_primary_v2
+ - requirement_key: c93702ef-d71b-512e-8cc8-5ecd3615a644:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:3d:crypto_primary_v2
+ - requirement_key: caa279de-37c7-5511-aa49-c173cd3b2208:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BAR:1w:crypto_primary_v2
+ - requirement_key: cc8696da-de35-5b97-a735-305be3007c5d:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: ccdc25a6-00a2-593f-bf6c-98d6a45441fd:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:BOOK_DELTA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cdb92414-5c7b-5513-a600-371746aa36fb:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:TRADE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cec3acd8-dd93-5666-8aaa-257f41cd90ef:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_OKX_TRADE_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:QUOTE::crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cf6b9041-4ee3-5085-b4fe-96dca6d5e559:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_QUOTE_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cf8247ac-2438-5123-90c0-5774c79d0ca2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_OKX_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:3m:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: cfb1b966-854f-5ae3-ada3-a20f775cc056:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:5m:crypto_primary_v2
+ - requirement_key: d10ee13d-a2a2-5305-bb0d-678a9c63c5e2:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:15m:crypto_primary_v2
+ - requirement_key: d35d084c-ebb6-5fc0-9e7c-f71a1a0b1228:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:30m:crypto_primary_v2
+ - requirement_key: d3d01f05-c55c-5871-bac8-26ccfe5af5b0:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1h:crypto_primary_v2
+ - requirement_key: d51c82b5-73b7-59ac-9619-162ae56cbf31:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_PASS_THROUGH_PARITY_UNCERTIFIED
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:2h:crypto_primary_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: d5a36311-364a-5c91-bdc1-e4aa7a6a6847:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:4h:crypto_primary_v2
+ - requirement_key: d7657b6a-8c62-5c36-b0cf-865b310a50e0:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:6h:crypto_primary_v2
+ - requirement_key: d7d32090-97db-5095-8253-b5de3e21d5d1:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:12h:crypto_primary_v2
+ - requirement_key: da4e0df9-0b8c-54c1-9a9c-309187cbb94d:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1d:crypto_primary_v2
+ - requirement_key: de72f091-5621-58d0-af8a-db73f1c171ee:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:2d:crypto_primary_v2
+ - requirement_key: e00eeab2-0a7b-50a1-ba68-05d951812aac:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:3d:crypto_primary_v2
+ - requirement_key: e0acf5c2-36a0-586c-aa61-f605130f80b7:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BAR:1w:crypto_primary_v2
+ - requirement_key: e1dbf2df-216a-589f-9d50-160825eec9c3:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BOOK_SNAPSHOT::crypto_liquid_v2
+ - requirement_key: e20788ab-5f1e-54f9-9db7-eb43eadcd6d9:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
- - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:BOOK_DELTA::crypto_liquid_v2
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e25cd054-6591-5215-ab8e-acea61b96e3b:BAR:1d:crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
- reason: V1_L2_EQUIVALENCE_UNPROVEN
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- requirement_key: e49b54ae-c23d-5351-9e64-47934aac28f8:TRADE::crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -779,6 +2671,58 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: e653b192-ecf4-5325-88a8-a04551746c1a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e8d8b9ac-61c8-53d9-aa43-f8015e885f58:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: e8f4a1d8-7c75-5271-9f2c-cebed1e317c0:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ea7a81ea-5876-5db2-89f2-1af550f455ef:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ea9eb608-383e-5b81-9669-6a4afbf2b530:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: eac1a50e-ee45-5720-9299-5aedf9727450:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ebeef153-4f05-50b4-8152-fc22e2d2c5fe:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ed4319f7-8e4a-5570-a34d-88118cb1c276:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: edb2816d-e9d4-5547-bf3b-abb14dec58bb:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: eef06df7-cf51-5d7c-9642-e7a4309c225b:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: ef06e949-902e-5a7b-86fc-f4513675ca51:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f0218fe0-e2bf-56b3-b9c0-de1182f1c5f8:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f2d5dfed-750e-5fe4-adc2-b7e0a731eff7:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- requirement_key: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:TRADE::crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -851,6 +2795,30 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: f356265e-f401-5851-8157-ff8e294f34d2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f5a63ee0-7db9-5696-b84e-ab0d4b06ce2a:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f6f6342f-5ea9-5491-be55-0d2cac840f88:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f8054e3a-1f79-57fb-9b98-a21a24348e74:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: f869a1e1-e714-53d9-9dfe-828b42ae81c3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fab3bb0f-c0e5-58b6-94b9-7515d3fef752:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- requirement_key: fb26214c-7b9b-5961-95b2-55154755af0f:TRADE::crypto_primary_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -923,6 +2891,38 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_L2_EQUIVALENCE_UNPROVEN
+ - requirement_key: fc7a72ab-a650-5172-993f-9d097b16dcac:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fc938060-7733-5efe-9050-68be8f156a9e:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fcb15aad-f5e9-5245-9f5c-3aa66b4d6507:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fd7ff987-a411-5139-9f6b-e70c7f03d6e4:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fe05b11d-24ac-5fe8-8f49-f393e6a50748:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fe539963-7719-5e2b-85f8-213f889f2433:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fe9a679f-abf6-5670-9aa4-06c0c82e4af2:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
+ - requirement_key: fefc51a7-8247-5790-bf82-6817bf12e7b3:BAR:1d:crypto_primary_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_FINAL_BAR_EQUIVALENCE_UNPROVEN
- requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:CONTRACT_METADATA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -931,6 +2931,10 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:MARK_INDEX_PRICE::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -939,6 +2943,14 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:CONTRACT_METADATA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -947,6 +2959,10 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:MARK_INDEX_PRICE::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -955,6 +2971,14 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: e49b54ae-c23d-5351-9e64-47934aac28f8:CONTRACT_METADATA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -963,6 +2987,10 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e49b54ae-c23d-5351-9e64-47934aac28f8:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: e49b54ae-c23d-5351-9e64-47934aac28f8:MARK_INDEX_PRICE::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -971,6 +2999,14 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e49b54ae-c23d-5351-9e64-47934aac28f8:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: e49b54ae-c23d-5351-9e64-47934aac28f8:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:CONTRACT_METADATA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -979,6 +3015,10 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:MARK_INDEX_PRICE::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -987,6 +3027,14 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: fb26214c-7b9b-5961-95b2-55154755af0f:CONTRACT_METADATA::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -995,6 +3043,10 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: fb26214c-7b9b-5961-95b2-55154755af0f:LONG_SHORT_RATIO:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- requirement_key: fb26214c-7b9b-5961-95b2-55154755af0f:MARK_INDEX_PRICE::crypto_liquid_v2
route: V2_PRIMARY
fallback: BLOCKED
@@ -1003,11 +3055,19 @@ consumers:
route: V2_PRIMARY
fallback: BLOCKED
reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: fb26214c-7b9b-5961-95b2-55154755af0f:OPEN_INTEREST:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
+ - requirement_key: fb26214c-7b9b-5961-95b2-55154755af0f:TAKER_FLOW:1d:crypto_liquid_v2
+ route: V2_PRIMARY
+ fallback: BLOCKED
+ reason: V1_REFERENCE_EQUIVALENCE_UNPROVEN
- consumer_id: alpha.vn.paper.stable
manifest: /app/consumers/stable/alpha-vn-paper.yaml
manifest_revision: 1
manifest_sha256: f2f03f87bfeb775d90099e0bdb38ee9b158ee1506dd333581ef54635e20d3e2a
- demand_revision: 6
+ demand_revision: 7
products:
- requirement_key: d0ac3d4c-2374-5690-8af5-b970448f91d3:BAR:1m:vn_primary_v2
route: V1_PRIMARY
@@ -1021,7 +3081,7 @@ consumers:
manifest: /app/consumers/stable/trading-system-paper.yaml
manifest_revision: 10
manifest_sha256: 5ca9aff1960883f59827e3a34ed709f4c30cf5db96c4e1253dd6f1116fb20cdf
- demand_revision: 6
+ demand_revision: 7
products:
- requirement_key: a953e16e-7138-5562-b5e8-c337a44d0b65:TRADE::crypto_primary_v2
route: V2_PRIMARY
diff --git a/config/v2/universes/crypto-top300-1d.changes.jsonl b/config/v2/universes/crypto-top300-1d.changes.jsonl
new file mode 100644
index 00000000..c2794f17
--- /dev/null
+++ b/config/v2/universes/crypto-top300-1d.changes.jsonl
@@ -0,0 +1 @@
+{"added": [{"base": "BTC", "market_cap_rank": 1, "reason": "SIGNED"}, {"base": "ETH", "market_cap_rank": 2, "reason": "SIGNED"}, {"base": "BNB", "market_cap_rank": 3, "reason": "SIGNED"}, {"base": "XRP", "market_cap_rank": 4, "reason": "SIGNED"}, {"base": "SOL", "market_cap_rank": 5, "reason": "SIGNED"}, {"base": "TRX", "market_cap_rank": 6, "reason": "SIGNED"}, {"base": "ZEC", "market_cap_rank": 7, "reason": "SIGNED"}, {"base": "HYPE", "market_cap_rank": 8, "reason": "SIGNED"}, {"base": "DOGE", "market_cap_rank": 9, "reason": "SIGNED"}, {"base": "LINK", "market_cap_rank": 10, "reason": "SIGNED"}, {"base": "ADA", "market_cap_rank": 11, "reason": "SIGNED"}, {"base": "XLM", "market_cap_rank": 12, "reason": "SIGNED"}, {"base": "BCH", "market_cap_rank": 13, "reason": "SIGNED"}, {"base": "NEAR", "market_cap_rank": 14, "reason": "SIGNED"}, {"base": "UNI", "market_cap_rank": 15, "reason": "SIGNED"}, {"base": "LTC", "market_cap_rank": 16, "reason": "SIGNED"}, {"base": "CC", "market_cap_rank": 17, "reason": "SIGNED"}, {"base": "SUI", "market_cap_rank": 18, "reason": "SIGNED"}, {"base": "AVAX", "market_cap_rank": 19, "reason": "SIGNED"}, {"base": "HBAR", "market_cap_rank": 20, "reason": "SIGNED"}, {"base": "GRAM", "market_cap_rank": 21, "reason": "SIGNED"}, {"base": "TAO", "market_cap_rank": 22, "reason": "SIGNED"}, {"base": "SHIB", "market_cap_rank": 23, "reason": "SIGNED"}, {"base": "ENA", "market_cap_rank": 24, "reason": "SIGNED"}, {"base": "ONDO", "market_cap_rank": 25, "reason": "SIGNED"}, {"base": "AAVE", "market_cap_rank": 26, "reason": "SIGNED"}, {"base": "PUMP", "market_cap_rank": 27, "reason": "SIGNED"}, {"base": "DOT", "market_cap_rank": 28, "reason": "SIGNED"}, {"base": "ASTER", "market_cap_rank": 29, "reason": "SIGNED"}, {"base": "MORPHO", "market_cap_rank": 30, "reason": "SIGNED"}, {"base": "WLFI", "market_cap_rank": 31, "reason": "SIGNED"}, {"base": "PEPE", "market_cap_rank": 32, "reason": "SIGNED"}, {"base": "SKY", "market_cap_rank": 33, "reason": "SIGNED"}, {"base": "WLD", "market_cap_rank": 34, "reason": "SIGNED"}, {"base": "ICP", "market_cap_rank": 35, "reason": "SIGNED"}, {"base": "QNT", "market_cap_rank": 36, "reason": "SIGNED"}, {"base": "ARB", "market_cap_rank": 37, "reason": "SIGNED"}, {"base": "ETC", "market_cap_rank": 38, "reason": "SIGNED"}, {"base": "VVV", "market_cap_rank": 39, "reason": "SIGNED"}, {"base": "POL", "market_cap_rank": 40, "reason": "SIGNED"}, {"base": "LIT", "market_cap_rank": 41, "reason": "SIGNED"}, {"base": "JUP", "market_cap_rank": 42, "reason": "SIGNED"}, {"base": "ALGO", "market_cap_rank": 43, "reason": "SIGNED"}, {"base": "RENDER", "market_cap_rank": 44, "reason": "SIGNED"}, {"base": "ATOM", "market_cap_rank": 45, "reason": "SIGNED"}, {"base": "AERO", "market_cap_rank": 46, "reason": "SIGNED"}, {"base": "FIL", "market_cap_rank": 47, "reason": "SIGNED"}, {"base": "DASH", "market_cap_rank": 48, "reason": "SIGNED"}, {"base": "INJ", "market_cap_rank": 49, "reason": "SIGNED"}, {"base": "APT", "market_cap_rank": 50, "reason": "SIGNED"}, {"base": "STABLE", "market_cap_rank": 51, "reason": "SIGNED"}, {"base": "ETHFI", "market_cap_rank": 52, "reason": "SIGNED"}, {"base": "STX", "market_cap_rank": 53, "reason": "SIGNED"}, {"base": "PENGU", "market_cap_rank": 54, "reason": "SIGNED"}, {"base": "TRUMP", "market_cap_rank": 55, "reason": "SIGNED"}, {"base": "PYTH", "market_cap_rank": 56, "reason": "SIGNED"}, {"base": "ZRO", "market_cap_rank": 57, "reason": "SIGNED"}, {"base": "CRV", "market_cap_rank": 58, "reason": "SIGNED"}, {"base": "XPL", "market_cap_rank": 59, "reason": "SIGNED"}, {"base": "VIRTUAL", "market_cap_rank": 60, "reason": "SIGNED"}, {"base": "SEI", "market_cap_rank": 61, "reason": "SIGNED"}, {"base": "TIA", "market_cap_rank": 62, "reason": "SIGNED"}, {"base": "PENDLE", "market_cap_rank": 63, "reason": "SIGNED"}, {"base": "PIEVERSE", "market_cap_rank": 64, "reason": "SIGNED"}, {"base": "SPX", "market_cap_rank": 65, "reason": "SIGNED"}, {"base": "NIGHT", "market_cap_rank": 66, "reason": "SIGNED"}, {"base": "LDO", "market_cap_rank": 67, "reason": "SIGNED"}, {"base": "UB", "market_cap_rank": 68, "reason": "SIGNED"}, {"base": "XTZ", "market_cap_rank": 69, "reason": "SIGNED"}, {"base": "GRASS", "market_cap_rank": 70, "reason": "SIGNED"}, {"base": "OP", "market_cap_rank": 71, "reason": "SIGNED"}, {"base": "KITE", "market_cap_rank": 72, "reason": "SIGNED"}, {"base": "BONK", "market_cap_rank": 73, "reason": "SIGNED"}, {"base": "MON", "market_cap_rank": 74, "reason": "SIGNED"}, {"base": "JTO", "market_cap_rank": 75, "reason": "SIGNED"}, {"base": "GRT", "market_cap_rank": 76, "reason": "SIGNED"}, {"base": "AR", "market_cap_rank": 77, "reason": "SIGNED"}, {"base": "STRK", "market_cap_rank": 78, "reason": "SIGNED"}, {"base": "ENS", "market_cap_rank": 79, "reason": "SIGNED"}, {"base": "CFX", "market_cap_rank": 80, "reason": "SIGNED"}, {"base": "USELESS", "market_cap_rank": 81, "reason": "SIGNED"}, {"base": "FLOKI", "market_cap_rank": 82, "reason": "SIGNED"}, {"base": "2Z", "market_cap_rank": 83, "reason": "SIGNED"}, {"base": "SYRUP", "market_cap_rank": 84, "reason": "SIGNED"}, {"base": "KMNO", "market_cap_rank": 85, "reason": "SIGNED"}, {"base": "WIF", "market_cap_rank": 86, "reason": "SIGNED"}, {"base": "EIGEN", "market_cap_rank": 87, "reason": "SIGNED"}, {"base": "COMP", "market_cap_rank": 88, "reason": "SIGNED"}, {"base": "IOTA", "market_cap_rank": 89, "reason": "SIGNED"}, {"base": "THETA", "market_cap_rank": 90, "reason": "SIGNED"}, {"base": "ZAMA", "market_cap_rank": 91, "reason": "SIGNED"}, {"base": "AXS", "market_cap_rank": 92, "reason": "SIGNED"}, {"base": "EDGE", "market_cap_rank": 93, "reason": "SIGNED"}, {"base": "MET", "market_cap_rank": 94, "reason": "SIGNED"}, {"base": "FARTCOIN", "market_cap_rank": 95, "reason": "SIGNED"}, {"base": "CVX", "market_cap_rank": 96, "reason": "SIGNED"}, {"base": "NEO", "market_cap_rank": 97, "reason": "SIGNED"}, {"base": "MINA", "market_cap_rank": 98, "reason": "SIGNED"}, {"base": "MANA", "market_cap_rank": 99, "reason": "SIGNED"}, {"base": "CHZ", "market_cap_rank": 100, "reason": "SIGNED"}, {"base": "A", "market_cap_rank": 101, "reason": "SIGNED"}, {"base": "SENT", "market_cap_rank": 102, "reason": "SIGNED"}, {"base": "S", "market_cap_rank": 103, "reason": "SIGNED"}, {"base": "APE", "market_cap_rank": 104, "reason": "SIGNED"}, {"base": "SNX", "market_cap_rank": 105, "reason": "SIGNED"}, {"base": "IMX", "market_cap_rank": 106, "reason": "SIGNED"}, {"base": "H", "market_cap_rank": 107, "reason": "SIGNED"}, {"base": "1INCH", "market_cap_rank": 108, "reason": "SIGNED"}, {"base": "EGLD", "market_cap_rank": 109, "reason": "SIGNED"}, {"base": "BAT", "market_cap_rank": 110, "reason": "SIGNED"}, {"base": "ZK", "market_cap_rank": 111, "reason": "SIGNED"}, {"base": "ZEN", "market_cap_rank": 112, "reason": "SIGNED"}, {"base": "SAND", "market_cap_rank": 113, "reason": "SIGNED"}, {"base": "ATH", "market_cap_rank": 114, "reason": "SIGNED"}, {"base": "GLM", "market_cap_rank": 115, "reason": "SIGNED"}, {"base": "PLUME", "market_cap_rank": 116, "reason": "SIGNED"}, {"base": "DYDX", "market_cap_rank": 117, "reason": "SIGNED"}, {"base": "RSR", "market_cap_rank": 118, "reason": "SIGNED"}, {"base": "QTUM", "market_cap_rank": 119, "reason": "SIGNED"}, {"base": "GALA", "market_cap_rank": 120, "reason": "SIGNED"}, {"base": "ZRX", "market_cap_rank": 121, "reason": "SIGNED"}, {"base": "GAS", "market_cap_rank": 122, "reason": "SIGNED"}, {"base": "ORDI", "market_cap_rank": 123, "reason": "SIGNED"}, {"base": "ARKM", "market_cap_rank": 124, "reason": "SIGNED"}, {"base": "CHIP", "market_cap_rank": 125, "reason": "SIGNED"}, {"base": "WAL", "market_cap_rank": 126, "reason": "SIGNED"}, {"base": "YFI", "market_cap_rank": 127, "reason": "SIGNED"}, {"base": "KSM", "market_cap_rank": 128, "reason": "SIGNED"}, {"base": "KAITO", "market_cap_rank": 129, "reason": "SIGNED"}, {"base": "ZETA", "market_cap_rank": 130, "reason": "SIGNED"}, {"base": "LPT", "market_cap_rank": 131, "reason": "SIGNED"}, {"base": "O", "market_cap_rank": 132, "reason": "SIGNED"}, {"base": "GMX", "market_cap_rank": 133, "reason": "SIGNED"}, {"base": "W", "market_cap_rank": 134, "reason": "SIGNED"}, {"base": "SPK", "market_cap_rank": 135, "reason": "SIGNED"}, {"base": "BERA", "market_cap_rank": 136, "reason": "SIGNED"}, {"base": "CAP", "market_cap_rank": 137, "reason": "SIGNED"}, {"base": "ONE", "market_cap_rank": 138, "reason": "SIGNED"}, {"base": "RE", "market_cap_rank": 139, "reason": "SIGNED"}, {"base": "SUSHI", "market_cap_rank": 140, "reason": "SIGNED"}, {"base": "ZIL", "market_cap_rank": 141, "reason": "SIGNED"}, {"base": "TURBO", "market_cap_rank": 142, "reason": "SIGNED"}, {"base": "ALLO", "market_cap_rank": 143, "reason": "SIGNED"}, {"base": "BOME", "market_cap_rank": 144, "reason": "SIGNED"}, {"base": "SOON", "market_cap_rank": 145, "reason": "SIGNED"}, {"base": "LINEA", "market_cap_rank": 146, "reason": "SIGNED"}, {"base": "GPS", "market_cap_rank": 147, "reason": "SIGNED"}, {"base": "BIO", "market_cap_rank": 148, "reason": "SIGNED"}, {"base": "ESP", "market_cap_rank": 149, "reason": "SIGNED"}, {"base": "NMR", "market_cap_rank": 150, "reason": "SIGNED"}, {"base": "JELLYJELLY", "market_cap_rank": 151, "reason": "SIGNED"}, {"base": "BABY", "market_cap_rank": 152, "reason": "SIGNED"}, {"base": "ENJ", "market_cap_rank": 153, "reason": "SIGNED"}, {"base": "BLUR", "market_cap_rank": 154, "reason": "SIGNED"}, {"base": "COAI", "market_cap_rank": 155, "reason": "SIGNED"}, {"base": "ONT", "market_cap_rank": 156, "reason": "SIGNED"}, {"base": "MERL", "market_cap_rank": 157, "reason": "SIGNED"}, {"base": "CELO", "market_cap_rank": 158, "reason": "SIGNED"}, {"base": "BRETT", "market_cap_rank": 159, "reason": "SIGNED"}, {"base": "0G", "market_cap_rank": 160, "reason": "SIGNED"}, {"base": "POPCAT", "market_cap_rank": 161, "reason": "SIGNED"}, {"base": "TRB", "market_cap_rank": 162, "reason": "SIGNED"}, {"base": "PNUT", "market_cap_rank": 163, "reason": "SIGNED"}, {"base": "MUBARAK", "market_cap_rank": 164, "reason": "SIGNED"}, {"base": "RAVE", "market_cap_rank": 165, "reason": "SIGNED"}, {"base": "FLOW", "market_cap_rank": 166, "reason": "SIGNED"}, {"base": "ACU", "market_cap_rank": 167, "reason": "SIGNED"}, {"base": "BARD", "market_cap_rank": 168, "reason": "SIGNED"}, {"base": "MEME", "market_cap_rank": 169, "reason": "SIGNED"}, {"base": "MEGA", "market_cap_rank": 170, "reason": "SIGNED"}, {"base": "NOT", "market_cap_rank": 171, "reason": "SIGNED"}, {"base": "AZTEC", "market_cap_rank": 172, "reason": "SIGNED"}, {"base": "ARX", "market_cap_rank": 173, "reason": "SIGNED"}, {"base": "ME", "market_cap_rank": 174, "reason": "SIGNED"}, {"base": "MOODENG", "market_cap_rank": 175, "reason": "SIGNED"}, {"base": "MASK", "market_cap_rank": 176, "reason": "SIGNED"}, {"base": "PROVE", "market_cap_rank": 177, "reason": "SIGNED"}, {"base": "PEOPLE", "market_cap_rank": 178, "reason": "SIGNED"}, {"base": "SSV", "market_cap_rank": 179, "reason": "SIGNED"}, {"base": "LAB", "market_cap_rank": 180, "reason": "SIGNED"}, {"base": "HUMA", "market_cap_rank": 181, "reason": "SIGNED"}, {"base": "AVNT", "market_cap_rank": 182, "reason": "SIGNED"}, {"base": "MEW", "market_cap_rank": 183, "reason": "SIGNED"}, {"base": "DOS", "market_cap_rank": 184, "reason": "SIGNED"}, {"base": "MOVE", "market_cap_rank": 185, "reason": "SIGNED"}, {"base": "API3", "market_cap_rank": 186, "reason": "SIGNED"}, {"base": "SAHARA", "market_cap_rank": 187, "reason": "SIGNED"}, {"base": "BAND", "market_cap_rank": 188, "reason": "SIGNED"}, {"base": "APR", "market_cap_rank": 189, "reason": "SIGNED"}, {"base": "ZORA", "market_cap_rank": 190, "reason": "SIGNED"}, {"base": "GIGGLE", "market_cap_rank": 191, "reason": "SIGNED"}, {"base": "RVN", "market_cap_rank": 192, "reason": "SIGNED"}, {"base": "NEIRO", "market_cap_rank": 193, "reason": "SIGNED"}, {"base": "UMA", "market_cap_rank": 194, "reason": "SIGNED"}, {"base": "SIGN", "market_cap_rank": 195, "reason": "SIGNED"}, {"base": "VANA", "market_cap_rank": 196, "reason": "SIGNED"}, {"base": "BEAT", "market_cap_rank": 197, "reason": "SIGNED"}, {"base": "AT", "market_cap_rank": 198, "reason": "SIGNED"}, {"base": "MMT", "market_cap_rank": 199, "reason": "SIGNED"}, {"base": "IOST", "market_cap_rank": 200, "reason": "SIGNED"}, {"base": "IRYS", "market_cap_rank": 201, "reason": "SIGNED"}, {"base": "FOGO", "market_cap_rank": 202, "reason": "SIGNED"}, {"base": "ETHW", "market_cap_rank": 203, "reason": "SIGNED"}, {"base": "KGEN", "market_cap_rank": 204, "reason": "SIGNED"}, {"base": "BILL", "market_cap_rank": 205, "reason": "SIGNED"}, {"base": "OPG", "market_cap_rank": 206, "reason": "SIGNED"}, {"base": "SPACE", "market_cap_rank": 207, "reason": "SIGNED"}, {"base": "ZBT", "market_cap_rank": 208, "reason": "SIGNED"}, {"base": "AUCTION", "market_cap_rank": 209, "reason": "SIGNED"}, {"base": "HOME", "market_cap_rank": 210, "reason": "SIGNED"}, {"base": "TRUTH", "market_cap_rank": 211, "reason": "SIGNED"}, {"base": "GMT", "market_cap_rank": 212, "reason": "SIGNED"}, {"base": "METIS", "market_cap_rank": 213, "reason": "SIGNED"}, {"base": "EDEN", "market_cap_rank": 214, "reason": "SIGNED"}, {"base": "BSB", "market_cap_rank": 215, "reason": "SIGNED"}, {"base": "SATS", "market_cap_rank": 216, "reason": "SIGNED"}, {"base": "BIGTIME", "market_cap_rank": 217, "reason": "SIGNED"}, {"base": "WOO", "market_cap_rank": 218, "reason": "SIGNED"}, {"base": "YGG", "market_cap_rank": 219, "reason": "SIGNED"}, {"base": "AEVO", "market_cap_rank": 220, "reason": "SIGNED"}, {"base": "RIVER", "market_cap_rank": 221, "reason": "SIGNED"}, {"base": "AIXBT", "market_cap_rank": 222, "reason": "SIGNED"}, {"base": "GRVT", "market_cap_rank": 223, "reason": "SIGNED"}, {"base": "LQTY", "market_cap_rank": 224, "reason": "SIGNED"}, {"base": "BREV", "market_cap_rank": 225, "reason": "SIGNED"}, {"base": "YB", "market_cap_rank": 226, "reason": "SIGNED"}, {"base": "BICO", "market_cap_rank": 227, "reason": "SIGNED"}, {"base": "ROBO", "market_cap_rank": 228, "reason": "SIGNED"}, {"base": "ENSO", "market_cap_rank": 229, "reason": "SIGNED"}, {"base": "AGLD", "market_cap_rank": 230, "reason": "SIGNED"}, {"base": "WCT", "market_cap_rank": 231, "reason": "SIGNED"}, {"base": "INIT", "market_cap_rank": 232, "reason": "SIGNED"}, {"base": "ON", "market_cap_rank": 233, "reason": "SIGNED"}, {"base": "PIPPIN", "market_cap_rank": 234, "reason": "SIGNED"}, {"base": "ANIME", "market_cap_rank": 235, "reason": "SIGNED"}, {"base": "SAPIEN", "market_cap_rank": 236, "reason": "SIGNED"}, {"base": "F", "market_cap_rank": 237, "reason": "SIGNED"}, {"base": "SOPH", "market_cap_rank": 238, "reason": "SIGNED"}, {"base": "MAGIC", "market_cap_rank": 239, "reason": "SIGNED"}, {"base": "LAYER", "market_cap_rank": 240, "reason": "SIGNED"}, {"base": "ORDER", "market_cap_rank": 241, "reason": "SIGNED"}, {"base": "SLX", "market_cap_rank": 242, "reason": "SIGNED"}, {"base": "KAT", "market_cap_rank": 243, "reason": "SIGNED"}, {"base": "BASED", "market_cap_rank": 244, "reason": "SIGNED"}, {"base": "WET", "market_cap_rank": 245, "reason": "SIGNED"}, {"base": "DOOD", "market_cap_rank": 246, "reason": "SIGNED"}, {"base": "LA", "market_cap_rank": 247, "reason": "SIGNED"}, {"base": "RECALL", "market_cap_rank": 248, "reason": "SIGNED"}, {"base": "TRUST", "market_cap_rank": 249, "reason": "SIGNED"}, {"base": "HMSTR", "market_cap_rank": 250, "reason": "SIGNED"}, {"base": "ACT", "market_cap_rank": 251, "reason": "SIGNED"}, {"base": "ZKP", "market_cap_rank": 252, "reason": "SIGNED"}, {"base": "RESOLV", "market_cap_rank": 253, "reason": "SIGNED"}, {"base": "OPN", "market_cap_rank": 254, "reason": "SIGNED"}, {"base": "TRIA", "market_cap_rank": 255, "reason": "SIGNED"}], "effective_date": "2026-09-26", "members": 255, "membership_sha256": "078100d9ceb22469c7af513bc49fd0a9ac73a793965e2eb4bb7872105be21c2c", "removed": [], "revision": 1, "sources_sha256": {"binance_exchange_info": "c63a386b54d674cae0b376d821b0967d921e60d2abef43c706566ca00fee17b6", "coingecko_markets": "5e2db4a8c0b234644b1705a1af1c68a8ddb7ecc5dbcabb6ffb9deaa72c64dc91", "okx_swap_instruments": "9ba6abcda0b51fff7406d55a4d86e4ac23aa4cbcc7fa8138e4cdc124e327eace"}}
diff --git a/config/v2/universes/crypto-top300-1d.json b/config/v2/universes/crypto-top300-1d.json
new file mode 100644
index 00000000..cfeaa6b8
--- /dev/null
+++ b/config/v2/universes/crypto-top300-1d.json
@@ -0,0 +1,2856 @@
+{
+ "effective_date": "2026-09-26",
+ "members": [
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BTC",
+ "binance_listed_ms": 1567965300000,
+ "binance_symbol": "BTCUSDT",
+ "coingecko_id": "bitcoin",
+ "market_cap_rank": 1,
+ "market_cap_usd": 1689493105455,
+ "okx_inst_id": "BTC-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ETH",
+ "binance_listed_ms": 1574840700000,
+ "binance_symbol": "ETHUSDT",
+ "coingecko_id": "ethereum",
+ "market_cap_rank": 2,
+ "market_cap_usd": 328026330321,
+ "okx_inst_id": "ETH-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BNB",
+ "binance_listed_ms": 1581321600000,
+ "binance_symbol": "BNBUSDT",
+ "coingecko_id": "binancecoin",
+ "market_cap_rank": 3,
+ "market_cap_usd": 102826370489,
+ "okx_inst_id": "BNB-USDT-SWAP",
+ "okx_listed_ms": 1671778428049
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "XRP",
+ "binance_listed_ms": 1578298800000,
+ "binance_symbol": "XRPUSDT",
+ "coingecko_id": "ripple",
+ "market_cap_rank": 4,
+ "market_cap_usd": 97168141264,
+ "okx_inst_id": "XRP-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SOL",
+ "binance_listed_ms": 1600066800000,
+ "binance_symbol": "SOLUSDT",
+ "coingecko_id": "solana",
+ "market_cap_rank": 5,
+ "market_cap_usd": 70665331702,
+ "okx_inst_id": "SOL-USDT-SWAP",
+ "okx_listed_ms": 1611298800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TRX",
+ "binance_listed_ms": 1579075500000,
+ "binance_symbol": "TRXUSDT",
+ "coingecko_id": "tron",
+ "market_cap_rank": 6,
+ "market_cap_usd": 31978247026,
+ "okx_inst_id": "TRX-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZEC",
+ "binance_listed_ms": 1580889600000,
+ "binance_symbol": "ZECUSDT",
+ "coingecko_id": "zcash",
+ "market_cap_rank": 7,
+ "market_cap_usd": 25913262065,
+ "okx_inst_id": "ZEC-USDT-SWAP",
+ "okx_listed_ms": 1762398900578
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "HYPE",
+ "binance_listed_ms": 1748601000000,
+ "binance_symbol": "HYPEUSDT",
+ "coingecko_id": "hyperliquid",
+ "market_cap_rank": 8,
+ "market_cap_usd": 20434367761,
+ "okx_inst_id": "HYPE-USDT-SWAP",
+ "okx_listed_ms": 1740121200506
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "DOGE",
+ "binance_listed_ms": 1594371600000,
+ "binance_symbol": "DOGEUSDT",
+ "coingecko_id": "dogecoin",
+ "market_cap_rank": 9,
+ "market_cap_usd": 15229137797,
+ "okx_inst_id": "DOGE-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LINK",
+ "binance_listed_ms": 1579248000000,
+ "binance_symbol": "LINKUSDT",
+ "coingecko_id": "chainlink",
+ "market_cap_rank": 10,
+ "market_cap_usd": 10535944495,
+ "okx_inst_id": "LINK-USDT-SWAP",
+ "okx_listed_ms": 1582888608000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ADA",
+ "binance_listed_ms": 1580457600000,
+ "binance_symbol": "ADAUSDT",
+ "coingecko_id": "cardano",
+ "market_cap_rank": 11,
+ "market_cap_usd": 9602110763,
+ "okx_inst_id": "ADA-USDT-SWAP",
+ "okx_listed_ms": 1582888608000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "XLM",
+ "binance_listed_ms": 1579507200000,
+ "binance_symbol": "XLMUSDT",
+ "coingecko_id": "stellar",
+ "market_cap_rank": 12,
+ "market_cap_usd": 7615402229,
+ "okx_inst_id": "XLM-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BCH",
+ "binance_listed_ms": 1576745700000,
+ "binance_symbol": "BCHUSDT",
+ "coingecko_id": "bitcoin-cash",
+ "market_cap_rank": 13,
+ "market_cap_usd": 6785872654,
+ "okx_inst_id": "BCH-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "NEAR",
+ "binance_listed_ms": 1602748800000,
+ "binance_symbol": "NEARUSDT",
+ "coingecko_id": "near",
+ "market_cap_rank": 14,
+ "market_cap_usd": 6400106691,
+ "okx_inst_id": "NEAR-USDT-SWAP",
+ "okx_listed_ms": 1608544800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "UNI",
+ "binance_listed_ms": 1600412400000,
+ "binance_symbol": "UNIUSDT",
+ "coingecko_id": "uniswap",
+ "market_cap_rank": 15,
+ "market_cap_usd": 5992936126,
+ "okx_inst_id": "UNI-USDT-SWAP",
+ "okx_listed_ms": 1600317000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LTC",
+ "binance_listed_ms": 1578557100000,
+ "binance_symbol": "LTCUSDT",
+ "coingecko_id": "litecoin",
+ "market_cap_rank": 16,
+ "market_cap_usd": 5793375256,
+ "okx_inst_id": "LTC-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CC",
+ "binance_listed_ms": 1761912000000,
+ "binance_symbol": "CCUSDT",
+ "coingecko_id": "canton-network",
+ "market_cap_rank": 17,
+ "market_cap_usd": 5393159738,
+ "okx_inst_id": "CC-USDT-SWAP",
+ "okx_listed_ms": 1761919200291
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SUI",
+ "binance_listed_ms": 1683072000000,
+ "binance_symbol": "SUIUSDT",
+ "coingecko_id": "sui",
+ "market_cap_rank": 18,
+ "market_cap_usd": 4804927992,
+ "okx_inst_id": "SUI-USDT-SWAP",
+ "okx_listed_ms": 1683258900891
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AVAX",
+ "binance_listed_ms": 1600844400000,
+ "binance_symbol": "AVAXUSDT",
+ "coingecko_id": "avalanche-2",
+ "market_cap_rank": 19,
+ "market_cap_usd": 4735988058,
+ "okx_inst_id": "AVAX-USDT-SWAP",
+ "okx_listed_ms": 1600840800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "HBAR",
+ "binance_listed_ms": 1615964400000,
+ "binance_symbol": "HBARUSDT",
+ "coingecko_id": "hedera-hashgraph",
+ "market_cap_rank": 20,
+ "market_cap_usd": 4135666526,
+ "okx_inst_id": "HBAR-USDT-SWAP",
+ "okx_listed_ms": 1692165300823
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GRAM",
+ "binance_listed_ms": 1782979200000,
+ "binance_symbol": "GRAMUSDT",
+ "coingecko_id": "the-open-network",
+ "market_cap_rank": 21,
+ "market_cap_usd": 4075525743,
+ "okx_inst_id": "GRAM-USDT-SWAP",
+ "okx_listed_ms": 1781692200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TAO",
+ "binance_listed_ms": 1712845800000,
+ "binance_symbol": "TAOUSDT",
+ "coingecko_id": "bittensor",
+ "market_cap_rank": 22,
+ "market_cap_usd": 3591633567,
+ "okx_inst_id": "TAO-USDT-SWAP",
+ "okx_listed_ms": 1726808400182
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SHIB",
+ "binance_listed_ms": 1620630000000,
+ "binance_symbol": "1000SHIBUSDT",
+ "coingecko_id": "shiba-inu",
+ "market_cap_rank": 23,
+ "market_cap_usd": 3483668545,
+ "okx_inst_id": "SHIB-USDT-SWAP",
+ "okx_listed_ms": 1620550800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ENA",
+ "binance_listed_ms": 1712061000000,
+ "binance_symbol": "ENAUSDT",
+ "coingecko_id": "ethena",
+ "market_cap_rank": 24,
+ "market_cap_usd": 2837933123,
+ "okx_inst_id": "ENA-USDT-SWAP",
+ "okx_listed_ms": 1758094200364
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ONDO",
+ "binance_listed_ms": 1705755600000,
+ "binance_symbol": "ONDOUSDT",
+ "coingecko_id": "ondo-finance",
+ "market_cap_rank": 25,
+ "market_cap_usd": 2701197114,
+ "okx_inst_id": "ONDO-USDT-SWAP",
+ "okx_listed_ms": 1722940203957
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AAVE",
+ "binance_listed_ms": 1602831600000,
+ "binance_symbol": "AAVEUSDT",
+ "coingecko_id": "aave",
+ "market_cap_rank": 26,
+ "market_cap_usd": 2365511615,
+ "okx_inst_id": "AAVE-USDT-SWAP",
+ "okx_listed_ms": 1607580000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PUMP",
+ "binance_listed_ms": 1752132600000,
+ "binance_symbol": "PUMPUSDT",
+ "coingecko_id": "pump-fun",
+ "market_cap_rank": 27,
+ "market_cap_usd": 2083019455,
+ "okx_inst_id": "PUMP-USDT-SWAP",
+ "okx_listed_ms": 1752514200381
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "DOT",
+ "binance_listed_ms": 1598079600000,
+ "binance_symbol": "DOTUSDT",
+ "coingecko_id": "polkadot",
+ "market_cap_rank": 28,
+ "market_cap_usd": 2072693619,
+ "okx_inst_id": "DOT-USDT-SWAP",
+ "okx_listed_ms": 1598350371000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ASTER",
+ "binance_listed_ms": 1758283200000,
+ "binance_symbol": "ASTERUSDT",
+ "coingecko_id": "aster-2",
+ "market_cap_rank": 29,
+ "market_cap_usd": 1986438075,
+ "okx_inst_id": "ASTER-USDT-SWAP",
+ "okx_listed_ms": 1758517200313
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MORPHO",
+ "binance_listed_ms": 1732717800000,
+ "binance_symbol": "MORPHOUSDT",
+ "coingecko_id": "morpho",
+ "market_cap_rank": 30,
+ "market_cap_usd": 1890797103,
+ "okx_inst_id": "MORPHO-USDT-SWAP",
+ "okx_listed_ms": 1732528800980
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WLFI",
+ "binance_listed_ms": 1755937800000,
+ "binance_symbol": "WLFIUSDT",
+ "coingecko_id": "world-liberty-financial",
+ "market_cap_rank": 31,
+ "market_cap_usd": 1862302311,
+ "okx_inst_id": "WLFI-USDT-SWAP",
+ "okx_listed_ms": 1755954000424
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PEPE",
+ "binance_listed_ms": 1683244800000,
+ "binance_symbol": "1000PEPEUSDT",
+ "coingecko_id": "pepe",
+ "market_cap_rank": 32,
+ "market_cap_usd": 1857296377,
+ "okx_inst_id": "PEPE-USDT-SWAP",
+ "okx_listed_ms": 1683086101049
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SKY",
+ "binance_listed_ms": 1757401200000,
+ "binance_symbol": "SKYUSDT",
+ "coingecko_id": "sky",
+ "market_cap_rank": 33,
+ "market_cap_usd": 1851197071,
+ "okx_inst_id": "SKY-USDT-SWAP",
+ "okx_listed_ms": 1757590200404
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WLD",
+ "binance_listed_ms": 1690200000000,
+ "binance_symbol": "WLDUSDT",
+ "coingecko_id": "worldcoin-wld",
+ "market_cap_rank": 34,
+ "market_cap_usd": 1791022810,
+ "okx_inst_id": "WLD-USDT-SWAP",
+ "okx_listed_ms": 1690199721595
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ICP",
+ "binance_listed_ms": 1627628400000,
+ "binance_symbol": "ICPUSDT",
+ "coingecko_id": "internet-computer",
+ "market_cap_rank": 35,
+ "market_cap_usd": 1784247655,
+ "okx_inst_id": "ICP-USDT-SWAP",
+ "okx_listed_ms": 1620982800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "QNT",
+ "binance_listed_ms": 1666076400000,
+ "binance_symbol": "QNTUSDT",
+ "coingecko_id": "quant-network",
+ "market_cap_rank": 36,
+ "market_cap_usd": 1593614912,
+ "okx_inst_id": "QNT-USDT-SWAP",
+ "okx_listed_ms": 1780655400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ARB",
+ "binance_listed_ms": 1679554800000,
+ "binance_symbol": "ARBUSDT",
+ "coingecko_id": "arbitrum",
+ "market_cap_rank": 37,
+ "market_cap_usd": 1502497034,
+ "okx_inst_id": "ARB-USDT-SWAP",
+ "okx_listed_ms": 1679580094937
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ETC",
+ "binance_listed_ms": 1579161600000,
+ "binance_symbol": "ETCUSDT",
+ "coingecko_id": "ethereum-classic",
+ "market_cap_rank": 38,
+ "market_cap_usd": 1497160815,
+ "okx_inst_id": "ETC-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "VVV",
+ "binance_listed_ms": 1738138500000,
+ "binance_symbol": "VVVUSDT",
+ "coingecko_id": "venice-token",
+ "market_cap_rank": 39,
+ "market_cap_usd": 1428717014,
+ "okx_inst_id": "VVV-USDT-SWAP",
+ "okx_listed_ms": 1783058400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "POL",
+ "binance_listed_ms": 1726229700000,
+ "binance_symbol": "POLUSDT",
+ "coingecko_id": "polygon-ecosystem-token",
+ "market_cap_rank": 40,
+ "market_cap_usd": 1265139151,
+ "okx_inst_id": "POL-USDT-SWAP",
+ "okx_listed_ms": 1727166600128
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LIT",
+ "binance_listed_ms": 1766511000000,
+ "binance_symbol": "LITUSDT",
+ "coingecko_id": "lighter",
+ "market_cap_rank": 41,
+ "market_cap_usd": 1193959483,
+ "okx_inst_id": "LIT-USDT-SWAP",
+ "okx_listed_ms": 1766547000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "JUP",
+ "binance_listed_ms": 1706725800000,
+ "binance_symbol": "JUPUSDT",
+ "coingecko_id": "jupiter-exchange-solana",
+ "market_cap_rank": 42,
+ "market_cap_usd": 1150327903,
+ "okx_inst_id": "JUP-USDT-SWAP",
+ "okx_listed_ms": 1706717100211
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ALGO",
+ "binance_listed_ms": 1592298000000,
+ "binance_symbol": "ALGOUSDT",
+ "coingecko_id": "algorand",
+ "market_cap_rank": 43,
+ "market_cap_usd": 1052468674,
+ "okx_inst_id": "ALGO-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RENDER",
+ "binance_listed_ms": 1721988000000,
+ "binance_symbol": "RENDERUSDT",
+ "coingecko_id": "render-token",
+ "market_cap_rank": 44,
+ "market_cap_usd": 1047547759,
+ "okx_inst_id": "RENDER-USDT-SWAP",
+ "okx_listed_ms": 1723105800136
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ATOM",
+ "binance_listed_ms": 1581077400000,
+ "binance_symbol": "ATOMUSDT",
+ "coingecko_id": "cosmos",
+ "market_cap_rank": 45,
+ "market_cap_usd": 974922658,
+ "okx_inst_id": "ATOM-USDT-SWAP",
+ "okx_listed_ms": 1573557408000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AERO",
+ "binance_listed_ms": 1733321700000,
+ "binance_symbol": "AEROUSDT",
+ "coingecko_id": "aerodrome-finance",
+ "market_cap_rank": 46,
+ "market_cap_usd": 906687173,
+ "okx_inst_id": "AERO-USDT-SWAP",
+ "okx_listed_ms": 1751523300260
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "FIL",
+ "binance_listed_ms": 1602828000000,
+ "binance_symbol": "FILUSDT",
+ "coingecko_id": "filecoin",
+ "market_cap_rank": 47,
+ "market_cap_usd": 902023683,
+ "okx_inst_id": "FIL-USDT-SWAP",
+ "okx_listed_ms": 1565431971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "DASH",
+ "binance_listed_ms": 1580803500000,
+ "binance_symbol": "DASHUSDT",
+ "coingecko_id": "dash",
+ "market_cap_rank": 48,
+ "market_cap_usd": 818751906,
+ "okx_inst_id": "DASH-USDT-SWAP",
+ "okx_listed_ms": 1762398000994
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "INJ",
+ "binance_listed_ms": 1660633200000,
+ "binance_symbol": "INJUSDT",
+ "coingecko_id": "injective-protocol",
+ "market_cap_rank": 49,
+ "market_cap_usd": 781420186,
+ "okx_inst_id": "INJ-USDT-SWAP",
+ "okx_listed_ms": 1701345300667
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "APT",
+ "binance_listed_ms": 1666076400000,
+ "binance_symbol": "APTUSDT",
+ "coingecko_id": "aptos",
+ "market_cap_rank": 50,
+ "market_cap_usd": 741223937,
+ "okx_inst_id": "APT-USDT-SWAP",
+ "okx_listed_ms": 1666142328522
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "STABLE",
+ "binance_listed_ms": 1762430400000,
+ "binance_symbol": "STABLEUSDT",
+ "coingecko_id": "stable-2",
+ "market_cap_rank": 51,
+ "market_cap_usd": 700816249,
+ "okx_inst_id": "STABLE-USDT-SWAP",
+ "okx_listed_ms": 1765200600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ETHFI",
+ "binance_listed_ms": 1710775800000,
+ "binance_symbol": "ETHFIUSDT",
+ "coingecko_id": "ether-fi",
+ "market_cap_rank": 52,
+ "market_cap_usd": 694566008,
+ "okx_inst_id": "ETHFI-USDT-SWAP",
+ "okx_listed_ms": 1710764700945
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "STX",
+ "binance_listed_ms": 1676876400000,
+ "binance_symbol": "STXUSDT",
+ "coingecko_id": "blockstack",
+ "market_cap_rank": 53,
+ "market_cap_usd": 644635818,
+ "okx_inst_id": "STX-USDT-SWAP",
+ "okx_listed_ms": 1676969758164
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PENGU",
+ "binance_listed_ms": 1734452100000,
+ "binance_symbol": "PENGUUSDT",
+ "coingecko_id": "pudgy-penguins",
+ "market_cap_rank": 54,
+ "market_cap_usd": 634566684,
+ "okx_inst_id": "PENGU-USDT-SWAP",
+ "okx_listed_ms": 1734450902264
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TRUMP",
+ "binance_listed_ms": 1737205200000,
+ "binance_symbol": "TRUMPUSDT",
+ "coingecko_id": "official-trump",
+ "market_cap_rank": 55,
+ "market_cap_usd": 598967475,
+ "okx_inst_id": "TRUMP-USDT-SWAP",
+ "okx_listed_ms": 1737264604112
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PYTH",
+ "binance_listed_ms": 1700663400000,
+ "binance_symbol": "PYTHUSDT",
+ "coingecko_id": "pyth-network",
+ "market_cap_rank": 56,
+ "market_cap_usd": 591694759,
+ "okx_inst_id": "PYTH-USDT-SWAP",
+ "okx_listed_ms": 1700492100712
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZRO",
+ "binance_listed_ms": 1718893800000,
+ "binance_symbol": "ZROUSDT",
+ "coingecko_id": "layerzero",
+ "market_cap_rank": 57,
+ "market_cap_usd": 548720345,
+ "okx_inst_id": "ZRO-USDT-SWAP",
+ "okx_listed_ms": 1718886300653
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CRV",
+ "binance_listed_ms": 1598943600000,
+ "binance_symbol": "CRVUSDT",
+ "coingecko_id": "curve-dao-token",
+ "market_cap_rank": 58,
+ "market_cap_usd": 546114250,
+ "okx_inst_id": "CRV-USDT-SWAP",
+ "okx_listed_ms": 1599214371000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "XPL",
+ "binance_listed_ms": 1755855000000,
+ "binance_symbol": "XPLUSDT",
+ "coingecko_id": "plasma",
+ "market_cap_rank": 59,
+ "market_cap_usd": 534359078,
+ "okx_inst_id": "XPL-USDT-SWAP",
+ "okx_listed_ms": 1756378800384
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "VIRTUAL",
+ "binance_listed_ms": 1733833800000,
+ "binance_symbol": "VIRTUALUSDT",
+ "coingecko_id": "virtual-protocol",
+ "market_cap_rank": 60,
+ "market_cap_usd": 515851134,
+ "okx_inst_id": "VIRTUAL-USDT-SWAP",
+ "okx_listed_ms": 1733911200140
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SEI",
+ "binance_listed_ms": 1692239400000,
+ "binance_symbol": "SEIUSDT",
+ "coingecko_id": "sei-network",
+ "market_cap_rank": 61,
+ "market_cap_usd": 492749438,
+ "okx_inst_id": "SEI-USDT-SWAP",
+ "okx_listed_ms": 1763105401238
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TIA",
+ "binance_listed_ms": 1698769800000,
+ "binance_symbol": "TIAUSDT",
+ "coingecko_id": "celestia",
+ "market_cap_rank": 62,
+ "market_cap_usd": 475517898,
+ "okx_inst_id": "TIA-USDT-SWAP",
+ "okx_listed_ms": 1698776700675
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PENDLE",
+ "binance_listed_ms": 1690511400000,
+ "binance_symbol": "PENDLEUSDT",
+ "coingecko_id": "pendle",
+ "market_cap_rank": 63,
+ "market_cap_usd": 440207328,
+ "okx_inst_id": "PENDLE-USDT-SWAP",
+ "okx_listed_ms": 1758093984811
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PIEVERSE",
+ "binance_listed_ms": 1763119800000,
+ "binance_symbol": "PIEVERSEUSDT",
+ "coingecko_id": "pieverse",
+ "market_cap_rank": 64,
+ "market_cap_usd": 427203919,
+ "okx_inst_id": "PIEVERSE-USDT-SWAP",
+ "okx_listed_ms": 1763263801177
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "SPX",
+ "binance_listed_ms": 1733834700000,
+ "binance_symbol": "SPXUSDT",
+ "coingecko_id": "spx6900",
+ "market_cap_rank": 65,
+ "market_cap_usd": 427048457,
+ "okx_inst_id": "SPX-USDT-SWAP",
+ "okx_listed_ms": 1752728400453
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "NIGHT",
+ "binance_listed_ms": 1765364400000,
+ "binance_symbol": "NIGHTUSDT",
+ "coingecko_id": "midnight-3",
+ "market_cap_rank": 66,
+ "market_cap_usd": 419594102,
+ "okx_inst_id": "NIGHT-USDT-SWAP",
+ "okx_listed_ms": 1765279800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LDO",
+ "binance_listed_ms": 1663743600000,
+ "binance_symbol": "LDOUSDT",
+ "coingecko_id": "lido-dao",
+ "market_cap_rank": 67,
+ "market_cap_usd": 408036871,
+ "okx_inst_id": "LDO-USDT-SWAP",
+ "okx_listed_ms": 1675321369323
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "UB",
+ "binance_listed_ms": 1757673000000,
+ "binance_symbol": "UBUSDT",
+ "coingecko_id": "unibase",
+ "market_cap_rank": 68,
+ "market_cap_usd": 374130189,
+ "okx_inst_id": "UB-USDT-SWAP",
+ "okx_listed_ms": 1777383000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "XTZ",
+ "binance_listed_ms": 1580976000000,
+ "binance_symbol": "XTZUSDT",
+ "coingecko_id": "tezos",
+ "market_cap_rank": 69,
+ "market_cap_usd": 360095756,
+ "okx_inst_id": "XTZ-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GRASS",
+ "binance_listed_ms": 1731079800000,
+ "binance_symbol": "GRASSUSDT",
+ "coingecko_id": "grass",
+ "market_cap_rank": 70,
+ "market_cap_usd": 351967813,
+ "okx_inst_id": "GRASS-USDT-SWAP",
+ "okx_listed_ms": 1730125800597
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "OP",
+ "binance_listed_ms": 1654066800000,
+ "binance_symbol": "OPUSDT",
+ "coingecko_id": "optimism",
+ "market_cap_rank": 71,
+ "market_cap_usd": 332526150,
+ "okx_inst_id": "OP-USDT-SWAP",
+ "okx_listed_ms": 1654055717137
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "KITE",
+ "binance_listed_ms": 1761733800000,
+ "binance_symbol": "KITEUSDT",
+ "coingecko_id": "kite-2",
+ "market_cap_rank": 72,
+ "market_cap_usd": 322897759,
+ "okx_inst_id": "KITE-USDT-SWAP",
+ "okx_listed_ms": 1775703600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BONK",
+ "binance_listed_ms": 1700661600000,
+ "binance_symbol": "1000BONKUSDT",
+ "coingecko_id": "bonk",
+ "market_cap_rank": 73,
+ "market_cap_usd": 322620048,
+ "okx_inst_id": "BONK-USDT-SWAP",
+ "okx_listed_ms": 1704695217299
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "MON",
+ "binance_listed_ms": 1760080500000,
+ "binance_symbol": "MONUSDT",
+ "coingecko_id": "monad",
+ "market_cap_rank": 74,
+ "market_cap_usd": 313427070,
+ "okx_inst_id": "MON-USDT-SWAP",
+ "okx_listed_ms": 1760083200427
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "JTO",
+ "binance_listed_ms": 1702029600000,
+ "binance_symbol": "JTOUSDT",
+ "coingecko_id": "jito-governance-token",
+ "market_cap_rank": 75,
+ "market_cap_usd": 306972193,
+ "okx_inst_id": "JTO-USDT-SWAP",
+ "okx_listed_ms": 1704696900623
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GRT",
+ "binance_listed_ms": 1608274800000,
+ "binance_symbol": "GRTUSDT",
+ "coingecko_id": "the-graph",
+ "market_cap_rank": 76,
+ "market_cap_usd": 305476535,
+ "okx_inst_id": "GRT-USDT-SWAP",
+ "okx_listed_ms": 1608458400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AR",
+ "binance_listed_ms": 1632812400000,
+ "binance_symbol": "ARUSDT",
+ "coingecko_id": "arweave",
+ "market_cap_rank": 77,
+ "market_cap_usd": 302236016,
+ "okx_inst_id": "AR-USDT-SWAP",
+ "okx_listed_ms": 1676357700186
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "STRK",
+ "binance_listed_ms": 1708448400000,
+ "binance_symbol": "STRKUSDT",
+ "coingecko_id": "starknet",
+ "market_cap_rank": 78,
+ "market_cap_usd": 302126023,
+ "okx_inst_id": "STRK-USDT-SWAP",
+ "okx_listed_ms": 1708433700141
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ENS",
+ "binance_listed_ms": 1638169200000,
+ "binance_symbol": "ENSUSDT",
+ "coingecko_id": "ethereum-name-service",
+ "market_cap_rank": 79,
+ "market_cap_usd": 299178811,
+ "okx_inst_id": "ENS-USDT-SWAP",
+ "okx_listed_ms": 1636623946265
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CFX",
+ "binance_listed_ms": 1676790000000,
+ "binance_symbol": "CFXUSDT",
+ "coingecko_id": "conflux-token",
+ "market_cap_rank": 80,
+ "market_cap_usd": 296607770,
+ "okx_inst_id": "CFX-USDT-SWAP",
+ "okx_listed_ms": 1615539600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "USELESS",
+ "binance_listed_ms": 1755260100000,
+ "binance_symbol": "USELESSUSDT",
+ "coingecko_id": "useless-3",
+ "market_cap_rank": 81,
+ "market_cap_usd": 278685749,
+ "okx_inst_id": "USELESS-USDT-SWAP",
+ "okx_listed_ms": 1753437600380
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "FLOKI",
+ "binance_listed_ms": 1683331200000,
+ "binance_symbol": "1000FLOKIUSDT",
+ "coingecko_id": "floki",
+ "market_cap_rank": 82,
+ "market_cap_usd": 275899779,
+ "okx_inst_id": "FLOKI-USDT-SWAP",
+ "okx_listed_ms": 1676876100607
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "2Z",
+ "binance_listed_ms": 1759408200000,
+ "binance_symbol": "2ZUSDT",
+ "coingecko_id": "doublezero",
+ "market_cap_rank": 83,
+ "market_cap_usd": 264049380,
+ "okx_inst_id": "2Z-USDT-SWAP",
+ "okx_listed_ms": 1759410600649
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SYRUP",
+ "binance_listed_ms": 1746606600000,
+ "binance_symbol": "SYRUPUSDT",
+ "coingecko_id": "syrup",
+ "market_cap_rank": 84,
+ "market_cap_usd": 257740531,
+ "okx_inst_id": "SYRUP-USDT-SWAP",
+ "okx_listed_ms": 1751524200291
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "KMNO",
+ "binance_listed_ms": 1734721200000,
+ "binance_symbol": "KMNOUSDT",
+ "coingecko_id": "kamino",
+ "market_cap_rank": 85,
+ "market_cap_usd": 247037318,
+ "okx_inst_id": "KMNO-USDT-SWAP",
+ "okx_listed_ms": 1748575800335
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WIF",
+ "binance_listed_ms": 1705587300000,
+ "binance_symbol": "WIFUSDT",
+ "coingecko_id": "dogwifcoin",
+ "market_cap_rank": 86,
+ "market_cap_usd": 246502538,
+ "okx_inst_id": "WIF-USDT-SWAP",
+ "okx_listed_ms": 1713173100603
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "EIGEN",
+ "binance_listed_ms": 1727762400000,
+ "binance_symbol": "EIGENUSDT",
+ "coingecko_id": "eigenlayer",
+ "market_cap_rank": 87,
+ "market_cap_usd": 243344968,
+ "okx_inst_id": "EIGEN-USDT-SWAP",
+ "okx_listed_ms": 1727764200682
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "COMP",
+ "binance_listed_ms": 1593507600000,
+ "binance_symbol": "COMPUSDT",
+ "coingecko_id": "compound-governance-token",
+ "market_cap_rank": 88,
+ "market_cap_usd": 238789508,
+ "okx_inst_id": "COMP-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "IOTA",
+ "binance_listed_ms": 1581494400000,
+ "binance_symbol": "IOTAUSDT",
+ "coingecko_id": "iota",
+ "market_cap_rank": 89,
+ "market_cap_usd": 234749254,
+ "okx_inst_id": "IOTA-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "THETA",
+ "binance_listed_ms": 1590566400000,
+ "binance_symbol": "THETAUSDT",
+ "coingecko_id": "theta-token",
+ "market_cap_rank": 90,
+ "market_cap_usd": 231807743,
+ "okx_inst_id": "THETA-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZAMA",
+ "binance_listed_ms": 1767949200000,
+ "binance_symbol": "ZAMAUSDT",
+ "coingecko_id": "zama",
+ "market_cap_rank": 91,
+ "market_cap_usd": 222788037,
+ "okx_inst_id": "ZAMA-USDT-SWAP",
+ "okx_listed_ms": 1767969000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AXS",
+ "binance_listed_ms": 1605855600000,
+ "binance_symbol": "AXSUSDT",
+ "coingecko_id": "axie-infinity",
+ "market_cap_rank": 92,
+ "market_cap_usd": 209601480,
+ "okx_inst_id": "AXS-USDT-SWAP",
+ "okx_listed_ms": 1627462800000
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "EDGE",
+ "binance_listed_ms": 1773928800000,
+ "binance_symbol": "EDGEUSDT",
+ "coingecko_id": "edgex",
+ "market_cap_rank": 93,
+ "market_cap_usd": 207728719,
+ "okx_inst_id": "EDGE-USDT-SWAP",
+ "okx_listed_ms": 1775050200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MET",
+ "binance_listed_ms": 1760185800000,
+ "binance_symbol": "METUSDT",
+ "coingecko_id": "meteora",
+ "market_cap_rank": 94,
+ "market_cap_usd": 199811602,
+ "okx_inst_id": "MET-USDT-SWAP",
+ "okx_listed_ms": 1760084100254
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "FARTCOIN",
+ "binance_listed_ms": 1734720300000,
+ "binance_symbol": "FARTCOINUSDT",
+ "coingecko_id": "fartcoin",
+ "market_cap_rank": 95,
+ "market_cap_usd": 193056019,
+ "okx_inst_id": "FARTCOIN-USDT-SWAP",
+ "okx_listed_ms": 1734685200393
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CVX",
+ "binance_listed_ms": 1753270200000,
+ "binance_symbol": "CVXUSDT",
+ "coingecko_id": "convex-finance",
+ "market_cap_rank": 96,
+ "market_cap_usd": 192143470,
+ "okx_inst_id": "CVX-USDT-SWAP",
+ "okx_listed_ms": 1719303900750
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "NEO",
+ "binance_listed_ms": 1581929100000,
+ "binance_symbol": "NEOUSDT",
+ "coingecko_id": "neo",
+ "market_cap_rank": 97,
+ "market_cap_usd": 188916689,
+ "okx_inst_id": "NEO-USDT-SWAP",
+ "okx_listed_ms": 1582888608000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MINA",
+ "binance_listed_ms": 1675407600000,
+ "binance_symbol": "MINAUSDT",
+ "coingecko_id": "mina-protocol",
+ "market_cap_rank": 98,
+ "market_cap_usd": 181753980,
+ "okx_inst_id": "MINA-USDT-SWAP",
+ "okx_listed_ms": 1623229200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MANA",
+ "binance_listed_ms": 1615705200000,
+ "binance_symbol": "MANAUSDT",
+ "coingecko_id": "decentraland",
+ "market_cap_rank": 99,
+ "market_cap_usd": 180153740,
+ "okx_inst_id": "MANA-USDT-SWAP",
+ "okx_listed_ms": 1615539600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CHZ",
+ "binance_listed_ms": 1611212400000,
+ "binance_symbol": "CHZUSDT",
+ "coingecko_id": "chiliz",
+ "market_cap_rank": 100,
+ "market_cap_usd": 175029621,
+ "okx_inst_id": "CHZ-USDT-SWAP",
+ "okx_listed_ms": 1615539600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "A",
+ "binance_listed_ms": 1748419200000,
+ "binance_symbol": "AUSDT",
+ "coingecko_id": "vaulta",
+ "market_cap_rank": 101,
+ "market_cap_usd": 171958510,
+ "okx_inst_id": "A-USDT-SWAP",
+ "okx_listed_ms": 1748514600412
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SENT",
+ "binance_listed_ms": 1763124300000,
+ "binance_symbol": "SENTUSDT",
+ "coingecko_id": "sentient",
+ "market_cap_rank": 102,
+ "market_cap_usd": 171659471,
+ "okx_inst_id": "SENT-USDT-SWAP",
+ "okx_listed_ms": 1763132401716
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "S",
+ "binance_listed_ms": 1737021600000,
+ "binance_symbol": "SUSDT",
+ "coingecko_id": "sonic-3",
+ "market_cap_rank": 103,
+ "market_cap_usd": 160362466,
+ "okx_inst_id": "S-USDT-SWAP",
+ "okx_listed_ms": 1737450000523
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "APE",
+ "binance_listed_ms": 1647500400000,
+ "binance_symbol": "APEUSDT",
+ "coingecko_id": "apecoin",
+ "market_cap_rank": 104,
+ "market_cap_usd": 155403546,
+ "okx_inst_id": "APE-USDT-SWAP",
+ "okx_listed_ms": 1647522059555
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SNX",
+ "binance_listed_ms": 1597388400000,
+ "binance_symbol": "SNXUSDT",
+ "coingecko_id": "havven",
+ "market_cap_rank": 105,
+ "market_cap_usd": 151095185,
+ "okx_inst_id": "SNX-USDT-SWAP",
+ "okx_listed_ms": 1598004771000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "IMX",
+ "binance_listed_ms": 1644476400000,
+ "binance_symbol": "IMXUSDT",
+ "coingecko_id": "immutable-x",
+ "market_cap_rank": 106,
+ "market_cap_usd": 148384637,
+ "okx_inst_id": "IMX-USDT-SWAP",
+ "okx_listed_ms": 1637218222034
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "H",
+ "binance_listed_ms": 1750843800000,
+ "binance_symbol": "HUSDT",
+ "coingecko_id": "humanity",
+ "market_cap_rank": 107,
+ "market_cap_usd": 148063755,
+ "okx_inst_id": "H-USDT-SWAP",
+ "okx_listed_ms": 1751522400413
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "1INCH",
+ "binance_listed_ms": 1608879600000,
+ "binance_symbol": "1INCHUSDT",
+ "coingecko_id": "1inch",
+ "market_cap_rank": 108,
+ "market_cap_usd": 144560966,
+ "okx_inst_id": "1INCH-USDT-SWAP",
+ "okx_listed_ms": 1608863400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "EGLD",
+ "binance_listed_ms": 1600066800000,
+ "binance_symbol": "EGLDUSDT",
+ "coingecko_id": "elrond-erd-2",
+ "market_cap_rank": 109,
+ "market_cap_usd": 141846744,
+ "okx_inst_id": "EGLD-USDT-SWAP",
+ "okx_listed_ms": 1608620400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BAT",
+ "binance_listed_ms": 1581581100000,
+ "binance_symbol": "BATUSDT",
+ "coingecko_id": "basic-attention-token",
+ "market_cap_rank": 110,
+ "market_cap_usd": 140969380,
+ "okx_inst_id": "BAT-USDT-SWAP",
+ "okx_listed_ms": 1598609571000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZK",
+ "binance_listed_ms": 1718622000000,
+ "binance_symbol": "ZKUSDT",
+ "coingecko_id": "zksync",
+ "market_cap_rank": 111,
+ "market_cap_usd": 139594818,
+ "okx_inst_id": "ZK-USDT-SWAP",
+ "okx_listed_ms": 1718699100579
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZEN",
+ "binance_listed_ms": 1606201200000,
+ "binance_symbol": "ZENUSDT",
+ "coingecko_id": "zencash",
+ "market_cap_rank": 112,
+ "market_cap_usd": 138462928,
+ "okx_inst_id": "ZEN-USDT-SWAP",
+ "okx_listed_ms": 1762149601773
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SAND",
+ "binance_listed_ms": 1610953200000,
+ "binance_symbol": "SANDUSDT",
+ "coingecko_id": "the-sandbox",
+ "market_cap_rank": 113,
+ "market_cap_usd": 133785610,
+ "okx_inst_id": "SAND-USDT-SWAP",
+ "okx_listed_ms": 1617354000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ATH",
+ "binance_listed_ms": 1743608700000,
+ "binance_symbol": "ATHUSDT",
+ "coingecko_id": "aethir",
+ "market_cap_rank": 114,
+ "market_cap_usd": 131033244,
+ "okx_inst_id": "ATH-USDT-SWAP",
+ "okx_listed_ms": 1718250900308
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GLM",
+ "binance_listed_ms": 1708596000000,
+ "binance_symbol": "GLMUSDT",
+ "coingecko_id": "golem",
+ "market_cap_rank": 115,
+ "market_cap_usd": 129553805,
+ "okx_inst_id": "GLM-USDT-SWAP",
+ "okx_listed_ms": 1715329501418
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PLUME",
+ "binance_listed_ms": 1742562000000,
+ "binance_symbol": "PLUMEUSDT",
+ "coingecko_id": "plume",
+ "market_cap_rank": 116,
+ "market_cap_usd": 124814527,
+ "okx_inst_id": "PLUME-USDT-SWAP",
+ "okx_listed_ms": 1746689400330
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "DYDX",
+ "binance_listed_ms": 1631170800000,
+ "binance_symbol": "DYDXUSDT",
+ "coingecko_id": "dydx-chain",
+ "market_cap_rank": 117,
+ "market_cap_usd": 115096828,
+ "okx_inst_id": "DYDX-USDT-SWAP",
+ "okx_listed_ms": 1631117510421
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RSR",
+ "binance_listed_ms": 1603091100000,
+ "binance_symbol": "RSRUSDT",
+ "coingecko_id": "reserve-rights-token",
+ "market_cap_rank": 118,
+ "market_cap_usd": 112667348,
+ "okx_inst_id": "RSR-USDT-SWAP",
+ "okx_listed_ms": 1599646371000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "QTUM",
+ "binance_listed_ms": 1582185900000,
+ "binance_symbol": "QTUMUSDT",
+ "coingecko_id": "qtum",
+ "market_cap_rank": 119,
+ "market_cap_usd": 111156757,
+ "okx_inst_id": "QTUM-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GALA",
+ "binance_listed_ms": 1631862000000,
+ "binance_symbol": "GALAUSDT",
+ "coingecko_id": "gala",
+ "market_cap_rank": 120,
+ "market_cap_usd": 109754690,
+ "okx_inst_id": "GALA-USDT-SWAP",
+ "okx_listed_ms": 1632477789599
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZRX",
+ "binance_listed_ms": 1592989200000,
+ "binance_symbol": "ZRXUSDT",
+ "coingecko_id": "0x",
+ "market_cap_rank": 121,
+ "market_cap_usd": 108368804,
+ "okx_inst_id": "ZRX-USDT-SWAP",
+ "okx_listed_ms": 1598004771000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GAS",
+ "binance_listed_ms": 1698201900000,
+ "binance_symbol": "GASUSDT",
+ "coingecko_id": "gas",
+ "market_cap_rank": 122,
+ "market_cap_usd": 100660849,
+ "okx_inst_id": "GAS-USDT-SWAP",
+ "okx_listed_ms": 1698141300695
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ORDI",
+ "binance_listed_ms": 1699360200000,
+ "binance_symbol": "ORDIUSDT",
+ "coingecko_id": "ordinals",
+ "market_cap_rank": 123,
+ "market_cap_usd": 100098352,
+ "okx_inst_id": "ORDI-USDT-SWAP",
+ "okx_listed_ms": 1684662900862
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ARKM",
+ "binance_listed_ms": 1690512300000,
+ "binance_symbol": "ARKMUSDT",
+ "coingecko_id": "arkham",
+ "market_cap_rank": 124,
+ "market_cap_usd": 99192961,
+ "okx_inst_id": "ARKM-USDT-SWAP",
+ "okx_listed_ms": 1732177800122
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CHIP",
+ "binance_listed_ms": 1776323700000,
+ "binance_symbol": "CHIPUSDT",
+ "coingecko_id": "chip-2",
+ "market_cap_rank": 125,
+ "market_cap_usd": 96534778,
+ "okx_inst_id": "CHIP-USDT-SWAP",
+ "okx_listed_ms": 1776780000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WAL",
+ "binance_listed_ms": 1743089400000,
+ "binance_symbol": "WALUSDT",
+ "coingecko_id": "walrus-2",
+ "market_cap_rank": 126,
+ "market_cap_usd": 95360320,
+ "okx_inst_id": "WAL-USDT-SWAP",
+ "okx_listed_ms": 1746687600526
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "YFI",
+ "binance_listed_ms": 1598857200000,
+ "binance_symbol": "YFIUSDT",
+ "coingecko_id": "yearn-finance",
+ "market_cap_rank": 127,
+ "market_cap_usd": 89128931,
+ "okx_inst_id": "YFI-USDT-SWAP",
+ "okx_listed_ms": 1599041571000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "KSM",
+ "binance_listed_ms": 1602658800000,
+ "binance_symbol": "KSMUSDT",
+ "coingecko_id": "kusama",
+ "market_cap_rank": 128,
+ "market_cap_usd": 88936341,
+ "okx_inst_id": "KSM-USDT-SWAP",
+ "okx_listed_ms": 1599559971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "KAITO",
+ "binance_listed_ms": 1740056400000,
+ "binance_symbol": "KAITOUSDT",
+ "coingecko_id": "kaito",
+ "market_cap_rank": 129,
+ "market_cap_usd": 88380331,
+ "okx_inst_id": "KAITO-USDT-SWAP",
+ "okx_listed_ms": 1740060000331
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZETA",
+ "binance_listed_ms": 1706862600000,
+ "binance_symbol": "ZETAUSDT",
+ "coingecko_id": "zetachain",
+ "market_cap_rank": 130,
+ "market_cap_usd": 88121692,
+ "okx_inst_id": "ZETA-USDT-SWAP",
+ "okx_listed_ms": 1706757900607
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LPT",
+ "binance_listed_ms": 1636527600000,
+ "binance_symbol": "LPTUSDT",
+ "coingecko_id": "livepeer",
+ "market_cap_rank": 131,
+ "market_cap_usd": 87574695,
+ "okx_inst_id": "LPT-USDT-SWAP",
+ "okx_listed_ms": 1619161200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "O",
+ "binance_listed_ms": 1782301500000,
+ "binance_symbol": "OUSDT",
+ "coingecko_id": "o1-exchange",
+ "market_cap_rank": 132,
+ "market_cap_usd": 86303514,
+ "okx_inst_id": "O-USDT-SWAP",
+ "okx_listed_ms": 1781713800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GMX",
+ "binance_listed_ms": 1676530800000,
+ "binance_symbol": "GMXUSDT",
+ "coingecko_id": "gmx",
+ "market_cap_rank": 133,
+ "market_cap_usd": 86000973,
+ "okx_inst_id": "GMX-USDT-SWAP",
+ "okx_listed_ms": 1675321542847
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "W",
+ "binance_listed_ms": 1712158200000,
+ "binance_symbol": "WUSDT",
+ "coingecko_id": "wormhole",
+ "market_cap_rank": 134,
+ "market_cap_usd": 82073140,
+ "okx_inst_id": "W-USDT-SWAP",
+ "okx_listed_ms": 1712147100572
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SPK",
+ "binance_listed_ms": 1750150800000,
+ "binance_symbol": "SPKUSDT",
+ "coingecko_id": "spark-2",
+ "market_cap_rank": 135,
+ "market_cap_usd": 81773992,
+ "okx_inst_id": "SPK-USDT-SWAP",
+ "okx_listed_ms": 1750156200346
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BERA",
+ "binance_listed_ms": 1738854000000,
+ "binance_symbol": "BERAUSDT",
+ "coingecko_id": "berachain-bera",
+ "market_cap_rank": 136,
+ "market_cap_usd": 81170891,
+ "okx_inst_id": "BERA-USDT-SWAP",
+ "okx_listed_ms": 1738850401850
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CAP",
+ "binance_listed_ms": 1782560700000,
+ "binance_symbol": "CAPUSDT",
+ "coingecko_id": "cap-4",
+ "market_cap_rank": 137,
+ "market_cap_usd": 80027816,
+ "okx_inst_id": "CAP-USDT-SWAP",
+ "okx_listed_ms": 1782477000000
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "ONE",
+ "binance_listed_ms": 1615964400000,
+ "binance_symbol": "ONEUSDT",
+ "coingecko_id": "cross-2",
+ "market_cap_rank": 138,
+ "market_cap_usd": 77557583,
+ "okx_inst_id": "ONE-USDT-SWAP",
+ "okx_listed_ms": 1708426039038
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RE",
+ "binance_listed_ms": 1781791200000,
+ "binance_symbol": "REUSDT",
+ "coingecko_id": "re",
+ "market_cap_rank": 139,
+ "market_cap_usd": 77319270,
+ "okx_inst_id": "RE-USDT-SWAP",
+ "okx_listed_ms": 1781692200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SUSHI",
+ "binance_listed_ms": 1599202800000,
+ "binance_symbol": "SUSHIUSDT",
+ "coingecko_id": "sushi",
+ "market_cap_rank": 140,
+ "market_cap_usd": 75331136,
+ "okx_inst_id": "SUSHI-USDT-SWAP",
+ "okx_listed_ms": 1599041571000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZIL",
+ "binance_listed_ms": 1592470800000,
+ "binance_symbol": "ZILUSDT",
+ "coingecko_id": "zilliqa",
+ "market_cap_rank": 141,
+ "market_cap_usd": 74175456,
+ "okx_inst_id": "ZIL-USDT-SWAP",
+ "okx_listed_ms": 1599646371000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TURBO",
+ "binance_listed_ms": 1717083000000,
+ "binance_symbol": "TURBOUSDT",
+ "coingecko_id": "turbo",
+ "market_cap_rank": 142,
+ "market_cap_usd": 73918641,
+ "okx_inst_id": "TURBO-USDT-SWAP",
+ "okx_listed_ms": 1702547700612
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ALLO",
+ "binance_listed_ms": 1762869600000,
+ "binance_symbol": "ALLOUSDT",
+ "coingecko_id": "allora",
+ "market_cap_rank": 143,
+ "market_cap_usd": 73060326,
+ "okx_inst_id": "ALLO-USDT-SWAP",
+ "okx_listed_ms": 1762879500659
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BOME",
+ "binance_listed_ms": 1710592200000,
+ "binance_symbol": "BOMEUSDT",
+ "coingecko_id": "book-of-meme",
+ "market_cap_rank": 144,
+ "market_cap_usd": 72775927,
+ "okx_inst_id": "BOME-USDT-SWAP",
+ "okx_listed_ms": 1723717202042
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SOON",
+ "binance_listed_ms": 1747989000000,
+ "binance_symbol": "SOONUSDT",
+ "coingecko_id": "soon-2",
+ "market_cap_rank": 145,
+ "market_cap_usd": 72749940,
+ "okx_inst_id": "SOON-USDT-SWAP",
+ "okx_listed_ms": 1747999800456
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LINEA",
+ "binance_listed_ms": 1756715400000,
+ "binance_symbol": "LINEAUSDT",
+ "coingecko_id": "linea",
+ "market_cap_rank": 146,
+ "market_cap_usd": 72159761,
+ "okx_inst_id": "LINEA-USDT-SWAP",
+ "okx_listed_ms": 1756735200376
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GPS",
+ "binance_listed_ms": 1739811600000,
+ "binance_symbol": "GPSUSDT",
+ "coingecko_id": "goplus-security",
+ "market_cap_rank": 147,
+ "market_cap_usd": 70710935,
+ "okx_inst_id": "GPS-USDT-SWAP",
+ "okx_listed_ms": 1741089600468
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BIO",
+ "binance_listed_ms": 1735906500000,
+ "binance_symbol": "BIOUSDT",
+ "coingecko_id": "bio-protocol",
+ "market_cap_rank": 148,
+ "market_cap_usd": 70610620,
+ "okx_inst_id": "BIO-USDT-SWAP",
+ "okx_listed_ms": 1735901100474
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ESP",
+ "binance_listed_ms": 1770711000000,
+ "binance_symbol": "ESPUSDT",
+ "coingecko_id": "espresso",
+ "market_cap_rank": 149,
+ "market_cap_usd": 69682814,
+ "okx_inst_id": "ESP-USDT-SWAP",
+ "okx_listed_ms": 1770739200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "NMR",
+ "binance_listed_ms": 1687435200000,
+ "binance_symbol": "NMRUSDT",
+ "coingecko_id": "numeraire",
+ "market_cap_rank": 150,
+ "market_cap_usd": 69559624,
+ "okx_inst_id": "NMR-USDT-SWAP",
+ "okx_listed_ms": 1704959700642
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "JELLYJELLY",
+ "binance_listed_ms": 1743004800000,
+ "binance_symbol": "JELLYJELLYUSDT",
+ "coingecko_id": "jelly-my-jelly",
+ "market_cap_rank": 151,
+ "market_cap_usd": 69330951,
+ "okx_inst_id": "JELLYJELLY-USDT-SWAP",
+ "okx_listed_ms": 1743004470352
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BABY",
+ "binance_listed_ms": 1743859800000,
+ "binance_symbol": "BABYUSDT",
+ "coingecko_id": "babylon",
+ "market_cap_rank": 152,
+ "market_cap_usd": 63897800,
+ "okx_inst_id": "BABY-USDT-SWAP",
+ "okx_listed_ms": 1744282800387
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ENJ",
+ "binance_listed_ms": 1601362800000,
+ "binance_symbol": "ENJUSDT",
+ "coingecko_id": "enjincoin",
+ "market_cap_rank": 153,
+ "market_cap_usd": 62531175,
+ "okx_inst_id": "ENJ-USDT-SWAP",
+ "okx_listed_ms": 1709288701407
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BLUR",
+ "binance_listed_ms": 1682553600000,
+ "binance_symbol": "BLURUSDT",
+ "coingecko_id": "blur",
+ "market_cap_rank": 154,
+ "market_cap_usd": 61910824,
+ "okx_inst_id": "BLUR-USDT-SWAP",
+ "okx_listed_ms": 1676429700181
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "COAI",
+ "binance_listed_ms": 1758785400000,
+ "binance_symbol": "COAIUSDT",
+ "coingecko_id": "chainopera-ai",
+ "market_cap_rank": 155,
+ "market_cap_usd": 60202196,
+ "okx_inst_id": "COAI-USDT-SWAP",
+ "okx_listed_ms": 1760538601123
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ONT",
+ "binance_listed_ms": 1581408300000,
+ "binance_symbol": "ONTUSDT",
+ "coingecko_id": "ontology",
+ "market_cap_rank": 156,
+ "market_cap_usd": 60173252,
+ "okx_inst_id": "ONT-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MERL",
+ "binance_listed_ms": 1748507400000,
+ "binance_symbol": "MERLUSDT",
+ "coingecko_id": "merlin-chain",
+ "market_cap_rank": 157,
+ "market_cap_usd": 59937767,
+ "okx_inst_id": "MERL-USDT-SWAP",
+ "okx_listed_ms": 1713522300606
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "CELO",
+ "binance_listed_ms": 1632639600000,
+ "binance_symbol": "CELOUSDT",
+ "coingecko_id": "celo",
+ "market_cap_rank": 158,
+ "market_cap_usd": 59307178,
+ "okx_inst_id": "CELO-USDT-SWAP",
+ "okx_listed_ms": 1632477785202
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BRETT",
+ "binance_listed_ms": 1724150100000,
+ "binance_symbol": "BRETTUSDT",
+ "coingecko_id": "based-brett",
+ "market_cap_rank": 159,
+ "market_cap_usd": 58083931,
+ "okx_inst_id": "BRETT-USDT-SWAP",
+ "okx_listed_ms": 1725617701730
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "0G",
+ "binance_listed_ms": 1758123900000,
+ "binance_symbol": "0GUSDT",
+ "coingecko_id": "zero-gravity",
+ "market_cap_rank": 160,
+ "market_cap_usd": 56669221,
+ "okx_inst_id": "0G-USDT-SWAP",
+ "okx_listed_ms": 1758537000238
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "POPCAT",
+ "binance_listed_ms": 1724331600000,
+ "binance_symbol": "POPCATUSDT",
+ "coingecko_id": "popcat",
+ "market_cap_rank": 161,
+ "market_cap_usd": 56602998,
+ "okx_inst_id": "POPCAT-USDT-SWAP",
+ "okx_listed_ms": 1724922000651
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TRB",
+ "binance_listed_ms": 1599116400000,
+ "binance_symbol": "TRBUSDT",
+ "coingecko_id": "tellor",
+ "market_cap_rank": 162,
+ "market_cap_usd": 56543554,
+ "okx_inst_id": "TRB-USDT-SWAP",
+ "okx_listed_ms": 1599559971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PNUT",
+ "binance_listed_ms": 1731328200000,
+ "binance_symbol": "PNUTUSDT",
+ "coingecko_id": "peanut-the-squirrel",
+ "market_cap_rank": 163,
+ "market_cap_usd": 56030682,
+ "okx_inst_id": "PNUT-USDT-SWAP",
+ "okx_listed_ms": 1731382200304
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MUBARAK",
+ "binance_listed_ms": 1742219100000,
+ "binance_symbol": "MUBARAKUSDT",
+ "coingecko_id": "mubarak",
+ "market_cap_rank": 164,
+ "market_cap_usd": 55544179,
+ "okx_inst_id": "MUBARAK-USDT-SWAP",
+ "okx_listed_ms": 1748946600286
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RAVE",
+ "binance_listed_ms": 1765726200000,
+ "binance_symbol": "RAVEUSDT",
+ "coingecko_id": "ravedao",
+ "market_cap_rank": 165,
+ "market_cap_usd": 54546655,
+ "okx_inst_id": "RAVE-USDT-SWAP",
+ "okx_listed_ms": 1765785600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "FLOW",
+ "binance_listed_ms": 1644390000000,
+ "binance_symbol": "FLOWUSDT",
+ "coingecko_id": "flow",
+ "market_cap_rank": 166,
+ "market_cap_usd": 54186250,
+ "okx_inst_id": "FLOW-USDT-SWAP",
+ "okx_listed_ms": 1699350900756
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ACU",
+ "binance_listed_ms": 1768999500000,
+ "binance_symbol": "ACUUSDT",
+ "coingecko_id": "acurast",
+ "market_cap_rank": 167,
+ "market_cap_usd": 53927363,
+ "okx_inst_id": "ACU-USDT-SWAP",
+ "okx_listed_ms": 1769151600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BARD",
+ "binance_listed_ms": 1758193200000,
+ "binance_symbol": "BARDUSDT",
+ "coingecko_id": "lombard-protocol",
+ "market_cap_rank": 168,
+ "market_cap_usd": 53449534,
+ "okx_inst_id": "BARD-USDT-SWAP",
+ "okx_listed_ms": 1758196800496
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "MEME",
+ "binance_listed_ms": 1699012800000,
+ "binance_symbol": "MEMEUSDT",
+ "coingecko_id": "memetoon",
+ "market_cap_rank": 169,
+ "market_cap_usd": 51673755,
+ "okx_inst_id": "MEME-USDT-SWAP",
+ "okx_listed_ms": 1699001700715
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MEGA",
+ "binance_listed_ms": 1769775300000,
+ "binance_symbol": "MEGAUSDT",
+ "coingecko_id": "megaeth",
+ "market_cap_rank": 170,
+ "market_cap_usd": 51307905,
+ "okx_inst_id": "MEGA-USDT-SWAP",
+ "okx_listed_ms": 1777550400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "NOT",
+ "binance_listed_ms": 1715868000000,
+ "binance_symbol": "NOTUSDT",
+ "coingecko_id": "notcoin",
+ "market_cap_rank": 171,
+ "market_cap_usd": 50012816,
+ "okx_inst_id": "NOT-USDT-SWAP",
+ "okx_listed_ms": 1715862465350
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AZTEC",
+ "binance_listed_ms": 1770784200000,
+ "binance_symbol": "AZTECUSDT",
+ "coingecko_id": "aztec",
+ "market_cap_rank": 172,
+ "market_cap_usd": 49682486,
+ "okx_inst_id": "AZTEC-USDT-SWAP",
+ "okx_listed_ms": 1770805800000
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "ARX",
+ "binance_listed_ms": 1782189900000,
+ "binance_symbol": "ARXUSDT",
+ "coingecko_id": "arcium",
+ "market_cap_rank": 173,
+ "market_cap_usd": 49320535,
+ "okx_inst_id": "ARX-USDT-SWAP",
+ "okx_listed_ms": 1782131400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ME",
+ "binance_listed_ms": 1733850000000,
+ "binance_symbol": "MEUSDT",
+ "coingecko_id": "magic-eden",
+ "market_cap_rank": 174,
+ "market_cap_usd": 49000169,
+ "okx_inst_id": "ME-USDT-SWAP",
+ "okx_listed_ms": 1733844600107
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MOODENG",
+ "binance_listed_ms": 1729850400000,
+ "binance_symbol": "MOODENGUSDT",
+ "coingecko_id": "moo-deng",
+ "market_cap_rank": 175,
+ "market_cap_usd": 48948474,
+ "okx_inst_id": "MOODENG-USDT-SWAP",
+ "okx_listed_ms": 1727938802849
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MASK",
+ "binance_listed_ms": 1626418800000,
+ "binance_symbol": "MASKUSDT",
+ "coingecko_id": "mask-network",
+ "market_cap_rank": 176,
+ "market_cap_usd": 48018276,
+ "okx_inst_id": "MASK-USDT-SWAP",
+ "okx_listed_ms": 1614841200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PROVE",
+ "binance_listed_ms": 1754413200000,
+ "binance_symbol": "PROVEUSDT",
+ "coingecko_id": "succinct",
+ "market_cap_rank": 177,
+ "market_cap_usd": 47703051,
+ "okx_inst_id": "PROVE-USDT-SWAP",
+ "okx_listed_ms": 1760700601003
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PEOPLE",
+ "binance_listed_ms": 1640242800000,
+ "binance_symbol": "PEOPLEUSDT",
+ "coingecko_id": "constitutiondao",
+ "market_cap_rank": 178,
+ "market_cap_usd": 47481087,
+ "okx_inst_id": "PEOPLE-USDT-SWAP",
+ "okx_listed_ms": 1638427889758
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SSV",
+ "binance_listed_ms": 1677135600000,
+ "binance_symbol": "SSVUSDT",
+ "coingecko_id": "ssv-network",
+ "market_cap_rank": 179,
+ "market_cap_usd": 47263356,
+ "okx_inst_id": "SSV-USDT-SWAP",
+ "okx_listed_ms": 1700711700717
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LAB",
+ "binance_listed_ms": 1760711400000,
+ "binance_symbol": "LABUSDT",
+ "coingecko_id": "lab",
+ "market_cap_rank": 180,
+ "market_cap_usd": 47114760,
+ "okx_inst_id": "LAB-USDT-SWAP",
+ "okx_listed_ms": 1761998401879
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "HUMA",
+ "binance_listed_ms": 1748264400000,
+ "binance_symbol": "HUMAUSDT",
+ "coingecko_id": "huma-finance",
+ "market_cap_rank": 181,
+ "market_cap_usd": 46799121,
+ "okx_inst_id": "HUMA-USDT-SWAP",
+ "okx_listed_ms": 1748266200433
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AVNT",
+ "binance_listed_ms": 1757430000000,
+ "binance_symbol": "AVNTUSDT",
+ "coingecko_id": "avantis",
+ "market_cap_rank": 182,
+ "market_cap_usd": 46242055,
+ "okx_inst_id": "AVNT-USDT-SWAP",
+ "okx_listed_ms": 1758555000222
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MEW",
+ "binance_listed_ms": 1718632800000,
+ "binance_symbol": "MEWUSDT",
+ "coingecko_id": "cat-in-a-dogs-world",
+ "market_cap_rank": 183,
+ "market_cap_usd": 45260036,
+ "okx_inst_id": "MEW-USDT-SWAP",
+ "okx_listed_ms": 1713169500531
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "DOS",
+ "binance_listed_ms": 1786460400000,
+ "binance_symbol": "DOSUSDT",
+ "coingecko_id": "dappos",
+ "market_cap_rank": 184,
+ "market_cap_usd": 44701765,
+ "okx_inst_id": "DOS-USDT-SWAP",
+ "okx_listed_ms": 1786363200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MOVE",
+ "binance_listed_ms": 1733752800000,
+ "binance_symbol": "MOVEUSDT",
+ "coingecko_id": "movement",
+ "market_cap_rank": 185,
+ "market_cap_usd": 43864070,
+ "okx_inst_id": "MOVE-USDT-SWAP",
+ "okx_listed_ms": 1733749202646
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "API3",
+ "binance_listed_ms": 1645426800000,
+ "binance_symbol": "API3USDT",
+ "coingecko_id": "api3",
+ "market_cap_rank": 186,
+ "market_cap_usd": 41881575,
+ "okx_inst_id": "API3-USDT-SWAP",
+ "okx_listed_ms": 1646297716213
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SAHARA",
+ "binance_listed_ms": 1750939200000,
+ "binance_symbol": "SAHARAUSDT",
+ "coingecko_id": "sahara-ai",
+ "market_cap_rank": 187,
+ "market_cap_usd": 41813766,
+ "okx_inst_id": "SAHARA-USDT-SWAP",
+ "okx_listed_ms": 1750941000359
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BAND",
+ "binance_listed_ms": 1596006000000,
+ "binance_symbol": "BANDUSDT",
+ "coingecko_id": "band-protocol",
+ "market_cap_rank": 188,
+ "market_cap_usd": 41379958,
+ "okx_inst_id": "BAND-USDT-SWAP",
+ "okx_listed_ms": 1599473571000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "APR",
+ "binance_listed_ms": 1761215400000,
+ "binance_symbol": "APRUSDT",
+ "coingecko_id": "apriori",
+ "market_cap_rank": 189,
+ "market_cap_usd": 40459893,
+ "okx_inst_id": "APR-USDT-SWAP",
+ "okx_listed_ms": 1761285601180
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZORA",
+ "binance_listed_ms": 1753441200000,
+ "binance_symbol": "ZORAUSDT",
+ "coingecko_id": "zora",
+ "market_cap_rank": 190,
+ "market_cap_usd": 40211796,
+ "okx_inst_id": "ZORA-USDT-SWAP",
+ "okx_listed_ms": 1760095801229
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GIGGLE",
+ "binance_listed_ms": 1760003100000,
+ "binance_symbol": "GIGGLEUSDT",
+ "coingecko_id": "giggle-fund",
+ "market_cap_rank": 191,
+ "market_cap_usd": 40184418,
+ "okx_inst_id": "GIGGLE-USDT-SWAP",
+ "okx_listed_ms": 1761375601708
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RVN",
+ "binance_listed_ms": 1614063600000,
+ "binance_symbol": "RVNUSDT",
+ "coingecko_id": "ravencoin",
+ "market_cap_rank": 192,
+ "market_cap_usd": 40078181,
+ "okx_inst_id": "RVN-USDT-SWAP",
+ "okx_listed_ms": 1619161200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "NEIRO",
+ "binance_listed_ms": 1726486200000,
+ "binance_symbol": "NEIROUSDT",
+ "coingecko_id": "neiro-3",
+ "market_cap_rank": 193,
+ "market_cap_usd": 39270421,
+ "okx_inst_id": "NEIRO-USDT-SWAP",
+ "okx_listed_ms": 1727939701217
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "UMA",
+ "binance_listed_ms": 1683590400000,
+ "binance_symbol": "UMAUSDT",
+ "coingecko_id": "uma",
+ "market_cap_rank": 194,
+ "market_cap_usd": 38725517,
+ "okx_inst_id": "UMA-USDT-SWAP",
+ "okx_listed_ms": 1599214371000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SIGN",
+ "binance_listed_ms": 1745838000000,
+ "binance_symbol": "SIGNUSDT",
+ "coingecko_id": "sign-global",
+ "market_cap_rank": 195,
+ "market_cap_usd": 38227507,
+ "okx_inst_id": "SIGN-USDT-SWAP",
+ "okx_listed_ms": 1745839800340
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "VANA",
+ "binance_listed_ms": 1734355800000,
+ "binance_symbol": "VANAUSDT",
+ "coingecko_id": "vana",
+ "market_cap_rank": 196,
+ "market_cap_usd": 35861114,
+ "okx_inst_id": "VANA-USDT-SWAP",
+ "okx_listed_ms": 1734408000582
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BEAT",
+ "binance_listed_ms": 1762949700000,
+ "binance_symbol": "BEATUSDT",
+ "coingecko_id": "audiera",
+ "market_cap_rank": 197,
+ "market_cap_usd": 35716669,
+ "okx_inst_id": "BEAT-USDT-SWAP",
+ "okx_listed_ms": 1762964100610
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AT",
+ "binance_listed_ms": 1761737400000,
+ "binance_symbol": "ATUSDT",
+ "coingecko_id": "apro",
+ "market_cap_rank": 198,
+ "market_cap_usd": 35528720,
+ "okx_inst_id": "AT-USDT-SWAP",
+ "okx_listed_ms": 1761818401453
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MMT",
+ "binance_listed_ms": 1762257600000,
+ "binance_symbol": "MMTUSDT",
+ "coingecko_id": "momentum-3",
+ "market_cap_rank": 199,
+ "market_cap_usd": 35351373,
+ "okx_inst_id": "MMT-USDT-SWAP",
+ "okx_listed_ms": 1762259401259
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "IOST",
+ "binance_listed_ms": 1582272300000,
+ "binance_symbol": "IOSTUSDT",
+ "coingecko_id": "iostoken",
+ "market_cap_rank": 200,
+ "market_cap_usd": 34873158,
+ "okx_inst_id": "IOST-USDT-SWAP",
+ "okx_listed_ms": 1587463971000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "IRYS",
+ "binance_listed_ms": 1764172800000,
+ "binance_symbol": "IRYSUSDT",
+ "coingecko_id": "irys",
+ "market_cap_rank": 201,
+ "market_cap_usd": 34312795,
+ "okx_inst_id": "IRYS-USDT-SWAP",
+ "okx_listed_ms": 1779880500000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "FOGO",
+ "binance_listed_ms": 1768053600000,
+ "binance_symbol": "FOGOUSDT",
+ "coingecko_id": "fogo",
+ "market_cap_rank": 202,
+ "market_cap_usd": 33716924,
+ "okx_inst_id": "FOGO-USDT-SWAP",
+ "okx_listed_ms": 1768059900000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ETHW",
+ "binance_listed_ms": 1701174600000,
+ "binance_symbol": "ETHWUSDT",
+ "coingecko_id": "ethereum-pow-iou",
+ "market_cap_rank": 203,
+ "market_cap_usd": 33653694,
+ "okx_inst_id": "ETHW-USDT-SWAP",
+ "okx_listed_ms": 1663311331635
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "KGEN",
+ "binance_listed_ms": 1759847400000,
+ "binance_symbol": "KGENUSDT",
+ "coingecko_id": "kgen",
+ "market_cap_rank": 204,
+ "market_cap_usd": 32858144,
+ "okx_inst_id": "KGEN-USDT-SWAP",
+ "okx_listed_ms": 1760761801014
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BILL",
+ "binance_listed_ms": 1778141700000,
+ "binance_symbol": "BILLUSDT",
+ "coingecko_id": "billions-network",
+ "market_cap_rank": 205,
+ "market_cap_usd": 32350618,
+ "okx_inst_id": "BILL-USDT-SWAP",
+ "okx_listed_ms": 1778054400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "OPG",
+ "binance_listed_ms": 1776871800000,
+ "binance_symbol": "OPGUSDT",
+ "coingecko_id": "opengradient",
+ "market_cap_rank": 206,
+ "market_cap_usd": 32323678,
+ "okx_inst_id": "OPG-USDT-SWAP",
+ "okx_listed_ms": 1776934800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SPACE",
+ "binance_listed_ms": 1769168700000,
+ "binance_symbol": "SPACEUSDT",
+ "coingecko_id": "spacecoin-2",
+ "market_cap_rank": 207,
+ "market_cap_usd": 30939294,
+ "okx_inst_id": "SPACE-USDT-SWAP",
+ "okx_listed_ms": 1769173200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZBT",
+ "binance_listed_ms": 1760700600000,
+ "binance_symbol": "ZBTUSDT",
+ "coingecko_id": "zerobase",
+ "market_cap_rank": 208,
+ "market_cap_usd": 29421480,
+ "okx_inst_id": "ZBT-USDT-SWAP",
+ "okx_listed_ms": 1760700600342
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AUCTION",
+ "binance_listed_ms": 1702645200000,
+ "binance_symbol": "AUCTIONUSDT",
+ "coingecko_id": "auction",
+ "market_cap_rank": 209,
+ "market_cap_usd": 28954697,
+ "okx_inst_id": "AUCTION-USDT-SWAP",
+ "okx_listed_ms": 1701417300613
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "HOME",
+ "binance_listed_ms": 1749555000000,
+ "binance_symbol": "HOMEUSDT",
+ "coingecko_id": "home",
+ "market_cap_rank": 210,
+ "market_cap_usd": 28295103,
+ "okx_inst_id": "HOME-USDT-SWAP",
+ "okx_listed_ms": 1749809700256
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TRUTH",
+ "binance_listed_ms": 1759320000000,
+ "binance_symbol": "TRUTHUSDT",
+ "coingecko_id": "swarm-network",
+ "market_cap_rank": 211,
+ "market_cap_usd": 28219946,
+ "okx_inst_id": "TRUTH-USDT-SWAP",
+ "okx_listed_ms": 1764329400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GMT",
+ "binance_listed_ms": 1647241200000,
+ "binance_symbol": "GMTUSDT",
+ "coingecko_id": "stepn",
+ "market_cap_rank": 212,
+ "market_cap_usd": 27459960,
+ "okx_inst_id": "GMT-USDT-SWAP",
+ "okx_listed_ms": 1648803369890
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "METIS",
+ "binance_listed_ms": 1710232200000,
+ "binance_symbol": "METISUSDT",
+ "coingecko_id": "metis-token",
+ "market_cap_rank": 213,
+ "market_cap_usd": 27120105,
+ "okx_inst_id": "METIS-USDT-SWAP",
+ "okx_listed_ms": 1703757300614
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "EDEN",
+ "binance_listed_ms": 1759230000000,
+ "binance_symbol": "EDENUSDT",
+ "coingecko_id": "openeden",
+ "market_cap_rank": 214,
+ "market_cap_usd": 26201277,
+ "okx_inst_id": "EDEN-USDT-SWAP",
+ "okx_listed_ms": 1759231801710
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BSB",
+ "binance_listed_ms": 1774439100000,
+ "binance_symbol": "BSBUSDT",
+ "coingecko_id": "block-street",
+ "market_cap_rank": 215,
+ "market_cap_usd": 25955084,
+ "okx_inst_id": "BSB-USDT-SWAP",
+ "okx_listed_ms": 1775124000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SATS",
+ "binance_listed_ms": 1702389600000,
+ "binance_symbol": "1000SATSUSDT",
+ "coingecko_id": "sats-ordinals",
+ "market_cap_rank": 216,
+ "market_cap_usd": 25746045,
+ "okx_inst_id": "SATS-USDT-SWAP",
+ "okx_listed_ms": 1702889700612
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BIGTIME",
+ "binance_listed_ms": 1697121000000,
+ "binance_symbol": "BIGTIMEUSDT",
+ "coingecko_id": "big-time",
+ "market_cap_rank": 217,
+ "market_cap_usd": 25607011,
+ "okx_inst_id": "BIGTIME-USDT-SWAP",
+ "okx_listed_ms": 1697115300862
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WOO",
+ "binance_listed_ms": 1649314800000,
+ "binance_symbol": "WOOUSDT",
+ "coingecko_id": "woo-network",
+ "market_cap_rank": 218,
+ "market_cap_usd": 25235210,
+ "okx_inst_id": "WOO-USDT-SWAP",
+ "okx_listed_ms": 1676357700337
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "YGG",
+ "binance_listed_ms": 1691206200000,
+ "binance_symbol": "YGGUSDT",
+ "coingecko_id": "yield-guild-games",
+ "market_cap_rank": 219,
+ "market_cap_usd": 25101272,
+ "okx_inst_id": "YGG-USDT-SWAP",
+ "okx_listed_ms": 1628240400000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AEVO",
+ "binance_listed_ms": 1710336600000,
+ "binance_symbol": "AEVOUSDT",
+ "coingecko_id": "aevo-exchange",
+ "market_cap_rank": 220,
+ "market_cap_usd": 25034679,
+ "okx_inst_id": "AEVO-USDT-SWAP",
+ "okx_listed_ms": 1710325520298
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RIVER",
+ "binance_listed_ms": 1760712300000,
+ "binance_symbol": "RIVERUSDT",
+ "coingecko_id": "river",
+ "market_cap_rank": 221,
+ "market_cap_usd": 24934004,
+ "okx_inst_id": "RIVER-USDT-SWAP",
+ "okx_listed_ms": 1767942000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AIXBT",
+ "binance_listed_ms": 1734719400000,
+ "binance_symbol": "AIXBTUSDT",
+ "coingecko_id": "aixbt",
+ "market_cap_rank": 222,
+ "market_cap_usd": 24273346,
+ "okx_inst_id": "AIXBT-USDT-SWAP",
+ "okx_listed_ms": 1735887600188
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "GRVT",
+ "binance_listed_ms": 1785501900000,
+ "binance_symbol": "GRVTUSDT",
+ "coingecko_id": "grvt",
+ "market_cap_rank": 223,
+ "market_cap_usd": 23802889,
+ "okx_inst_id": "GRVT-USDT-SWAP",
+ "okx_listed_ms": 1785423600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LQTY",
+ "binance_listed_ms": 1678258800000,
+ "binance_symbol": "LQTYUSDT",
+ "coingecko_id": "liquity",
+ "market_cap_rank": 224,
+ "market_cap_usd": 23698552,
+ "okx_inst_id": "LQTY-USDT-SWAP",
+ "okx_listed_ms": 1705053300717
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BREV",
+ "binance_listed_ms": 1767091500000,
+ "binance_symbol": "BREVUSDT",
+ "coingecko_id": "brevis",
+ "market_cap_rank": 225,
+ "market_cap_usd": 23000013,
+ "okx_inst_id": "BREV-USDT-SWAP",
+ "okx_listed_ms": 1767099600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "YB",
+ "binance_listed_ms": 1760107500000,
+ "binance_symbol": "YBUSDT",
+ "coingecko_id": "yield-basis",
+ "market_cap_rank": 226,
+ "market_cap_usd": 22664063,
+ "okx_inst_id": "YB-USDT-SWAP",
+ "okx_listed_ms": 1760252400368
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BICO",
+ "binance_listed_ms": 1695904200000,
+ "binance_symbol": "BICOUSDT",
+ "coingecko_id": "biconomy",
+ "market_cap_rank": 227,
+ "market_cap_usd": 22527738,
+ "okx_inst_id": "BICO-USDT-SWAP",
+ "okx_listed_ms": 1639032617371
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ROBO",
+ "binance_listed_ms": 1772181900000,
+ "binance_symbol": "ROBOUSDT",
+ "coingecko_id": "robo-token-2",
+ "market_cap_rank": 228,
+ "market_cap_usd": 21582639,
+ "okx_inst_id": "ROBO-USDT-SWAP",
+ "okx_listed_ms": 1772206200000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ENSO",
+ "binance_listed_ms": 1760432400000,
+ "binance_symbol": "ENSOUSDT",
+ "coingecko_id": "enso",
+ "market_cap_rank": 229,
+ "market_cap_usd": 21371392,
+ "okx_inst_id": "ENSO-USDT-SWAP",
+ "okx_listed_ms": 1761732001294
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "AGLD",
+ "binance_listed_ms": 1690597800000,
+ "binance_symbol": "AGLDUSDT",
+ "coingecko_id": "adventure-gold",
+ "market_cap_rank": 230,
+ "market_cap_usd": 20798318,
+ "okx_inst_id": "AGLD-USDT-SWAP",
+ "okx_listed_ms": 1631008650016
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WCT",
+ "binance_listed_ms": 1744714800000,
+ "binance_symbol": "WCTUSDT",
+ "coingecko_id": "connect-token-wct",
+ "market_cap_rank": 231,
+ "market_cap_usd": 20619972,
+ "okx_inst_id": "WCT-USDT-SWAP",
+ "okx_listed_ms": 1744716600433
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "INIT",
+ "binance_listed_ms": 1744785000000,
+ "binance_symbol": "INITUSDT",
+ "coingecko_id": "initia",
+ "market_cap_rank": 232,
+ "market_cap_usd": 20549653,
+ "okx_inst_id": "INIT-USDT-SWAP",
+ "okx_listed_ms": 1745494200437
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ON",
+ "binance_listed_ms": 1761294600000,
+ "binance_symbol": "ONUSDT",
+ "coingecko_id": "orochi-network",
+ "market_cap_rank": 233,
+ "market_cap_usd": 19676881,
+ "okx_inst_id": "ON-USDT-SWAP",
+ "okx_listed_ms": 1783329300000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "PIPPIN",
+ "binance_listed_ms": 1737713700000,
+ "binance_symbol": "PIPPINUSDT",
+ "coingecko_id": "pippin",
+ "market_cap_rank": 234,
+ "market_cap_usd": 19516742,
+ "okx_inst_id": "PIPPIN-USDT-SWAP",
+ "okx_listed_ms": 1764687600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ANIME",
+ "binance_listed_ms": 1737651600000,
+ "binance_symbol": "ANIMEUSDT",
+ "coingecko_id": "anime",
+ "market_cap_rank": 235,
+ "market_cap_usd": 19356227,
+ "okx_inst_id": "ANIME-USDT-SWAP",
+ "okx_listed_ms": 1737644401356
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SAPIEN",
+ "binance_listed_ms": 1755711000000,
+ "binance_symbol": "SAPIENUSDT",
+ "coingecko_id": "sapien-2",
+ "market_cap_rank": 236,
+ "market_cap_usd": 19250643,
+ "okx_inst_id": "SAPIEN-USDT-SWAP",
+ "okx_listed_ms": 1762429500524
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "F",
+ "binance_listed_ms": 1750250700000,
+ "binance_symbol": "FUSDT",
+ "coingecko_id": "synfutures",
+ "market_cap_rank": 237,
+ "market_cap_usd": 18766943,
+ "okx_inst_id": "F-USDT-SWAP",
+ "okx_listed_ms": 1761379201201
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SOPH",
+ "binance_listed_ms": 1748437200000,
+ "binance_symbol": "SOPHUSDT",
+ "coingecko_id": "sophon",
+ "market_cap_rank": 238,
+ "market_cap_usd": 18414563,
+ "okx_inst_id": "SOPH-USDT-SWAP",
+ "okx_listed_ms": 1748439000413
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "MAGIC",
+ "binance_listed_ms": 1674457200000,
+ "binance_symbol": "MAGICUSDT",
+ "coingecko_id": "magic",
+ "market_cap_rank": 239,
+ "market_cap_usd": 17355990,
+ "okx_inst_id": "MAGIC-USDT-SWAP",
+ "okx_listed_ms": 1675321549791
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LAYER",
+ "binance_listed_ms": 1739288700000,
+ "binance_symbol": "LAYERUSDT",
+ "coingecko_id": "solayer",
+ "market_cap_rank": 240,
+ "market_cap_usd": 17234899,
+ "okx_inst_id": "LAYER-USDT-SWAP",
+ "okx_listed_ms": 1739284200817
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ORDER",
+ "binance_listed_ms": 1758890700000,
+ "binance_symbol": "ORDERUSDT",
+ "coingecko_id": "orderly-network",
+ "market_cap_rank": 241,
+ "market_cap_usd": 17073946,
+ "okx_inst_id": "ORDER-USDT-SWAP",
+ "okx_listed_ms": 1759245300953
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "SLX",
+ "binance_listed_ms": 1780299000000,
+ "binance_symbol": "SLXUSDT",
+ "coingecko_id": "solstice",
+ "market_cap_rank": 242,
+ "market_cap_usd": 16900443,
+ "okx_inst_id": "SLX-USDT-SWAP",
+ "okx_listed_ms": 1780291800000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "KAT",
+ "binance_listed_ms": 1772427600000,
+ "binance_symbol": "KATUSDT",
+ "coingecko_id": "katana-network-token",
+ "market_cap_rank": 243,
+ "market_cap_usd": 16845704,
+ "okx_inst_id": "KAT-USDT-SWAP",
+ "okx_listed_ms": 1772451000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "BASED",
+ "binance_listed_ms": 1774864800000,
+ "binance_symbol": "BASEDUSDT",
+ "coingecko_id": "based-one",
+ "market_cap_rank": 244,
+ "market_cap_usd": 16341955,
+ "okx_inst_id": "BASED-USDT-SWAP",
+ "okx_listed_ms": 1774866600000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "WET",
+ "binance_listed_ms": 1765350000000,
+ "binance_symbol": "WETUSDT",
+ "coingecko_id": "humidifi",
+ "market_cap_rank": 245,
+ "market_cap_usd": 16177302,
+ "okx_inst_id": "WET-USDT-SWAP",
+ "okx_listed_ms": 1765296000000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "DOOD",
+ "binance_listed_ms": 1746797400000,
+ "binance_symbol": "DOODUSDT",
+ "coingecko_id": "doodles",
+ "market_cap_rank": 246,
+ "market_cap_usd": 14890388,
+ "okx_inst_id": "DOOD-USDT-SWAP",
+ "okx_listed_ms": 1747051200521
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "LA",
+ "binance_listed_ms": 1749114000000,
+ "binance_symbol": "LAUSDT",
+ "coingecko_id": "lagrange",
+ "market_cap_rank": 247,
+ "market_cap_usd": 14251599,
+ "okx_inst_id": "LA-USDT-SWAP",
+ "okx_listed_ms": 1749808800320
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RECALL",
+ "binance_listed_ms": 1760531400000,
+ "binance_symbol": "RECALLUSDT",
+ "coingecko_id": "recall",
+ "market_cap_rank": 248,
+ "market_cap_usd": 12934671,
+ "okx_inst_id": "RECALL-USDT-SWAP",
+ "okx_listed_ms": 1761819300976
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "TRUST",
+ "binance_listed_ms": 1762335000000,
+ "binance_symbol": "TRUSTUSDT",
+ "coingecko_id": "trust-3",
+ "market_cap_rank": 249,
+ "market_cap_usd": 12443078,
+ "okx_inst_id": "TRUST-USDT-SWAP",
+ "okx_listed_ms": 1762342200957
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "HMSTR",
+ "binance_listed_ms": 1727353800000,
+ "binance_symbol": "HMSTRUSDT",
+ "coingecko_id": "hamster-kombat",
+ "market_cap_rank": 250,
+ "market_cap_usd": 11592435,
+ "okx_inst_id": "HMSTR-USDT-SWAP",
+ "okx_listed_ms": 1727353800176
+ },
+ {
+ "ambiguous_market_cap_symbol": true,
+ "base": "ACT",
+ "binance_listed_ms": 1731327300000,
+ "binance_symbol": "ACTUSDT",
+ "coingecko_id": "act-i-the-ai-prophecy",
+ "market_cap_rank": 251,
+ "market_cap_usd": 10664657,
+ "okx_inst_id": "ACT-USDT-SWAP",
+ "okx_listed_ms": 1731582000644
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "ZKP",
+ "binance_listed_ms": 1766311200000,
+ "binance_symbol": "ZKPUSDT",
+ "coingecko_id": "zkpass",
+ "market_cap_rank": 252,
+ "market_cap_usd": 10452385,
+ "okx_inst_id": "ZKP-USDT-SWAP",
+ "okx_listed_ms": 1767793500000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "RESOLV",
+ "binance_listed_ms": 1749562200000,
+ "binance_symbol": "RESOLVUSDT",
+ "coingecko_id": "resolv",
+ "market_cap_rank": 253,
+ "market_cap_usd": 9873346,
+ "okx_inst_id": "RESOLV-USDT-SWAP",
+ "okx_listed_ms": 1749565800438
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "OPN",
+ "binance_listed_ms": 1771686000000,
+ "binance_symbol": "OPNUSDT",
+ "coingecko_id": "opinion",
+ "market_cap_rank": 254,
+ "market_cap_usd": 9462059,
+ "okx_inst_id": "OPN-USDT-SWAP",
+ "okx_listed_ms": 1771847700000
+ },
+ {
+ "ambiguous_market_cap_symbol": false,
+ "base": "TRIA",
+ "binance_listed_ms": 1770380100000,
+ "binance_symbol": "TRIAUSDT",
+ "coingecko_id": "tria",
+ "market_cap_rank": 255,
+ "market_cap_usd": 8955117,
+ "okx_inst_id": "TRIA-USDT-SWAP",
+ "okx_listed_ms": 1770276600000
+ }
+ ],
+ "membership_sha256": "078100d9ceb22469c7af513bc49fd0a9ac73a793965e2eb4bb7872105be21c2c",
+ "revision": 1,
+ "rules": {
+ "base_normalisation": "strip a leading 1000000, 1000 or 1M contract-size prefix",
+ "cap": 300,
+ "eligible": "Binance USD-M PERPETUAL/USDT TRADING and OKX SWAP linear/USDT live, same base",
+ "excluded_bases": [
+ "AEUR",
+ "BUSD",
+ "DAI",
+ "EUR",
+ "EURC",
+ "EURI",
+ "FDUSD",
+ "PAXG",
+ "PYUSD",
+ "RLUSD",
+ "STETH",
+ "TUSD",
+ "USD1",
+ "USDC",
+ "USDD",
+ "USDE",
+ "USDP",
+ "USDT",
+ "WBETH",
+ "WBTC",
+ "WEETH",
+ "WETH",
+ "WSTETH",
+ "XAUT"
+ ],
+ "hysteresis": "incumbent kept while eligible and rank <= keep_rank; newcomers by rank while members < cap",
+ "intervals": [
+ "1d"
+ ],
+ "keep_rank": 330,
+ "min_listing_days": 30,
+ "ranking": "CoinGecko market cap, largest coin for a shared symbol (flagged ambiguous)"
+ },
+ "schema": "qdl.v2.market-cap-universe.v1",
+ "sources_sha256": {
+ "binance_exchange_info": "c63a386b54d674cae0b376d821b0967d921e60d2abef43c706566ca00fee17b6",
+ "coingecko_markets": "5e2db4a8c0b234644b1705a1af1c68a8ddb7ecc5dbcabb6ffb9deaa72c64dc91",
+ "okx_swap_instruments": "9ba6abcda0b51fff7406d55a4d86e4ac23aa4cbcc7fa8138e4cdc124e327eace"
+ }
+}
diff --git a/config/v2/universes/crypto-top300-1d.ownership.json b/config/v2/universes/crypto-top300-1d.ownership.json
new file mode 100644
index 00000000..aed024ac
--- /dev/null
+++ b/config/v2/universes/crypto-top300-1d.ownership.json
@@ -0,0 +1,510 @@
+{
+ "consumers": {
+ "alpha.binance.paper.stable": {
+ "BINANCE|USDM|PERPETUAL|0GUSDT|BAR|1d|crypto_primary_v2": "a82d482ba535f7eb5feff335f48b42f3b4090a3f681d1c77b989bf8cf2d0b795",
+ "BINANCE|USDM|PERPETUAL|1000BONKUSDT|BAR|1d|crypto_primary_v2": "0a70456d907deef6b44ecc1e4e80eefd9fd304706e3429530c8069894e8314c2",
+ "BINANCE|USDM|PERPETUAL|1000FLOKIUSDT|BAR|1d|crypto_primary_v2": "2ee96f9ddbd927d86612c08cb989ea4125248e1e7edd32f1c67aac1a8a1ec676",
+ "BINANCE|USDM|PERPETUAL|1000PEPEUSDT|BAR|1d|crypto_primary_v2": "4d08ad329121a96c0b9dedf7cd285e8d9dc1bca6b52afa393b6843344f80d81c",
+ "BINANCE|USDM|PERPETUAL|1000SATSUSDT|BAR|1d|crypto_primary_v2": "a44970e288429703f9bd0ed96a7936f2d959c7cf5dbc2382b54c1ea610bfa615",
+ "BINANCE|USDM|PERPETUAL|1000SHIBUSDT|BAR|1d|crypto_primary_v2": "788b96d821fce0e642b7b831cafe41b03fe8210c63f09ed77915b50bd65696a6",
+ "BINANCE|USDM|PERPETUAL|1INCHUSDT|BAR|1d|crypto_primary_v2": "35bb568f6ba0cdf715436f3fbf389acbfa9689f3610cf73cbc6fdd3387790f7d",
+ "BINANCE|USDM|PERPETUAL|2ZUSDT|BAR|1d|crypto_primary_v2": "8e8f6bf2b885db7919d6bbb06278be450f27f5c35770e931bf404b8f9882ed32",
+ "BINANCE|USDM|PERPETUAL|AAVEUSDT|BAR|1d|crypto_primary_v2": "d3c3a696c989ea995091d8bbacfd72c1d179b4f2a21f348b5f0d69721219b78c",
+ "BINANCE|USDM|PERPETUAL|ACTUSDT|BAR|1d|crypto_primary_v2": "879e718134e87abdae4aabb87f49baa5fc5236bcb6e3702d5e7d23562ed50759",
+ "BINANCE|USDM|PERPETUAL|ACUUSDT|BAR|1d|crypto_primary_v2": "7e094d062a23cb8466fe7f0f86d8531e1bb7fb2ff70a1cfa085556d5d86fbe92",
+ "BINANCE|USDM|PERPETUAL|ADAUSDT|BAR|1d|crypto_primary_v2": "05533d0c67595295f7fe8eef4967ba79d0fceeaf56ae9ff1d142bea9b4cc8d89",
+ "BINANCE|USDM|PERPETUAL|AEROUSDT|BAR|1d|crypto_primary_v2": "140d4476b4b4abc1eddbf328d77facca4b538ad4a8cb6178ae1910d906a070d1",
+ "BINANCE|USDM|PERPETUAL|AEVOUSDT|BAR|1d|crypto_primary_v2": "eeab59ca7743516b46812c4c95928aed8e5d6000ea3ac914f50d302737761c71",
+ "BINANCE|USDM|PERPETUAL|AGLDUSDT|BAR|1d|crypto_primary_v2": "800e3b2e7e6dbc5ed9892f41fffd48a99638097aa1187f5a414274d60e603f23",
+ "BINANCE|USDM|PERPETUAL|AIXBTUSDT|BAR|1d|crypto_primary_v2": "baddba42c7cec780962eae784f013bd64feba7765f08034c7b2183bc24cd7ca9",
+ "BINANCE|USDM|PERPETUAL|ALGOUSDT|BAR|1d|crypto_primary_v2": "ff8cbd171a2e5443621994967f6eacf817ed0adb039af16520a4e753fd3d6ff6",
+ "BINANCE|USDM|PERPETUAL|ALLOUSDT|BAR|1d|crypto_primary_v2": "5e1ac784b8c4b870625816d290df539d85d24be95a7f87b3afb8347e746ec9d9",
+ "BINANCE|USDM|PERPETUAL|ANIMEUSDT|BAR|1d|crypto_primary_v2": "a6eaa1008232ed30cbe800a592aff3f19db7e3ca82ced86d2ec917c781d353fb",
+ "BINANCE|USDM|PERPETUAL|APEUSDT|BAR|1d|crypto_primary_v2": "66962378db61c6485efe41b895aba68e55d38a0f70540deac0290299735b9ebc",
+ "BINANCE|USDM|PERPETUAL|API3USDT|BAR|1d|crypto_primary_v2": "564c957932f100bd3069274f97e4b74c09f27f8d50f93f69cc34a1ef7c4fb21b",
+ "BINANCE|USDM|PERPETUAL|APRUSDT|BAR|1d|crypto_primary_v2": "399bf150ac6cf025c02d249cbdc99cc456e5001edb8570ea65e019b1e981c07b",
+ "BINANCE|USDM|PERPETUAL|APTUSDT|BAR|1d|crypto_primary_v2": "c9001e88245a5387018d5626a46095f0acd7c66926292b958152f652502d9edb",
+ "BINANCE|USDM|PERPETUAL|ARBUSDT|BAR|1d|crypto_primary_v2": "8dd219af784ab5253d9c95b685d293bd2ef07df04697b209060deadbc5d82279",
+ "BINANCE|USDM|PERPETUAL|ARKMUSDT|BAR|1d|crypto_primary_v2": "8bcaae9122eda66c2a62c8aac4340777a3ebec2f84d98b8083e59bf265a0715c",
+ "BINANCE|USDM|PERPETUAL|ARUSDT|BAR|1d|crypto_primary_v2": "1fc1ac66452d5b58cc4f2112ba16ae86642a113c2bec8f84ca1ba9fde7744e6a",
+ "BINANCE|USDM|PERPETUAL|ARXUSDT|BAR|1d|crypto_primary_v2": "6b4b77a1d4d771f41863fc120c7669be66b69f7d93f72c48df63ba81f5fb916d",
+ "BINANCE|USDM|PERPETUAL|ASTERUSDT|BAR|1d|crypto_primary_v2": "9830cfa81835a144ccfd0b598e940b3f5764222d822a38f5d5b8017664fc7508",
+ "BINANCE|USDM|PERPETUAL|ATHUSDT|BAR|1d|crypto_primary_v2": "166dbe5725fc19d87442f19be55fd19a298ac43d055386d2917f2596faeef375",
+ "BINANCE|USDM|PERPETUAL|ATOMUSDT|BAR|1d|crypto_primary_v2": "c1181229cb0d3cbe8deab600976aac3cc4a973bcb1bd4a2bc8800724af693080",
+ "BINANCE|USDM|PERPETUAL|ATUSDT|BAR|1d|crypto_primary_v2": "f1af839eb3d188f9cc6b45df3fce1bcc98e43bdf7676e8ee27d8b5157ded5fb2",
+ "BINANCE|USDM|PERPETUAL|AUCTIONUSDT|BAR|1d|crypto_primary_v2": "de0bd4e928abfcbf4ace37129580fd8fbb1546e67cbfb0ec4995a97a8a522e9b",
+ "BINANCE|USDM|PERPETUAL|AUSDT|BAR|1d|crypto_primary_v2": "4a08dd8e030549cac512cdbb7aed2b517fe4d8a28fe4fbf3920127d64eef40d5",
+ "BINANCE|USDM|PERPETUAL|AVAXUSDT|BAR|1d|crypto_primary_v2": "4fa4d07078713fbc34752ed2f4c65cf1ae508b2accb7511d9e123e65ed1b2345",
+ "BINANCE|USDM|PERPETUAL|AVNTUSDT|BAR|1d|crypto_primary_v2": "4dd7cdf1d7b758c09967007c909cb2482d07520d956ca0d16c4fee63936c0c55",
+ "BINANCE|USDM|PERPETUAL|AXSUSDT|BAR|1d|crypto_primary_v2": "2feb554cd7e279e9589d4ff568af59d369cb6d03bd1aed63dd7ecb979429ce45",
+ "BINANCE|USDM|PERPETUAL|AZTECUSDT|BAR|1d|crypto_primary_v2": "ab772ff1920d5a5efef0c027765151824b0cc347ee35d8306320c72ad0569c65",
+ "BINANCE|USDM|PERPETUAL|BABYUSDT|BAR|1d|crypto_primary_v2": "ec020336941b3a40eba82cbf9debf1318e8c43fe03ffe843bfc8e50feede2b07",
+ "BINANCE|USDM|PERPETUAL|BANDUSDT|BAR|1d|crypto_primary_v2": "50ce38b961d58e72fc718fba872bfe9594bf40a7cb3d12b5764536e65a2a6a3d",
+ "BINANCE|USDM|PERPETUAL|BARDUSDT|BAR|1d|crypto_primary_v2": "f077bc44143536faac409deebb2de890987b0953bee5679c099e2837de54644c",
+ "BINANCE|USDM|PERPETUAL|BASEDUSDT|BAR|1d|crypto_primary_v2": "53ed9bc40664fa059fe4656581ca27dc91a0504d47882839c147f0bf36e27c1a",
+ "BINANCE|USDM|PERPETUAL|BATUSDT|BAR|1d|crypto_primary_v2": "1e7cc509cdc2cdc1a0f91183a0c3483094dbfeccc033cffcaf02c06218cec39b",
+ "BINANCE|USDM|PERPETUAL|BCHUSDT|BAR|1d|crypto_primary_v2": "b69fd64694db989eb87fb966d9000ce681f4d117e37c0f28f42ebde96c0d185d",
+ "BINANCE|USDM|PERPETUAL|BEATUSDT|BAR|1d|crypto_primary_v2": "a7c6d7f79c06e1e5e3b73a605d8f555faa63e5b43780a90e2e03b3afb8267393",
+ "BINANCE|USDM|PERPETUAL|BERAUSDT|BAR|1d|crypto_primary_v2": "ef549b5e250fbe1dae2aefdecec5a4d105cc00cbf459ba2fa90e0e9b1c73042c",
+ "BINANCE|USDM|PERPETUAL|BICOUSDT|BAR|1d|crypto_primary_v2": "c52bec459cb22d03bca5bcdb6d5dc082d5584d1b86c2d38ea3a093a4e008d40c",
+ "BINANCE|USDM|PERPETUAL|BIGTIMEUSDT|BAR|1d|crypto_primary_v2": "5305c54adf6c28b8a323cdaa0ec53c5043bc4b4d1478845b6da6075e077e34c4",
+ "BINANCE|USDM|PERPETUAL|BILLUSDT|BAR|1d|crypto_primary_v2": "7ce83b12997709dc90fe4f403b562a6a041f26370918ed8f898b63f5b062ed8e",
+ "BINANCE|USDM|PERPETUAL|BIOUSDT|BAR|1d|crypto_primary_v2": "7c448c6a5e5aaa53c57cc3d3c9b153ce2188b5a72fffe34e4a7621288f9f8197",
+ "BINANCE|USDM|PERPETUAL|BLURUSDT|BAR|1d|crypto_primary_v2": "f629183762d220af6314477212de95f785804e1cd6ba552e26e7ece8eec873dd",
+ "BINANCE|USDM|PERPETUAL|BOMEUSDT|BAR|1d|crypto_primary_v2": "43e7a7ce36f839e4512307c9e533d593e374ad541d385f52130aacea97d3cee9",
+ "BINANCE|USDM|PERPETUAL|BRETTUSDT|BAR|1d|crypto_primary_v2": "8e2fc9f507fe8b16765dae04a40feaf72c50f8dbb662421aa53abe4a9edce951",
+ "BINANCE|USDM|PERPETUAL|BREVUSDT|BAR|1d|crypto_primary_v2": "66826d1d500cb81de3a989a21c2b652cab92735c17099931518c0c0c8bfa38ce",
+ "BINANCE|USDM|PERPETUAL|BSBUSDT|BAR|1d|crypto_primary_v2": "5eab520f10bd076fc794abd274ef9519da0a541b308814ca22f2fe8cec8f17d6",
+ "BINANCE|USDM|PERPETUAL|CAPUSDT|BAR|1d|crypto_primary_v2": "a17e49de6d87ac6af20be16460afa850835f22a717b3de1036e394721f023b66",
+ "BINANCE|USDM|PERPETUAL|CCUSDT|BAR|1d|crypto_primary_v2": "aeeb0735a1f104e7afd4804bfae3d12f5d483801842c752d8432b93d3b0211f9",
+ "BINANCE|USDM|PERPETUAL|CELOUSDT|BAR|1d|crypto_primary_v2": "7800c508d74a27f3ed0bdb2808705324d05f9bcf5c48392c433e0582bedac633",
+ "BINANCE|USDM|PERPETUAL|CFXUSDT|BAR|1d|crypto_primary_v2": "ac7979b19e40e0dd1ead06f452e06b3e6a79d8d0ecb34aa1139a29c2ebc8356e",
+ "BINANCE|USDM|PERPETUAL|CHIPUSDT|BAR|1d|crypto_primary_v2": "350243c29a24272189c5a00bc36d9374ba9aaeb347523329a45a43d1198d19d2",
+ "BINANCE|USDM|PERPETUAL|CHZUSDT|BAR|1d|crypto_primary_v2": "35df574e16e1728fa43310b0361d92e930413700a03f4ff1f55718a592ec0526",
+ "BINANCE|USDM|PERPETUAL|COAIUSDT|BAR|1d|crypto_primary_v2": "7d707a2aa3a90641bd90ad064ef3576a36fb6bfb96acc603a2dbd2b6bc99fa3d",
+ "BINANCE|USDM|PERPETUAL|COMPUSDT|BAR|1d|crypto_primary_v2": "a7f786459e2df9c8bc6bd0db2d2fb7f1e1f9aabc88ed90895bc037262438ab4e",
+ "BINANCE|USDM|PERPETUAL|CRVUSDT|BAR|1d|crypto_primary_v2": "5a4b9af2cfd4dc0656c0421ae28659968c2ce0e194f7f5a9a69b49e9219d78ee",
+ "BINANCE|USDM|PERPETUAL|CVXUSDT|BAR|1d|crypto_primary_v2": "790d69c343e0b52a740d380f2fd1b89f34ec230cf26e6dd21317064e62843eee",
+ "BINANCE|USDM|PERPETUAL|DASHUSDT|BAR|1d|crypto_primary_v2": "007928c01d3291dc480139695df8ff11349f7972e367642a1abd4b702d545ef7",
+ "BINANCE|USDM|PERPETUAL|DOODUSDT|BAR|1d|crypto_primary_v2": "4266a3844a836207f780529feadce01d4eb81e260f95e7320d0a52c9eeb350f4",
+ "BINANCE|USDM|PERPETUAL|DOSUSDT|BAR|1d|crypto_primary_v2": "080c072b1cddd3f0fbd212d74881f6dadaa3965cd7217d83ffdd0a92d6848891",
+ "BINANCE|USDM|PERPETUAL|DOTUSDT|BAR|1d|crypto_primary_v2": "12adff8134f38c4c4f95d374c5f1b4d7a8bb678f7ace90e208c0b377b37041de",
+ "BINANCE|USDM|PERPETUAL|DYDXUSDT|BAR|1d|crypto_primary_v2": "3e2b245b4e34a9f5b1f28e07b361a87b3ffd094c976a1736570252a4e415fd55",
+ "BINANCE|USDM|PERPETUAL|EDENUSDT|BAR|1d|crypto_primary_v2": "c202b3270b87ce23c3eff3683a3a107ba9c3e2b3265db026895092261e6810fb",
+ "BINANCE|USDM|PERPETUAL|EDGEUSDT|BAR|1d|crypto_primary_v2": "ac760e4026b91165f270ed8f1749bbf483b37b053972b720445aa5f8b56724ab",
+ "BINANCE|USDM|PERPETUAL|EGLDUSDT|BAR|1d|crypto_primary_v2": "a29de15d44d2bc4f0ecf53c36ba88f3b81fb9df68a4527a9a2247ae1170304eb",
+ "BINANCE|USDM|PERPETUAL|EIGENUSDT|BAR|1d|crypto_primary_v2": "0f351a1a01ef6c471017e5e115072e517ca4f1d7206e40a1054895bbfe1a539f",
+ "BINANCE|USDM|PERPETUAL|ENAUSDT|BAR|1d|crypto_primary_v2": "b4c77a9811f7f7a9486eb594035c44a5d2fc0dce357e0188994cd633c4068a88",
+ "BINANCE|USDM|PERPETUAL|ENJUSDT|BAR|1d|crypto_primary_v2": "3aa4eaed5e38537707aa198ebad3466f0759b3e0ffbda8a5f7e3d0b5ec06642b",
+ "BINANCE|USDM|PERPETUAL|ENSOUSDT|BAR|1d|crypto_primary_v2": "71267c6865defc53b8bd060dbded0f6a350e76b7b02c12f2845f0ae50c10d2f3",
+ "BINANCE|USDM|PERPETUAL|ENSUSDT|BAR|1d|crypto_primary_v2": "634ce544eb6be9e4f5f46164877dadf9b63e86bddb7a7463d5fba334f978b79c",
+ "BINANCE|USDM|PERPETUAL|ESPUSDT|BAR|1d|crypto_primary_v2": "173ef6890412961eb6a964eaba2445c788fe23772da34a147198cadaebdd346d",
+ "BINANCE|USDM|PERPETUAL|ETCUSDT|BAR|1d|crypto_primary_v2": "5ec8d6b0b9772e214741ad478fda8669868dbf4295521bf06540eb96f445bb20",
+ "BINANCE|USDM|PERPETUAL|ETHFIUSDT|BAR|1d|crypto_primary_v2": "8f8bfd4042d13e7ef6713bf00b8e0f93ac25a17dcd906854621fb3cebcd459d2",
+ "BINANCE|USDM|PERPETUAL|ETHWUSDT|BAR|1d|crypto_primary_v2": "9f0f8a5482590439a5ddcf0acd913bf23679bc2d07fe19aec50b1332a4d19fd8",
+ "BINANCE|USDM|PERPETUAL|FARTCOINUSDT|BAR|1d|crypto_primary_v2": "2542e0c7ea755a7ddceb6ddc6b8c16c1503abb2bfce11eaa45bc4fb05b83ee70",
+ "BINANCE|USDM|PERPETUAL|FILUSDT|BAR|1d|crypto_primary_v2": "ddb0d20e009dacb00386a6bfdb37608c49acf447cbeab5ca4012a186fa7d090e",
+ "BINANCE|USDM|PERPETUAL|FLOWUSDT|BAR|1d|crypto_primary_v2": "663f7e9e29ae39a1b6da68a0f5eb0d8ae35be37177965dcf44d8d9252ef1a244",
+ "BINANCE|USDM|PERPETUAL|FOGOUSDT|BAR|1d|crypto_primary_v2": "9aa619bb00a5f1e5cbfb20bd2d45d50d271d924541354afe7b56c837ab831012",
+ "BINANCE|USDM|PERPETUAL|FUSDT|BAR|1d|crypto_primary_v2": "5c370bd7ac9da389af2b33e1848290b5672b4206f56851aab3666b1c46e87423",
+ "BINANCE|USDM|PERPETUAL|GALAUSDT|BAR|1d|crypto_primary_v2": "cee7232d8ba151198ad82634fb82591230409906c31e48f5aa4491e3f6d6d9d3",
+ "BINANCE|USDM|PERPETUAL|GASUSDT|BAR|1d|crypto_primary_v2": "958509f1bc172100e0c21e2358086da2150361d948b08355cc0eeabf8b6f64bc",
+ "BINANCE|USDM|PERPETUAL|GIGGLEUSDT|BAR|1d|crypto_primary_v2": "f05ba2754e416b90ce1e25a7eca11f8530472ba4f76c3ff4afde30b26b2ed7d8",
+ "BINANCE|USDM|PERPETUAL|GLMUSDT|BAR|1d|crypto_primary_v2": "cc3db8318abb8fc4da99ad09c24972060b1c8c48ff9910a5f31b35117b981696",
+ "BINANCE|USDM|PERPETUAL|GMTUSDT|BAR|1d|crypto_primary_v2": "0d01fb604238484c925d02f19331763fb25e70e04ef0100f083921e8c4fd6da6",
+ "BINANCE|USDM|PERPETUAL|GMXUSDT|BAR|1d|crypto_primary_v2": "62d317b8c8f1b7b47b26410bef738d5c1fb3f87b81a1bc8441e37080f2251f49",
+ "BINANCE|USDM|PERPETUAL|GPSUSDT|BAR|1d|crypto_primary_v2": "1cf97bc0802baab8fdcb8df813b856af9aa81b4be05651525d9dfdd04c8236fe",
+ "BINANCE|USDM|PERPETUAL|GRAMUSDT|BAR|1d|crypto_primary_v2": "e2e1b422677d98b65aea10282069a0e9d5341051786747230ae664801a2d565c",
+ "BINANCE|USDM|PERPETUAL|GRASSUSDT|BAR|1d|crypto_primary_v2": "15d662230da46cecb8832b6ee78a58bc0d6db6d8ce5a1ab7605f9654076f0152",
+ "BINANCE|USDM|PERPETUAL|GRTUSDT|BAR|1d|crypto_primary_v2": "60ec7e6ec445a7c23d268d895ffd8d3e4e249db894541c3bf18ae91c50026015",
+ "BINANCE|USDM|PERPETUAL|GRVTUSDT|BAR|1d|crypto_primary_v2": "df29b23cea307eaea632cbeb7e4183e7b78fc40458d8001369a35eef106f76e3",
+ "BINANCE|USDM|PERPETUAL|HBARUSDT|BAR|1d|crypto_primary_v2": "ecfcc39d0505ffa0d7dfcf679833e7131bf4b08f349142302306f91d86ce8dfd",
+ "BINANCE|USDM|PERPETUAL|HMSTRUSDT|BAR|1d|crypto_primary_v2": "4971ddf2cc6580b5c465263d24bcd222bc7bd17e28776df5305d594f0bfaa1ef",
+ "BINANCE|USDM|PERPETUAL|HOMEUSDT|BAR|1d|crypto_primary_v2": "db14c8da52f4939fbc1beb139aa4a3f82708af0414c162c230233142183942fd",
+ "BINANCE|USDM|PERPETUAL|HUMAUSDT|BAR|1d|crypto_primary_v2": "8cd27043b92edf38a0720940a7db932617b6e63d4a1b239b53e84c6abe06a74d",
+ "BINANCE|USDM|PERPETUAL|HUSDT|BAR|1d|crypto_primary_v2": "9a55f26a83b6c1af85fa77fcddabba6c66967935b121f982fda54810b9f014d7",
+ "BINANCE|USDM|PERPETUAL|HYPEUSDT|BAR|1d|crypto_primary_v2": "8d73bd38b6e43a3521e701d413926b50e30adfc142134f8d2e3591e274204607",
+ "BINANCE|USDM|PERPETUAL|ICPUSDT|BAR|1d|crypto_primary_v2": "df624435f456a2179b88e4811cee0a48f555848e6084f5670fef0ad94d476edd",
+ "BINANCE|USDM|PERPETUAL|IMXUSDT|BAR|1d|crypto_primary_v2": "cf5d2bfee8b0b67ffd2518cab0b0751575e0c68344f9125cd8fb03b5746dd0e9",
+ "BINANCE|USDM|PERPETUAL|INITUSDT|BAR|1d|crypto_primary_v2": "2ac3eebf2c6c68ecca49e7b07f5ebf3c06b7a04f951f499f7bc01f7d7db58d7e",
+ "BINANCE|USDM|PERPETUAL|INJUSDT|BAR|1d|crypto_primary_v2": "4bdf20a2762920b5e8f1cab2702383fe12b51cef9efd2d8938be82feaa93ef55",
+ "BINANCE|USDM|PERPETUAL|IOSTUSDT|BAR|1d|crypto_primary_v2": "cdb7946d1b23e0d196db9989398c1717b9c7ba5afb76d2419b1bdb1c29b14f06",
+ "BINANCE|USDM|PERPETUAL|IOTAUSDT|BAR|1d|crypto_primary_v2": "98df0586b2a2cbc9a0e2c0d58e3c71db9f0ec24e7099fc576a994ed12269a151",
+ "BINANCE|USDM|PERPETUAL|IRYSUSDT|BAR|1d|crypto_primary_v2": "95453eb3e3642dafe038efacf6a76ddba617eb5011da7c50c66a7a4021109261",
+ "BINANCE|USDM|PERPETUAL|JELLYJELLYUSDT|BAR|1d|crypto_primary_v2": "6e35c3a1e32a2317ee4546183e3e8a0df85cf78001c2bf1ae98c49950fa4dc0c",
+ "BINANCE|USDM|PERPETUAL|JTOUSDT|BAR|1d|crypto_primary_v2": "8fd61613033ed72805b70f4eb72204adc4c6e4897c50c989e482c7592df10cf0",
+ "BINANCE|USDM|PERPETUAL|JUPUSDT|BAR|1d|crypto_primary_v2": "65b8ddecd38fb71af7f7d542c6c988d505e6915def767cdad503e4c49b0c5a0d",
+ "BINANCE|USDM|PERPETUAL|KAITOUSDT|BAR|1d|crypto_primary_v2": "5c0fc3cc9d3401a9df737b83cea78da6072eab0873ad16f77d89e9de011ed3bb",
+ "BINANCE|USDM|PERPETUAL|KATUSDT|BAR|1d|crypto_primary_v2": "6cb8368c3999ea3c0371bc5d6a2258a2bc5c58145477c0bcac1fd4c35c490217",
+ "BINANCE|USDM|PERPETUAL|KGENUSDT|BAR|1d|crypto_primary_v2": "46382bb48e3955a4aee7bca88ae08ca0204e5074f4cd2eebc230fb3f6225f621",
+ "BINANCE|USDM|PERPETUAL|KITEUSDT|BAR|1d|crypto_primary_v2": "e72ad482406161b9e1e5b89d8cc7c55480bffb73a3258db59727bf21f1dbd2ac",
+ "BINANCE|USDM|PERPETUAL|KMNOUSDT|BAR|1d|crypto_primary_v2": "9ec9a53400065f57e1ca578057c34775db3505a7dc5af5c858be5105d26eb971",
+ "BINANCE|USDM|PERPETUAL|KSMUSDT|BAR|1d|crypto_primary_v2": "850743e3bfa09ba15fde55c69828cfb5b327ec2af7479b22619abf6ade8e1e93",
+ "BINANCE|USDM|PERPETUAL|LABUSDT|BAR|1d|crypto_primary_v2": "a670049c6f65fbc8ce27996efd47e1e9d67c1b4f4875869516cbf739c5971fc3",
+ "BINANCE|USDM|PERPETUAL|LAUSDT|BAR|1d|crypto_primary_v2": "9defa8bcea18d6c550a66034a044a13ca402feed0c80cb4f62a2fcae2c6c2667",
+ "BINANCE|USDM|PERPETUAL|LAYERUSDT|BAR|1d|crypto_primary_v2": "a7f22aa8571af9f45eb2654a28067ced89237b6a2185829a9ebab1890f48c37c",
+ "BINANCE|USDM|PERPETUAL|LDOUSDT|BAR|1d|crypto_primary_v2": "a8e5932ce896cc461b980232428145384c3f50075a0bdc3d0dd1ebe64cea9bc0",
+ "BINANCE|USDM|PERPETUAL|LINEAUSDT|BAR|1d|crypto_primary_v2": "3fbcb426edc85dd63edcefab957a75f781391db3e91010af289797dfb2eca33a",
+ "BINANCE|USDM|PERPETUAL|LINKUSDT|BAR|1d|crypto_primary_v2": "78188bd32cb90c6f0da33ed6b037bfe6be339277c4cad205da57c547963d8a15",
+ "BINANCE|USDM|PERPETUAL|LITUSDT|BAR|1d|crypto_primary_v2": "3b731d211bedc6e9cb211763e95c779a9654db3bf35de82e4429961d8956522a",
+ "BINANCE|USDM|PERPETUAL|LPTUSDT|BAR|1d|crypto_primary_v2": "39d81d01e0891e33c42feaf302ad52f60f058e4f74d53bc9dec9b49b6bb1b64c",
+ "BINANCE|USDM|PERPETUAL|LQTYUSDT|BAR|1d|crypto_primary_v2": "5717b87304ae2ef25be0bbb30b370a949a92bfb6e287aaa1891780cbfd6fbf68",
+ "BINANCE|USDM|PERPETUAL|LTCUSDT|BAR|1d|crypto_primary_v2": "174050e079fe38df952118c89c65c6bab28295dbdefbd1f5418a0003ca378a14",
+ "BINANCE|USDM|PERPETUAL|MAGICUSDT|BAR|1d|crypto_primary_v2": "2f381da3e39bcd7c737b88ba753004cf96b6dac6064518b5a7f16b100c54a711",
+ "BINANCE|USDM|PERPETUAL|MANAUSDT|BAR|1d|crypto_primary_v2": "b7a163d94e4e300a55af6f5cf5b096817e7c154c1bf9cbd6e2b861dabf26c46c",
+ "BINANCE|USDM|PERPETUAL|MASKUSDT|BAR|1d|crypto_primary_v2": "34630fbf565ab64cb30779f2cd4331b3ae47c888f903f7940e0067af91ee26c5",
+ "BINANCE|USDM|PERPETUAL|MEGAUSDT|BAR|1d|crypto_primary_v2": "92a74159456ba67cf5d8166e9023927b30547e97dce901b27e3fa9a50af0064c",
+ "BINANCE|USDM|PERPETUAL|MEMEUSDT|BAR|1d|crypto_primary_v2": "e84240c6b8dce5c6ec1939f041600713ff8a9594c10669304e123a74b8cbd697",
+ "BINANCE|USDM|PERPETUAL|MERLUSDT|BAR|1d|crypto_primary_v2": "903064b1869121487a72a31515701f80d20063baaeac8ba43898c8bb86a91429",
+ "BINANCE|USDM|PERPETUAL|METISUSDT|BAR|1d|crypto_primary_v2": "158b1d9e047f8e5135b0e0a83b66cc9bfd9357939de9fcbd19f197c286656d6a",
+ "BINANCE|USDM|PERPETUAL|METUSDT|BAR|1d|crypto_primary_v2": "de1841c46c240a83e98cb835056d91581cd44f2bb125fb5b0c391cbbf2dcbc4d",
+ "BINANCE|USDM|PERPETUAL|MEUSDT|BAR|1d|crypto_primary_v2": "f7d043676c01bc948db073f6a753d42b4d8a2dd6d5c61977d1679d5e9f304352",
+ "BINANCE|USDM|PERPETUAL|MEWUSDT|BAR|1d|crypto_primary_v2": "c17ad357d3bd986ae993db34a04ad6dff2788d9ab6caa86e1a90fc9ec1be27b5",
+ "BINANCE|USDM|PERPETUAL|MINAUSDT|BAR|1d|crypto_primary_v2": "f4e6d205a1d3a66c8950058080e4f00ff9710f2811b350f0d4f390a18bd161a6",
+ "BINANCE|USDM|PERPETUAL|MMTUSDT|BAR|1d|crypto_primary_v2": "cd08e603750948973296f8167d304eab543707ffad330ddaa2b718700bae1df7",
+ "BINANCE|USDM|PERPETUAL|MONUSDT|BAR|1d|crypto_primary_v2": "e10d9eebcb982acfd350150951fb8b52d0e4543279068324148c5c56d8c57f78",
+ "BINANCE|USDM|PERPETUAL|MOODENGUSDT|BAR|1d|crypto_primary_v2": "6a6b385b61b275702a007870e4c634d3e5551a4814d6b9d9df8b2f7ae285ade8",
+ "BINANCE|USDM|PERPETUAL|MORPHOUSDT|BAR|1d|crypto_primary_v2": "8f48ecf798900f9dd499918dc6b765ac1636bba40bd485d8f4eec88deb18e405",
+ "BINANCE|USDM|PERPETUAL|MOVEUSDT|BAR|1d|crypto_primary_v2": "90d6791abbe472973f513c418cad520b9647970ecb065fc4e7626d6ba45d6abb",
+ "BINANCE|USDM|PERPETUAL|MUBARAKUSDT|BAR|1d|crypto_primary_v2": "309ba0afb2be5cf3b9c695d5902b5149fdd34e1386b1864471ee1c6fe04b2919",
+ "BINANCE|USDM|PERPETUAL|NEARUSDT|BAR|1d|crypto_primary_v2": "3602faf1519ef29ca1e742577715d4cf1971e378915198aa95a527103bde764e",
+ "BINANCE|USDM|PERPETUAL|NEIROUSDT|BAR|1d|crypto_primary_v2": "fdd4a6e28290ee843f8258da0649b29fd17141501c02ff9ec8e74925d9357592",
+ "BINANCE|USDM|PERPETUAL|NEOUSDT|BAR|1d|crypto_primary_v2": "11b398c9040ca362cc0750e84b3c3f24afd8bf1f88d45e4301423587b9ebfab1",
+ "BINANCE|USDM|PERPETUAL|NIGHTUSDT|BAR|1d|crypto_primary_v2": "1f7c85da2fe366f3121b2b9726f26841b811c4fe607cf5971c7c06903a1bfc85",
+ "BINANCE|USDM|PERPETUAL|NMRUSDT|BAR|1d|crypto_primary_v2": "ee0940f2eebcd7731a59d10b61d6b271c67e91992a89ee467fe2b21ef35a8a35",
+ "BINANCE|USDM|PERPETUAL|NOTUSDT|BAR|1d|crypto_primary_v2": "42e4450fc28eec2c4ae1773b71393aeee381cd089edcf9c88faef44dee24f986",
+ "BINANCE|USDM|PERPETUAL|ONDOUSDT|BAR|1d|crypto_primary_v2": "ae4b1522bde4b0b272fc2fa9ffe2973cc7f6e04ff86750a9fd6c2734d2ee74b3",
+ "BINANCE|USDM|PERPETUAL|ONEUSDT|BAR|1d|crypto_primary_v2": "369e7aa2f1a6c5b810b2498efdf429de6dd9f591c014915bd8a84a884186bc2b",
+ "BINANCE|USDM|PERPETUAL|ONTUSDT|BAR|1d|crypto_primary_v2": "51b71dd811f293db36f819e0d198ceaafed72f64bf03ec95d11062c5913ec292",
+ "BINANCE|USDM|PERPETUAL|ONUSDT|BAR|1d|crypto_primary_v2": "40ec57f415a09e93f86a58ace12e7d8e6bcca77361c81ecea91578eb1912ae39",
+ "BINANCE|USDM|PERPETUAL|OPGUSDT|BAR|1d|crypto_primary_v2": "be139568a815af7d16c4cb53742f12b2ffaa4c4aa445b3f885087bdd6e021931",
+ "BINANCE|USDM|PERPETUAL|OPNUSDT|BAR|1d|crypto_primary_v2": "538fb126b4e1d6cf9d52cb38a0ca6299ce97071482357fca7902627ea1cf07df",
+ "BINANCE|USDM|PERPETUAL|OPUSDT|BAR|1d|crypto_primary_v2": "5a1562709b98b12a7a6f2fc1b71496caa5740a2c6c76c44bcfb9282321c5686f",
+ "BINANCE|USDM|PERPETUAL|ORDERUSDT|BAR|1d|crypto_primary_v2": "0a437282d6df17d5d8ec7aee814faf5cae3c7dad7860ad09bcf19c75519c2928",
+ "BINANCE|USDM|PERPETUAL|ORDIUSDT|BAR|1d|crypto_primary_v2": "d879ad54bad8c2f3626fc3cd30c2a59e321e23525b4e73db08ed8b3ed62978c8",
+ "BINANCE|USDM|PERPETUAL|OUSDT|BAR|1d|crypto_primary_v2": "3216de7cadcbdff48f0937b17d5632e175b5f94570878b11a6015a4a96605d6a",
+ "BINANCE|USDM|PERPETUAL|PENDLEUSDT|BAR|1d|crypto_primary_v2": "1b9c91270bbb0c274c7320d10144891542867cd5f88f152967b0f495d9e912f9",
+ "BINANCE|USDM|PERPETUAL|PENGUUSDT|BAR|1d|crypto_primary_v2": "d416cf81a2d7e283a0bce378ffe01873468b78084bf37d83d3e389fc05f91e0f",
+ "BINANCE|USDM|PERPETUAL|PEOPLEUSDT|BAR|1d|crypto_primary_v2": "a04c599a0929051f5262dc761413b00fb01342bc9f1d70c898736840c28d23ea",
+ "BINANCE|USDM|PERPETUAL|PIEVERSEUSDT|BAR|1d|crypto_primary_v2": "679cafd31336b1c8b628f746a65240851aa08ecf40052515bc28b011d0739245",
+ "BINANCE|USDM|PERPETUAL|PIPPINUSDT|BAR|1d|crypto_primary_v2": "290961f32332d118be311eccc36ae287ae61c042be921178b4579cdfabe0c15c",
+ "BINANCE|USDM|PERPETUAL|PLUMEUSDT|BAR|1d|crypto_primary_v2": "bcd18f92ee09bcd58aca296a526079e8bb8a04eacadbe59fb11b357f657e92ba",
+ "BINANCE|USDM|PERPETUAL|PNUTUSDT|BAR|1d|crypto_primary_v2": "0666d08320123e91ed7800f71ca66b4b7046e5c717287ecbfc90e0e1364e3901",
+ "BINANCE|USDM|PERPETUAL|POLUSDT|BAR|1d|crypto_primary_v2": "e0f6a5b9dcf46017ffc7a1f845c30726915ae95043ffebe3a70f417c64d199e1",
+ "BINANCE|USDM|PERPETUAL|POPCATUSDT|BAR|1d|crypto_primary_v2": "1239eb67a4f595abbf20fec0612c2f2a4d68cbb403a9c0e5d95686ebb861529c",
+ "BINANCE|USDM|PERPETUAL|PROVEUSDT|BAR|1d|crypto_primary_v2": "64e314ce48313a0c51db3c9f282641e589466e0de1c2a6cf4b0c8d29ee0e7bbd",
+ "BINANCE|USDM|PERPETUAL|PUMPUSDT|BAR|1d|crypto_primary_v2": "3402391fbc642e7de4df7b762d6f99d67c4602da12656924f6ff37e33fbc1d5e",
+ "BINANCE|USDM|PERPETUAL|PYTHUSDT|BAR|1d|crypto_primary_v2": "c9a0d79a631b8a216899fba21f5d42404671be94afc316c15e2756669aa942be",
+ "BINANCE|USDM|PERPETUAL|QNTUSDT|BAR|1d|crypto_primary_v2": "2aec05875665744a99d6d8f5c40d92c5569e267f55fbd35ea2317d76ab5531bd",
+ "BINANCE|USDM|PERPETUAL|QTUMUSDT|BAR|1d|crypto_primary_v2": "d6891211352d1c9f2627a9a7b857b8ec6f778c349943a30cac263d9eb98a12ef",
+ "BINANCE|USDM|PERPETUAL|RAVEUSDT|BAR|1d|crypto_primary_v2": "306221705914c9f8b5c4f6db3c374710d3b05f8d3ce9c6640477689450d0f5be",
+ "BINANCE|USDM|PERPETUAL|RECALLUSDT|BAR|1d|crypto_primary_v2": "09453dc77fa4522a3dcb1d142f9efce7cf0001d25dad49e1a59703c9367f4500",
+ "BINANCE|USDM|PERPETUAL|RENDERUSDT|BAR|1d|crypto_primary_v2": "2fcc52e79e86d8b2a437e3c521eeecf39ced82560aeb9e5a8165eef46b71dca6",
+ "BINANCE|USDM|PERPETUAL|RESOLVUSDT|BAR|1d|crypto_primary_v2": "7c6c0cec3335cca6e0d14686d11c973245c07e482416e4dd6ea8f71ebdb45e8e",
+ "BINANCE|USDM|PERPETUAL|REUSDT|BAR|1d|crypto_primary_v2": "b1cd5c0dc9ff38f8e3ceb99fb61552d18d7ca0b7752563581b03d1121b74e623",
+ "BINANCE|USDM|PERPETUAL|RIVERUSDT|BAR|1d|crypto_primary_v2": "f07a8e490878581046485a8104d5a0161aab562610577a833b911480ec974294",
+ "BINANCE|USDM|PERPETUAL|ROBOUSDT|BAR|1d|crypto_primary_v2": "4572887c3d252fb9820ab6ca63f9b81814c2c29639ad6bef6b061264a8402f5f",
+ "BINANCE|USDM|PERPETUAL|RSRUSDT|BAR|1d|crypto_primary_v2": "804382aa1fc60ab234f85b0280464b0761277b3c0018a4278559a9719d04f5ca",
+ "BINANCE|USDM|PERPETUAL|RVNUSDT|BAR|1d|crypto_primary_v2": "39c7b51ec5f3b40d35c4ba2b59166f224c480bc2ce4a487541de8fadcebd90d6",
+ "BINANCE|USDM|PERPETUAL|SAHARAUSDT|BAR|1d|crypto_primary_v2": "1a00751b226639e99c6703630bd07ae2a123410d495aaf649129e934b4539d14",
+ "BINANCE|USDM|PERPETUAL|SANDUSDT|BAR|1d|crypto_primary_v2": "e1dbdd6e99220a7023bf3dc2f27e3e928cb377f176355d60cf680907d0e561ff",
+ "BINANCE|USDM|PERPETUAL|SAPIENUSDT|BAR|1d|crypto_primary_v2": "0ef98273314c69fd42d2ace3a115e8f64b63ab9a80147f294564982021132494",
+ "BINANCE|USDM|PERPETUAL|SEIUSDT|BAR|1d|crypto_primary_v2": "dcbdec96ebfbd4df1cf1596f7b57187430874904b50abf888690544b71a45fcd",
+ "BINANCE|USDM|PERPETUAL|SENTUSDT|BAR|1d|crypto_primary_v2": "5382ac205e42e02d46197c5d979c943d55288cb418ee60fd4ffc7963f1c6443a",
+ "BINANCE|USDM|PERPETUAL|SIGNUSDT|BAR|1d|crypto_primary_v2": "35d2a45b436ec41c9e32f41a41a6bd6d1730f9cfe19d72792586d83a9fae7cff",
+ "BINANCE|USDM|PERPETUAL|SKYUSDT|BAR|1d|crypto_primary_v2": "154df920ad504dbb54e565a2068f712e5cacae167d7f46b1dc85d9d7a97e0c81",
+ "BINANCE|USDM|PERPETUAL|SLXUSDT|BAR|1d|crypto_primary_v2": "36e57474afca67b64c3ec482c23f9eb575ff5696efe974a2103a7675c8b79494",
+ "BINANCE|USDM|PERPETUAL|SNXUSDT|BAR|1d|crypto_primary_v2": "a534530f2f80c72534534795b2426f5e5062dd64d4603e4b11d06d90a74fa78f",
+ "BINANCE|USDM|PERPETUAL|SOONUSDT|BAR|1d|crypto_primary_v2": "4d4fb51e1bc0d195642b9eaeb4f05189b6845a457e5f713fcd7f3a8c5d4759c7",
+ "BINANCE|USDM|PERPETUAL|SOPHUSDT|BAR|1d|crypto_primary_v2": "a598125aeff5ade18936a6209c22f0e0c92e32eb4d47e22da500be68f80fda6c",
+ "BINANCE|USDM|PERPETUAL|SPACEUSDT|BAR|1d|crypto_primary_v2": "acb28cf2ce188bec54d477bd510e11a3d78d14d44ad4204ed05100f800fe3bee",
+ "BINANCE|USDM|PERPETUAL|SPKUSDT|BAR|1d|crypto_primary_v2": "0bb8a58fa0bdc01a9c80129d587c4a168ee10f6f33bb5913812b09be79f6650b",
+ "BINANCE|USDM|PERPETUAL|SPXUSDT|BAR|1d|crypto_primary_v2": "b511f824356e956de88179ce49bd6ea8deb5b61b830ec07622f2e79a80b83631",
+ "BINANCE|USDM|PERPETUAL|SSVUSDT|BAR|1d|crypto_primary_v2": "48db8523be0cd351be28024f21646c16b2d4ce6986f343d23d76d8bfd26609f1",
+ "BINANCE|USDM|PERPETUAL|STABLEUSDT|BAR|1d|crypto_primary_v2": "26b369d5ec38b1bfd178f189e0f7e46ff90316f90997bebfa2e0651f24a9d056",
+ "BINANCE|USDM|PERPETUAL|STRKUSDT|BAR|1d|crypto_primary_v2": "997eddae1dce1a4324f94eef55d2e9c0226fb17c309b4ced092dd6a8d008d360",
+ "BINANCE|USDM|PERPETUAL|STXUSDT|BAR|1d|crypto_primary_v2": "7c8ff890d8bfd14b1f7c46dd1661bf0faba4a3783008ac5d2dc5306622eee0bc",
+ "BINANCE|USDM|PERPETUAL|SUIUSDT|BAR|1d|crypto_primary_v2": "bcbbae6072ec8f808982cd2310138340b6a51f3d5c38d60441c52d492ee9101b",
+ "BINANCE|USDM|PERPETUAL|SUSDT|BAR|1d|crypto_primary_v2": "1067118bf9b49faab7401f07a4b7130669c1c6f6a0954f6a2d2553dc5650892b",
+ "BINANCE|USDM|PERPETUAL|SUSHIUSDT|BAR|1d|crypto_primary_v2": "f3f6c48d75fdf6ed89b6799f54848fb11b5b5ab41a3e9dfd1320a049decb9bd1",
+ "BINANCE|USDM|PERPETUAL|SYRUPUSDT|BAR|1d|crypto_primary_v2": "2a9bab3804ed605637362dc315e2336bb001420968e28404357b4f3d6d50ff99",
+ "BINANCE|USDM|PERPETUAL|TAOUSDT|BAR|1d|crypto_primary_v2": "fb5e8ced4c601e46c1af93579a952439ed8195bc189762b86079fe3825d380a0",
+ "BINANCE|USDM|PERPETUAL|THETAUSDT|BAR|1d|crypto_primary_v2": "2db1fdb39820a21a916fc1e11a15643717f1fec196d15cfb22bae11e702acf1c",
+ "BINANCE|USDM|PERPETUAL|TIAUSDT|BAR|1d|crypto_primary_v2": "9d35932af8033dec2216c16be775eca6f76023c7bd9caaba1d52001acd03dc71",
+ "BINANCE|USDM|PERPETUAL|TRBUSDT|BAR|1d|crypto_primary_v2": "d02d2d680528b22eb70270f62349d795514718d36e2023c35d31a0be4a2aa43c",
+ "BINANCE|USDM|PERPETUAL|TRIAUSDT|BAR|1d|crypto_primary_v2": "a899ff022bf249f43339f156e5eac0d29409e9ab512b5640d76424614d5e1ebf",
+ "BINANCE|USDM|PERPETUAL|TRUMPUSDT|BAR|1d|crypto_primary_v2": "5ba12d0d469ca25a6b2972df5e07cb541ceac015b9dffda5ece56dca443840cf",
+ "BINANCE|USDM|PERPETUAL|TRUSTUSDT|BAR|1d|crypto_primary_v2": "68dffe73b50d24a6723a71aa2927fe84d742e323e0375f1ba018c184ab642f76",
+ "BINANCE|USDM|PERPETUAL|TRUTHUSDT|BAR|1d|crypto_primary_v2": "892619b368fa201b99dd40bc89a7bfdc9cc02177072e43ae06a411a1c62d27a7",
+ "BINANCE|USDM|PERPETUAL|TRXUSDT|BAR|1d|crypto_primary_v2": "3f39119b87ca6ec866c16ea735efcc0e5fbb5d59694ac3845bd482b864ce9b26",
+ "BINANCE|USDM|PERPETUAL|TURBOUSDT|BAR|1d|crypto_primary_v2": "c5ca59ba7405db0a55022977c88e33d74df8a6e9d37d456f0d1fb554fb06826e",
+ "BINANCE|USDM|PERPETUAL|UBUSDT|BAR|1d|crypto_primary_v2": "d0dc52efac3ff3b4af51adad196f3b803b3ee58e74ced26d936874a559602bef",
+ "BINANCE|USDM|PERPETUAL|UMAUSDT|BAR|1d|crypto_primary_v2": "1a42ef7564e54d5f46664801ff716c44cea6170d2f81fede6ddef7d14f7bbcc4",
+ "BINANCE|USDM|PERPETUAL|UNIUSDT|BAR|1d|crypto_primary_v2": "1e4be76a792e0c7c8baf9e93f7b76e05c080835d4f523c3d01c87bb9bb5a41f3",
+ "BINANCE|USDM|PERPETUAL|USELESSUSDT|BAR|1d|crypto_primary_v2": "6f00c5b6ca48d672b1fa107dce21cb7c8a5a6bce8d4b7d3f79a22cc807b70242",
+ "BINANCE|USDM|PERPETUAL|VANAUSDT|BAR|1d|crypto_primary_v2": "4c7948bbd7413558c3d895793cf35c879b6db7f862628be78d06fddaadc28d25",
+ "BINANCE|USDM|PERPETUAL|VIRTUALUSDT|BAR|1d|crypto_primary_v2": "5876c4eb5797665b5e3c060ad432378da4a09a2c7057f633fcde397f9523482e",
+ "BINANCE|USDM|PERPETUAL|VVVUSDT|BAR|1d|crypto_primary_v2": "3ab737974fa0ecb5311e3d7f0e47e9717522e2ce153867577d3a2dcde8a4b13b",
+ "BINANCE|USDM|PERPETUAL|WALUSDT|BAR|1d|crypto_primary_v2": "032729362b6704e6f448b7a3b0ab124f2222544529f4f2a89528bf9ba6d3d87c",
+ "BINANCE|USDM|PERPETUAL|WCTUSDT|BAR|1d|crypto_primary_v2": "183d3e9b6672f56da79694ade819ebd73c84ae996b92878503eb6485ea7ba467",
+ "BINANCE|USDM|PERPETUAL|WETUSDT|BAR|1d|crypto_primary_v2": "554ca591c362be5fa70abcdae5261026ab72ae98fb603a8affc1f95e18375bc8",
+ "BINANCE|USDM|PERPETUAL|WIFUSDT|BAR|1d|crypto_primary_v2": "99222d1ba63426fcba4fe1cf3a0c108cbcd37c82551e688b8dea44cbff4310b8",
+ "BINANCE|USDM|PERPETUAL|WLDUSDT|BAR|1d|crypto_primary_v2": "b020bcf28db144bb668f3e6b7542920d853b7c4489e6b21ff16176abb68e0891",
+ "BINANCE|USDM|PERPETUAL|WLFIUSDT|BAR|1d|crypto_primary_v2": "d2c3143d6fd64923c89baa0b69e4ab0fae9634d1725bc0e2900776c9bcc101b6",
+ "BINANCE|USDM|PERPETUAL|WOOUSDT|BAR|1d|crypto_primary_v2": "80a52ac94332cfbc670a3eba2a37aab000e9cb3f54323018f66a0ffe8bee60aa",
+ "BINANCE|USDM|PERPETUAL|WUSDT|BAR|1d|crypto_primary_v2": "d6bfc57bd256d99c9e449f86fa2b08d5c7e934c460c459d43129d351113d8681",
+ "BINANCE|USDM|PERPETUAL|XLMUSDT|BAR|1d|crypto_primary_v2": "9134fbeaf011d827e0f975798c033592743011f55a3e1c1bc12dc4cf112ea943",
+ "BINANCE|USDM|PERPETUAL|XPLUSDT|BAR|1d|crypto_primary_v2": "47908104a81fee790caa6edbf2e4a8b55bf99c70fa61db23c9c9d5a8ffe84fb2",
+ "BINANCE|USDM|PERPETUAL|XRPUSDT|BAR|1d|crypto_primary_v2": "b4ddd0ba886960153b6aa7554f2585001061cd2e5fc9f2947b1913b5359ae7da",
+ "BINANCE|USDM|PERPETUAL|XTZUSDT|BAR|1d|crypto_primary_v2": "3b4eae53fac6ad962838779dfa7f78aabd7d3c9408002303ee18043e0ab8eba7",
+ "BINANCE|USDM|PERPETUAL|YBUSDT|BAR|1d|crypto_primary_v2": "302af71f3c2a1adaa68941dbea5c79ea54c2b9addd0617608b7b6e257fe07cde",
+ "BINANCE|USDM|PERPETUAL|YFIUSDT|BAR|1d|crypto_primary_v2": "ae8d0d4c9f816c9d4b4f1ae26847731e25ae382ff3ae700bd89dfc192c1e5e69",
+ "BINANCE|USDM|PERPETUAL|YGGUSDT|BAR|1d|crypto_primary_v2": "119f0d4380acc09c146efd223a53d5643d026d0dfaa48f6121ea0be0fc30993a",
+ "BINANCE|USDM|PERPETUAL|ZAMAUSDT|BAR|1d|crypto_primary_v2": "e918c71d8c50ce128aa87611d5529fcc6d7f0a9cd9132e8c36f33ad2fd112ca3",
+ "BINANCE|USDM|PERPETUAL|ZBTUSDT|BAR|1d|crypto_primary_v2": "af8e8f5697f0dfd6faa2493d3c765e3751fb3da2f26435135697fa0f9239684e",
+ "BINANCE|USDM|PERPETUAL|ZECUSDT|BAR|1d|crypto_primary_v2": "3b03d4e69832dda9d9ebd93b0f8c954e478143a18a8b0e0c1c662bed747dea14",
+ "BINANCE|USDM|PERPETUAL|ZENUSDT|BAR|1d|crypto_primary_v2": "8d2614a85018fe50727b6bc4f33c82f00c8a0f6b09b0e5b0e218498058ce2afb",
+ "BINANCE|USDM|PERPETUAL|ZETAUSDT|BAR|1d|crypto_primary_v2": "054b6f0a39787d2718bb73e950a07cdad7862a300bc3ff27d6e69a1bf2b39911",
+ "BINANCE|USDM|PERPETUAL|ZILUSDT|BAR|1d|crypto_primary_v2": "b5ddfd18ebb69eb7e6221b8293a77d7cc58247a68a62e9df1accf05808ab6c25",
+ "BINANCE|USDM|PERPETUAL|ZKPUSDT|BAR|1d|crypto_primary_v2": "9c839ac4a19e4d051702e8b216d16cedef5f5877b896d7c3f95043eed3d99ae6",
+ "BINANCE|USDM|PERPETUAL|ZKUSDT|BAR|1d|crypto_primary_v2": "11871ae151c924a71ea30e2be009b672766890c96eac9d64ead3df95f31190b7",
+ "BINANCE|USDM|PERPETUAL|ZORAUSDT|BAR|1d|crypto_primary_v2": "23d2233ce8d0e0c3738c5d50201d9e9f936514616c2fad76f4d6aa45defa2f59",
+ "BINANCE|USDM|PERPETUAL|ZROUSDT|BAR|1d|crypto_primary_v2": "c0f104fb2db8daa72c559be1b4e6d9931d9ae2275e2eb2b1f4d3915019cbf4c6",
+ "BINANCE|USDM|PERPETUAL|ZRXUSDT|BAR|1d|crypto_primary_v2": "c46e652c736e32c29df4169480e3c68ae92fd3829c918ddb15145032b240bbfb"
+ },
+ "alpha.okx.paper.stable": {
+ "OKX|SWAP|PERPETUAL|0G-USDT-SWAP|BAR|1d|crypto_primary_v2": "01e04a5e17e578c7a8eb934b57df3a8baa6910347777dbbcd32cc096ee9d34fb",
+ "OKX|SWAP|PERPETUAL|1INCH-USDT-SWAP|BAR|1d|crypto_primary_v2": "975525bb1d9c6dee82f8307adddad13a5c25f17059034a217adcb071bc0294e8",
+ "OKX|SWAP|PERPETUAL|2Z-USDT-SWAP|BAR|1d|crypto_primary_v2": "936de8fa578395a4e4807e75bb565fc69663bb073c8fbedec00b11cab8603e3d",
+ "OKX|SWAP|PERPETUAL|A-USDT-SWAP|BAR|1d|crypto_primary_v2": "1844e3fe44b8e5461c52223dade063f79545a1a2716a36d63797ed219c1885ef",
+ "OKX|SWAP|PERPETUAL|AAVE-USDT-SWAP|BAR|1d|crypto_primary_v2": "1d57db4cb4800c968f7747b6372476cdf5a0b92f0834b14e5098689ed366cd57",
+ "OKX|SWAP|PERPETUAL|ACT-USDT-SWAP|BAR|1d|crypto_primary_v2": "e52eac6b6a558da33ad55597d24941af9220d336b1bf11307e1567a466c2b46c",
+ "OKX|SWAP|PERPETUAL|ACU-USDT-SWAP|BAR|1d|crypto_primary_v2": "9255f67826779eb170198d9bce1005da1ef139883a0486209a7b61625160ca8d",
+ "OKX|SWAP|PERPETUAL|ADA-USDT-SWAP|BAR|1d|crypto_primary_v2": "d9d097100eefc0088cf4c23a3052a816a3a80390703d955730c215b6bd4d1d07",
+ "OKX|SWAP|PERPETUAL|AERO-USDT-SWAP|BAR|1d|crypto_primary_v2": "153e1d491cd75112d516ce3ab6e90c693ed998b253f42f3efbe6a42f25f8c0e9",
+ "OKX|SWAP|PERPETUAL|AEVO-USDT-SWAP|BAR|1d|crypto_primary_v2": "8311547944863d185ed63314f15b67226703d7dd664e095097bfd05ae5a6116d",
+ "OKX|SWAP|PERPETUAL|AGLD-USDT-SWAP|BAR|1d|crypto_primary_v2": "722549a0e4a2495a0f5ea68d1a699cf2a7c59a1bd83ff860807af68f06621dfe",
+ "OKX|SWAP|PERPETUAL|AIXBT-USDT-SWAP|BAR|1d|crypto_primary_v2": "29a4a227e1f0643bfe691a4ae3139367619a4b88a5e4ae296dfd9ade9ce5e933",
+ "OKX|SWAP|PERPETUAL|ALGO-USDT-SWAP|BAR|1d|crypto_primary_v2": "76b86a97395c4d78d2918278c8340e1bcd94435415d9184693769e9d01954da6",
+ "OKX|SWAP|PERPETUAL|ALLO-USDT-SWAP|BAR|1d|crypto_primary_v2": "6787463f43c886c100087a70044597ce922799f2617e681eea7295acffa2aa96",
+ "OKX|SWAP|PERPETUAL|ANIME-USDT-SWAP|BAR|1d|crypto_primary_v2": "cbc050a029893b67eb993a2c066ed71e0f5ec55768f9500b505214b6987f6275",
+ "OKX|SWAP|PERPETUAL|APE-USDT-SWAP|BAR|1d|crypto_primary_v2": "39827e3c1a9ff44bbdc32c0ee34fd144803f4f781ab3e86e1067e4689ebd4af0",
+ "OKX|SWAP|PERPETUAL|API3-USDT-SWAP|BAR|1d|crypto_primary_v2": "21a750e4d4e7495c73c318045471bf36019a4f46c71144523a3010b484c7ab06",
+ "OKX|SWAP|PERPETUAL|APR-USDT-SWAP|BAR|1d|crypto_primary_v2": "4b87a4ab9d2fa60580083d8a2612a07af5b410e1dd2999395408772cb8ef2b8d",
+ "OKX|SWAP|PERPETUAL|APT-USDT-SWAP|BAR|1d|crypto_primary_v2": "aee5914b663de49ce640476b3ad3f1ce1871f1c0b7a2e8a29250198b3ca417b2",
+ "OKX|SWAP|PERPETUAL|AR-USDT-SWAP|BAR|1d|crypto_primary_v2": "2129cccc8d4776890e1c8959b6d0ee869561a3eaee2f2405e2183bf03eaf814a",
+ "OKX|SWAP|PERPETUAL|ARB-USDT-SWAP|BAR|1d|crypto_primary_v2": "960b204a7003ec47e60de21c3a3b576c0b66a623dd87bd64f183a1b683e8e60b",
+ "OKX|SWAP|PERPETUAL|ARKM-USDT-SWAP|BAR|1d|crypto_primary_v2": "fcfa1dd37c497d80f3b85279d3d7160be782e3e72264d9e7f181d47120733276",
+ "OKX|SWAP|PERPETUAL|ARX-USDT-SWAP|BAR|1d|crypto_primary_v2": "8d588c212b816d4727689f1ec5f0d5c0b144473e9495eabc604c772dce1d2869",
+ "OKX|SWAP|PERPETUAL|ASTER-USDT-SWAP|BAR|1d|crypto_primary_v2": "b541f4c91b39758ddd4f6128ba779db7c4db824b29d98e842af9781ec3a4c897",
+ "OKX|SWAP|PERPETUAL|AT-USDT-SWAP|BAR|1d|crypto_primary_v2": "79b90c3ff1930e41b75f73bcf86fd69d1e6577e8e3dcecbefc89983127196337",
+ "OKX|SWAP|PERPETUAL|ATH-USDT-SWAP|BAR|1d|crypto_primary_v2": "f6abbde5ab7b58183a1a1023bad344b49c2bed9187c6a44df0449ba28ebfa691",
+ "OKX|SWAP|PERPETUAL|ATOM-USDT-SWAP|BAR|1d|crypto_primary_v2": "c80730a23f38bbca111a9ce9bec78d878a62bd54326a4d155aaffd13c08a1a16",
+ "OKX|SWAP|PERPETUAL|AUCTION-USDT-SWAP|BAR|1d|crypto_primary_v2": "1061a39a82f8d04bc4add6c9af7d7c592548249ce7eb12bdc56ecdd0e2295a38",
+ "OKX|SWAP|PERPETUAL|AVAX-USDT-SWAP|BAR|1d|crypto_primary_v2": "4d399266a758cd0619c2d79c50c5d4a59b9807e3c6af14ceda64b76f46219ef8",
+ "OKX|SWAP|PERPETUAL|AVNT-USDT-SWAP|BAR|1d|crypto_primary_v2": "e8d3ae6c4d4f2611bee3f7fcce51d84756a08dd1390b86be669758a2d3a7f1a5",
+ "OKX|SWAP|PERPETUAL|AXS-USDT-SWAP|BAR|1d|crypto_primary_v2": "19804f5918acfc1eaa48e529f0bfdc2881f87345fc418805b405e3cd71878f24",
+ "OKX|SWAP|PERPETUAL|AZTEC-USDT-SWAP|BAR|1d|crypto_primary_v2": "065dbcc2c75e6489614177d0df74c592fc808d09c46047cd3b6bc30f8208a25e",
+ "OKX|SWAP|PERPETUAL|BABY-USDT-SWAP|BAR|1d|crypto_primary_v2": "7dc8e009a8c5cc318bc6c7f31a3aedca25b59f5b2f32148865229f0165600f59",
+ "OKX|SWAP|PERPETUAL|BAND-USDT-SWAP|BAR|1d|crypto_primary_v2": "d96668f82bacfa699410e13487ead138ed581656ae09839f2cd38f42e2da1316",
+ "OKX|SWAP|PERPETUAL|BARD-USDT-SWAP|BAR|1d|crypto_primary_v2": "39408c7510d96b5d653d9b43e979e0ab850500cb8a5f8e6e676b7963a7063dbc",
+ "OKX|SWAP|PERPETUAL|BASED-USDT-SWAP|BAR|1d|crypto_primary_v2": "4d65e4ec9cd7bd5402b1efcbe5dc602afb166ada6fd575e77a4e56a289eedca6",
+ "OKX|SWAP|PERPETUAL|BAT-USDT-SWAP|BAR|1d|crypto_primary_v2": "c300b573f05ca7a5d8bc107ab0f3c909231155c14831e722936e24294f4d8dd0",
+ "OKX|SWAP|PERPETUAL|BCH-USDT-SWAP|BAR|1d|crypto_primary_v2": "c0f47a4ddfd01ba42575b0eb56361887c3bf2f323b1f3899c2b68a00fcc1ad1c",
+ "OKX|SWAP|PERPETUAL|BEAT-USDT-SWAP|BAR|1d|crypto_primary_v2": "60b6fb3cd1116a085537c016631df80c67e515aa3f90309b92bc2079448eb9bb",
+ "OKX|SWAP|PERPETUAL|BERA-USDT-SWAP|BAR|1d|crypto_primary_v2": "fd3288f526e5e606bbbe77ae1726faa3c6565e4b45c80ac4bb3a3f84c64d44ee",
+ "OKX|SWAP|PERPETUAL|BICO-USDT-SWAP|BAR|1d|crypto_primary_v2": "830c809a963813f23720d9d3b2e8ab0f943b67731b2df464e0dd09ee66a44f86",
+ "OKX|SWAP|PERPETUAL|BIGTIME-USDT-SWAP|BAR|1d|crypto_primary_v2": "448a9c54b03847061ea126204a6e67ddd2470cc96404bbc04f452d58fe2c30a9",
+ "OKX|SWAP|PERPETUAL|BILL-USDT-SWAP|BAR|1d|crypto_primary_v2": "0fa5abdde9c39cae7c753379b91253559715f51bf5b65166722a0c2a336f37b0",
+ "OKX|SWAP|PERPETUAL|BIO-USDT-SWAP|BAR|1d|crypto_primary_v2": "bbb95f71ba2c67a61c7dac2e37be7486c45491c5a5b20dcdeedb7dd261325e3a",
+ "OKX|SWAP|PERPETUAL|BLUR-USDT-SWAP|BAR|1d|crypto_primary_v2": "59ba38f5af16f85ec9aadf2082e66ddc16d6d49d75e5143ae43456c136a9f474",
+ "OKX|SWAP|PERPETUAL|BOME-USDT-SWAP|BAR|1d|crypto_primary_v2": "ff261c812d4af9680363f4b937a93b7a36ca8d0a0aa9f2e2e65f656a648babef",
+ "OKX|SWAP|PERPETUAL|BONK-USDT-SWAP|BAR|1d|crypto_primary_v2": "fa2fe9088d79d0d84a787aacf2b2f094009f0ae777188e36fa8c29bf60d95b8c",
+ "OKX|SWAP|PERPETUAL|BRETT-USDT-SWAP|BAR|1d|crypto_primary_v2": "2f1013110cb755fbf3fbb397b8bfe709b5b0124792b577961b5d9b57a0a8968b",
+ "OKX|SWAP|PERPETUAL|BREV-USDT-SWAP|BAR|1d|crypto_primary_v2": "7b72b70da28bdf0eadcd617a23ae5a6580f5d537b7182a62582d7f393b339d2c",
+ "OKX|SWAP|PERPETUAL|BSB-USDT-SWAP|BAR|1d|crypto_primary_v2": "abb9f52c44c361e2e04799d242729a3c3a393c63f3c24f9371e2ceeac158144b",
+ "OKX|SWAP|PERPETUAL|CAP-USDT-SWAP|BAR|1d|crypto_primary_v2": "5ec13a1d7e3172fd6d23d1cff89f3596291400c306f2f72f87c82b069625f2d1",
+ "OKX|SWAP|PERPETUAL|CC-USDT-SWAP|BAR|1d|crypto_primary_v2": "0b7808f667cf11fe43ef1128cd6011a9281168ff4b442175c538d21f399f8792",
+ "OKX|SWAP|PERPETUAL|CELO-USDT-SWAP|BAR|1d|crypto_primary_v2": "1478c679298d4592ed4cedff0f466cffa896875640e2575d1540a0cb763cecfe",
+ "OKX|SWAP|PERPETUAL|CFX-USDT-SWAP|BAR|1d|crypto_primary_v2": "d61b1afb35747bab518901e828e89d8e9d901cf18ac4fbae0627d3f3c04195be",
+ "OKX|SWAP|PERPETUAL|CHIP-USDT-SWAP|BAR|1d|crypto_primary_v2": "da5ef8b50a818d53b68a582775e31b00c6e344c34282ac60725177788e42e8a8",
+ "OKX|SWAP|PERPETUAL|CHZ-USDT-SWAP|BAR|1d|crypto_primary_v2": "c6a97f7c24018ac7e7186f515b21b1263cef9934e08e34aa5ddaef5d057d23f1",
+ "OKX|SWAP|PERPETUAL|COAI-USDT-SWAP|BAR|1d|crypto_primary_v2": "f86dce6081dd4c639d956e7d8589e1bee743675981a5433758285df9d8437e50",
+ "OKX|SWAP|PERPETUAL|COMP-USDT-SWAP|BAR|1d|crypto_primary_v2": "e5bbac54c63d030d7f7425258e50cea6b78da574e94efd60d8947e158d702b7e",
+ "OKX|SWAP|PERPETUAL|CRV-USDT-SWAP|BAR|1d|crypto_primary_v2": "57c2e2ed259f5dd0b2cc21e78cd8a1dd7be3be0da0c9459b45b431e1f6123a1b",
+ "OKX|SWAP|PERPETUAL|CVX-USDT-SWAP|BAR|1d|crypto_primary_v2": "3db5c5bf15e0ec4c22e6fa8a4cc8986691f00b1e4c08ac57852b47b55a94b296",
+ "OKX|SWAP|PERPETUAL|DASH-USDT-SWAP|BAR|1d|crypto_primary_v2": "748c0f74b0818ec787e7257cd1ee60a386aa831af45e30dd963598b531c79f5f",
+ "OKX|SWAP|PERPETUAL|DOOD-USDT-SWAP|BAR|1d|crypto_primary_v2": "313591568176425722ba7298e562bdd586c234ee8eff70fc653d2b656b09c8ad",
+ "OKX|SWAP|PERPETUAL|DOS-USDT-SWAP|BAR|1d|crypto_primary_v2": "b479f88a4c8d54edbcf283dcf153ca9d9650a74f2289d2011e7d444545351b1d",
+ "OKX|SWAP|PERPETUAL|DOT-USDT-SWAP|BAR|1d|crypto_primary_v2": "54e1a6c0209a375d65433e7eaf6ee15124144dbe9f5af7a436d6a1d93d9b41e7",
+ "OKX|SWAP|PERPETUAL|DYDX-USDT-SWAP|BAR|1d|crypto_primary_v2": "355cc30b0bfaed0e4fc066195b282ca207bfedcf2e619f585af9913466b58bf9",
+ "OKX|SWAP|PERPETUAL|EDEN-USDT-SWAP|BAR|1d|crypto_primary_v2": "65bd5755670810032f28bd4cf7eb7e5f1da3b0bb36131a299bdf0fae858eeae9",
+ "OKX|SWAP|PERPETUAL|EDGE-USDT-SWAP|BAR|1d|crypto_primary_v2": "e8b3fd9347b77a476cb197aa787a5627a45b66678aeb5cef79f17ad9854b950d",
+ "OKX|SWAP|PERPETUAL|EGLD-USDT-SWAP|BAR|1d|crypto_primary_v2": "894a168a4831d34e0255d3690f128555482485e1be002694c9cad2869c69bb54",
+ "OKX|SWAP|PERPETUAL|EIGEN-USDT-SWAP|BAR|1d|crypto_primary_v2": "be6cc9cb859d7a7b0cc4748255205d5f45f30f8f4878bdeb50cb44a13518e53f",
+ "OKX|SWAP|PERPETUAL|ENA-USDT-SWAP|BAR|1d|crypto_primary_v2": "8a085e16f6112420a3e1d456577e0f8baad3728d3c7e83831b751e30703cd421",
+ "OKX|SWAP|PERPETUAL|ENJ-USDT-SWAP|BAR|1d|crypto_primary_v2": "8335ad5cfecc6205486a162c8a3f0362581bbf468be2dd957bd8587f111e988b",
+ "OKX|SWAP|PERPETUAL|ENS-USDT-SWAP|BAR|1d|crypto_primary_v2": "d89f14738d9e5143c3bd2f33456edf090e91f5851fad2751efa873a81627109e",
+ "OKX|SWAP|PERPETUAL|ENSO-USDT-SWAP|BAR|1d|crypto_primary_v2": "9e7977a22a9fda3daea7dc8b75c86579cd25b331228b39f3efc2add98cf26c30",
+ "OKX|SWAP|PERPETUAL|ESP-USDT-SWAP|BAR|1d|crypto_primary_v2": "9a659de99368a12a1339e34ee40445e4bb89678075cf42f41d45a7fea5cf4fa9",
+ "OKX|SWAP|PERPETUAL|ETC-USDT-SWAP|BAR|1d|crypto_primary_v2": "c2036f0c1dfe30053674d9cdd0c0106b3bcfa3d620c6fe3a0f26ca42c40a625e",
+ "OKX|SWAP|PERPETUAL|ETHFI-USDT-SWAP|BAR|1d|crypto_primary_v2": "11dd7eb7df188d26e661e82c89d35f2b86311bedb41add358a8dcee018c8207e",
+ "OKX|SWAP|PERPETUAL|ETHW-USDT-SWAP|BAR|1d|crypto_primary_v2": "52e44dce053b85691bdd25c60f124d64d8f409b9f110092d14b59218a1f7199a",
+ "OKX|SWAP|PERPETUAL|F-USDT-SWAP|BAR|1d|crypto_primary_v2": "14356db9050a28457a45245ae1965472c8e57ec0145102781e422490739ecedb",
+ "OKX|SWAP|PERPETUAL|FARTCOIN-USDT-SWAP|BAR|1d|crypto_primary_v2": "c0dbdc461452e1b7e18a997e2ee0f3152c2b765b7f55e192a5fe9ad3b07fcd38",
+ "OKX|SWAP|PERPETUAL|FIL-USDT-SWAP|BAR|1d|crypto_primary_v2": "ceb907bce161ac06c58e66934e71b60d9d6ae1c99d9aa38802b3a348c1966cb4",
+ "OKX|SWAP|PERPETUAL|FLOKI-USDT-SWAP|BAR|1d|crypto_primary_v2": "42800c9c4bdeb127fa9647ca05c2325ba20c848210e60318529b7fcecdc3f887",
+ "OKX|SWAP|PERPETUAL|FLOW-USDT-SWAP|BAR|1d|crypto_primary_v2": "597b159d4f553b7409f2a67ac14b25eb39d7d5df3eda4c0ae9504f37d03a3a38",
+ "OKX|SWAP|PERPETUAL|FOGO-USDT-SWAP|BAR|1d|crypto_primary_v2": "827059b5fb0553d535556e49225caeeb65fbe3e7af03515fcd4f0d8ace8c8ea6",
+ "OKX|SWAP|PERPETUAL|GALA-USDT-SWAP|BAR|1d|crypto_primary_v2": "836a2f4386a8b65056c3943c026bf07edef3c80f4648ef5486e2e65399f92814",
+ "OKX|SWAP|PERPETUAL|GAS-USDT-SWAP|BAR|1d|crypto_primary_v2": "3262a9627e499ee4ebe90dc3b280d8f38097bd4019ca6a4627b3e9262662d151",
+ "OKX|SWAP|PERPETUAL|GIGGLE-USDT-SWAP|BAR|1d|crypto_primary_v2": "ed1a2588d88e5e140204fefc39de8ef56c537de79a5516447a53870abb4c4acf",
+ "OKX|SWAP|PERPETUAL|GLM-USDT-SWAP|BAR|1d|crypto_primary_v2": "8ee97fbb638a66e735c05e6a19757a89df748009ba6b7b6e2a862216b7ce68bf",
+ "OKX|SWAP|PERPETUAL|GMT-USDT-SWAP|BAR|1d|crypto_primary_v2": "4bc660e12615f94f13fd441c0e37283e063148f137629df61d0f651c7dae3fb0",
+ "OKX|SWAP|PERPETUAL|GMX-USDT-SWAP|BAR|1d|crypto_primary_v2": "b6ee6a407f8273e1a5c2af23841de8447abe48361c07efa8222c4d7258245f2b",
+ "OKX|SWAP|PERPETUAL|GPS-USDT-SWAP|BAR|1d|crypto_primary_v2": "b215fdceb4f4abd623cb8ff8cb1e03defb2e4db64ac5feaebc4d5686abd3a1d8",
+ "OKX|SWAP|PERPETUAL|GRAM-USDT-SWAP|BAR|1d|crypto_primary_v2": "f77532a4f419c6d76aa209b7514e8b77b7fc998e3f5a847e008b00df4a185c4f",
+ "OKX|SWAP|PERPETUAL|GRASS-USDT-SWAP|BAR|1d|crypto_primary_v2": "88fc9cef31cfb898c9aa0fa88f43d38bd11a7b87a2443093ad1a8bb3ecb5b2dc",
+ "OKX|SWAP|PERPETUAL|GRT-USDT-SWAP|BAR|1d|crypto_primary_v2": "46db5769560687346b87d289efd6082d7a66cb073c35a99abc42342d989a7484",
+ "OKX|SWAP|PERPETUAL|GRVT-USDT-SWAP|BAR|1d|crypto_primary_v2": "ce2d32dfa3d447cf29f4aca4976690e602e45680c0fa7857c7265c22c5b46ec7",
+ "OKX|SWAP|PERPETUAL|H-USDT-SWAP|BAR|1d|crypto_primary_v2": "ad59445b7a713730990ab4c8e1d2d316e740c17a6c3be4dddf3f55fe4ccab69c",
+ "OKX|SWAP|PERPETUAL|HBAR-USDT-SWAP|BAR|1d|crypto_primary_v2": "f762dc95addbe2100acf192535c423f127a2c14c86ef6294054cff043e1935d2",
+ "OKX|SWAP|PERPETUAL|HMSTR-USDT-SWAP|BAR|1d|crypto_primary_v2": "9afa1783d1a61d149aa7ef1871394c7ec5ee3cc37b7af3dd191e1e9a6692da4d",
+ "OKX|SWAP|PERPETUAL|HOME-USDT-SWAP|BAR|1d|crypto_primary_v2": "5d88b3369e4977420600ee681f2f61527e67bb145898f616f868657999caa82b",
+ "OKX|SWAP|PERPETUAL|HUMA-USDT-SWAP|BAR|1d|crypto_primary_v2": "7868eabc2e901d329aa84aa372962b9a8c7ec8351dba87c2544cd6461fe2b295",
+ "OKX|SWAP|PERPETUAL|HYPE-USDT-SWAP|BAR|1d|crypto_primary_v2": "4003cf86646bb219b9569f61d6c277c9fb23365dc6bafa28537192bb05c84666",
+ "OKX|SWAP|PERPETUAL|ICP-USDT-SWAP|BAR|1d|crypto_primary_v2": "18abdd01f07687858df22a094c207305712fd830a7f070ac3a12ab5f31f9523c",
+ "OKX|SWAP|PERPETUAL|IMX-USDT-SWAP|BAR|1d|crypto_primary_v2": "e7bd64fd661f97a1cf3b5e21e2ff49f273417143595e4cdcc4c83f15773ed331",
+ "OKX|SWAP|PERPETUAL|INIT-USDT-SWAP|BAR|1d|crypto_primary_v2": "8d77c4e93b20d5e1774758a6330cf0ca8a9fbf807259d51e7c70699a4954adef",
+ "OKX|SWAP|PERPETUAL|INJ-USDT-SWAP|BAR|1d|crypto_primary_v2": "94e156023c158ba005f8feaab1901257b07cc88d215f545ef1a831c388b5a5f5",
+ "OKX|SWAP|PERPETUAL|IOST-USDT-SWAP|BAR|1d|crypto_primary_v2": "e8be221d768d3e72151f1224d8602028a19c1318f0546e58c4a23aeb42f5f19a",
+ "OKX|SWAP|PERPETUAL|IOTA-USDT-SWAP|BAR|1d|crypto_primary_v2": "0ac1d1a7e6bd39e51cc1777059f25d4baecf5e451ac6d9a0b57d660f49b74b22",
+ "OKX|SWAP|PERPETUAL|IRYS-USDT-SWAP|BAR|1d|crypto_primary_v2": "4071d0d5125a3776ee75d11ee0fa71f7512f143738ced810b8d9816c1ef8b98b",
+ "OKX|SWAP|PERPETUAL|JELLYJELLY-USDT-SWAP|BAR|1d|crypto_primary_v2": "11357dbbd6f4546618b681c47d2cf8742bde84d59cfaa20ec9ae5a5be8260fa5",
+ "OKX|SWAP|PERPETUAL|JTO-USDT-SWAP|BAR|1d|crypto_primary_v2": "68838dbe15e8a3d3dab7a8c078393029a4059403921464ceb1c98a8683a0dfc7",
+ "OKX|SWAP|PERPETUAL|JUP-USDT-SWAP|BAR|1d|crypto_primary_v2": "db0b201248f67ced8690b6635bdac307ca96d9a1d65f817e15a24cd7094b33eb",
+ "OKX|SWAP|PERPETUAL|KAITO-USDT-SWAP|BAR|1d|crypto_primary_v2": "27692b551038038bdd82b6d817c86310d2f569611ea009961ced0cdf23885a28",
+ "OKX|SWAP|PERPETUAL|KAT-USDT-SWAP|BAR|1d|crypto_primary_v2": "da63826adf964ae652a6df34e87702228621bf646b55760013e104f7e2491bac",
+ "OKX|SWAP|PERPETUAL|KGEN-USDT-SWAP|BAR|1d|crypto_primary_v2": "29b16a72d8c87c05ae765596c62fdc106a6a821296c9c3f36cf7879807201b4f",
+ "OKX|SWAP|PERPETUAL|KITE-USDT-SWAP|BAR|1d|crypto_primary_v2": "3d569d061c19a0165d94f1d3235f36ff83909c150d1e2ec5c6d5538ee1b1feba",
+ "OKX|SWAP|PERPETUAL|KMNO-USDT-SWAP|BAR|1d|crypto_primary_v2": "25a3005a92df5c47cfabc476396c7b5d500c6ed172c6a0618de975736a771c6f",
+ "OKX|SWAP|PERPETUAL|KSM-USDT-SWAP|BAR|1d|crypto_primary_v2": "4cb1f3b25c8d443e50c7952ae5de014c8a58c13743b7f8ed05f638d6d0f087d7",
+ "OKX|SWAP|PERPETUAL|LA-USDT-SWAP|BAR|1d|crypto_primary_v2": "8400c457957ca42ae7ff95ec73aa62bd63552075f08d6e87502239e9b1762876",
+ "OKX|SWAP|PERPETUAL|LAB-USDT-SWAP|BAR|1d|crypto_primary_v2": "d1a1b9bdd113008a9cc5ac5088afe95d42f01076257136979809bc4bf8159aee",
+ "OKX|SWAP|PERPETUAL|LAYER-USDT-SWAP|BAR|1d|crypto_primary_v2": "c3edfcf25e886fd04dc14e5846381ac5ba59b58b03829b7b1938ef76d13ba447",
+ "OKX|SWAP|PERPETUAL|LDO-USDT-SWAP|BAR|1d|crypto_primary_v2": "d522bb6fe256d77314e69bd088cff17e01972232dcfcb77d99b92c0496836f3b",
+ "OKX|SWAP|PERPETUAL|LINEA-USDT-SWAP|BAR|1d|crypto_primary_v2": "be2fd0b7afd8333dce1897a33ed60a9bb2d1d4272cf6d5678ccd01caccf2411d",
+ "OKX|SWAP|PERPETUAL|LINK-USDT-SWAP|BAR|1d|crypto_primary_v2": "91f187574bdb6a1b38374f70d2e3dd6c9ea3cf22b98f1fa28c690fc849e65595",
+ "OKX|SWAP|PERPETUAL|LIT-USDT-SWAP|BAR|1d|crypto_primary_v2": "1563b30231c9cdcbd715477f88824debccfbfa65eff4cd03d6ac72b8342a3b18",
+ "OKX|SWAP|PERPETUAL|LPT-USDT-SWAP|BAR|1d|crypto_primary_v2": "0a7686a53715b19ae443c723f3c10dbbfd568c806c29c087d6566a6d56355200",
+ "OKX|SWAP|PERPETUAL|LQTY-USDT-SWAP|BAR|1d|crypto_primary_v2": "f2ad9b43a182358025af70e030612258f40e411a09c34e392738469ba2da2fa3",
+ "OKX|SWAP|PERPETUAL|LTC-USDT-SWAP|BAR|1d|crypto_primary_v2": "e236e5158859250b9b6466b3be6d1e376455e28e2445c51116097d60cea26a0b",
+ "OKX|SWAP|PERPETUAL|MAGIC-USDT-SWAP|BAR|1d|crypto_primary_v2": "03c9b5505521d26ff19abe80ebd8e174f6128e843fb162b98b334d038becc802",
+ "OKX|SWAP|PERPETUAL|MANA-USDT-SWAP|BAR|1d|crypto_primary_v2": "8f884beeb89eb9b6dfd0c150756e314fc98e1c7d3901501534d8441dd1ff1e9b",
+ "OKX|SWAP|PERPETUAL|MASK-USDT-SWAP|BAR|1d|crypto_primary_v2": "bcd50f580531703bb7c138dd640ac87ef05f3e377d54729a84e1f260ec03f44c",
+ "OKX|SWAP|PERPETUAL|ME-USDT-SWAP|BAR|1d|crypto_primary_v2": "078f6942d0ff7c9751dff483d5dc6222e9fce4a28ef7af6f586799c29a05696f",
+ "OKX|SWAP|PERPETUAL|MEGA-USDT-SWAP|BAR|1d|crypto_primary_v2": "249c857ab302c9dab718f25554a23212c2368515b9af5be02e6dbf0941d4ae2b",
+ "OKX|SWAP|PERPETUAL|MEME-USDT-SWAP|BAR|1d|crypto_primary_v2": "13ebd5ba6e0ff2835260a495db62e0b66e35acb732b369ab87e48cd8d22ec757",
+ "OKX|SWAP|PERPETUAL|MERL-USDT-SWAP|BAR|1d|crypto_primary_v2": "31adc122a20f02fe10e9b5d96904fb98241cbc2d3099e70a2ecc3777c9fcd7ce",
+ "OKX|SWAP|PERPETUAL|MET-USDT-SWAP|BAR|1d|crypto_primary_v2": "703d238332f7e85295409a13b8cc8ff79dff411cc78cddc60a575375d5ec6706",
+ "OKX|SWAP|PERPETUAL|METIS-USDT-SWAP|BAR|1d|crypto_primary_v2": "b5a63de9f70d27eb32c88a89f3a369f74e7eeb9542e696574bca6197d55931c4",
+ "OKX|SWAP|PERPETUAL|MEW-USDT-SWAP|BAR|1d|crypto_primary_v2": "2b2f7829ed627ba35d51a9bca217d9a9679b155ebc381f10b57b997599fdc6b0",
+ "OKX|SWAP|PERPETUAL|MINA-USDT-SWAP|BAR|1d|crypto_primary_v2": "b19ac478ac5749471089a4bb9f068156718e5c910be5af0570d8ff35b10378e4",
+ "OKX|SWAP|PERPETUAL|MMT-USDT-SWAP|BAR|1d|crypto_primary_v2": "9cfea422cb398fae0ffb921a10b745ca707c27df64efb604be0dd6b2f0d3fdc5",
+ "OKX|SWAP|PERPETUAL|MON-USDT-SWAP|BAR|1d|crypto_primary_v2": "0bae31a2c3316fedca502e51684a12e2724c1d2e6abe6cd980acc0c18710b04b",
+ "OKX|SWAP|PERPETUAL|MOODENG-USDT-SWAP|BAR|1d|crypto_primary_v2": "243681f6fdb8a6e3f2c4aa504375c952605b15a849edbddbebb9f052c4b698ba",
+ "OKX|SWAP|PERPETUAL|MORPHO-USDT-SWAP|BAR|1d|crypto_primary_v2": "29e9e12ae6d8a7f42d88626c84b7631af809d1249e95ee489a0e8e4717e063f5",
+ "OKX|SWAP|PERPETUAL|MOVE-USDT-SWAP|BAR|1d|crypto_primary_v2": "1c214176410c92f2c9f1c3adb8a2fb500008ff16db39985a5b423d6dd550a412",
+ "OKX|SWAP|PERPETUAL|MUBARAK-USDT-SWAP|BAR|1d|crypto_primary_v2": "88402fd0e6527ee6df633c43dcd43dd83930aa79eb094b75bc5e9417e93eacc2",
+ "OKX|SWAP|PERPETUAL|NEAR-USDT-SWAP|BAR|1d|crypto_primary_v2": "356cfaf6d7a7ada442d74c9ca05a6ec197dcf8ff62bc64bf0e9e81ab71793766",
+ "OKX|SWAP|PERPETUAL|NEIRO-USDT-SWAP|BAR|1d|crypto_primary_v2": "e8fb349c4cb7bab3c4c3075cfa6d647e4f28535125f02f1ae46d5bd2b5c515e1",
+ "OKX|SWAP|PERPETUAL|NEO-USDT-SWAP|BAR|1d|crypto_primary_v2": "b45f59fa587f5c36b1643a130d17bc2c79f31d6925745599a68b26f56182bea6",
+ "OKX|SWAP|PERPETUAL|NIGHT-USDT-SWAP|BAR|1d|crypto_primary_v2": "7190e1a219c97769b9c1ca425180815c1967eee951797cbf442eda098662afa1",
+ "OKX|SWAP|PERPETUAL|NMR-USDT-SWAP|BAR|1d|crypto_primary_v2": "2610efe1b9f70cbd4219e27eba4526b9bcb5ee251e5d0c7586aa345adb4d6b14",
+ "OKX|SWAP|PERPETUAL|NOT-USDT-SWAP|BAR|1d|crypto_primary_v2": "70ed87a8e9f5c30d3b780c58b8c610046d50a86fef37bc5873c6f0a443055904",
+ "OKX|SWAP|PERPETUAL|O-USDT-SWAP|BAR|1d|crypto_primary_v2": "bb17fa3fb2e3441acc06719ff8c52d3a99493f6dd73f77aed45340ba807fc0dd",
+ "OKX|SWAP|PERPETUAL|ON-USDT-SWAP|BAR|1d|crypto_primary_v2": "6fbfaae61c53d8ac2fdc1c0c109432ffebf0f36fbc18683dedf45aa75b66cb15",
+ "OKX|SWAP|PERPETUAL|ONDO-USDT-SWAP|BAR|1d|crypto_primary_v2": "95640291f42cc46897d8eca8d657a01df98aa1b4ad57b322b7256aac8d88e895",
+ "OKX|SWAP|PERPETUAL|ONE-USDT-SWAP|BAR|1d|crypto_primary_v2": "143575cfbaa351648f4ab02110a808093d8e4f8ef9382902e8522471c0e9c52e",
+ "OKX|SWAP|PERPETUAL|ONT-USDT-SWAP|BAR|1d|crypto_primary_v2": "e094197a941e4752298d32bbd8a2d13e73bd33f43fa7fd748d8660fb4f5114f6",
+ "OKX|SWAP|PERPETUAL|OP-USDT-SWAP|BAR|1d|crypto_primary_v2": "406005c444b55b84b3e833665b1c0f947c2d724e8b4e511df64d3af96295093d",
+ "OKX|SWAP|PERPETUAL|OPG-USDT-SWAP|BAR|1d|crypto_primary_v2": "3c0171f055877e93ee5db26bd6325117989f6b9107066b402135fdd5d2f7132a",
+ "OKX|SWAP|PERPETUAL|OPN-USDT-SWAP|BAR|1d|crypto_primary_v2": "c264dee06c43eafa899a6dd91f6855f4146c53fadbc492fee48de889b07117be",
+ "OKX|SWAP|PERPETUAL|ORDER-USDT-SWAP|BAR|1d|crypto_primary_v2": "2f2579219609a6520a095fb1421bc15cfabc0d132d4d5e6d74cb3849df977c25",
+ "OKX|SWAP|PERPETUAL|ORDI-USDT-SWAP|BAR|1d|crypto_primary_v2": "69f60b1c8e96120d02be65e44dca753900c074550c82a39d0b80ee65218fca8d",
+ "OKX|SWAP|PERPETUAL|PENDLE-USDT-SWAP|BAR|1d|crypto_primary_v2": "b314a2b09a3ca8275b631ae154f7a10f59bd77c8518fa2897f3ecb9c0a07a48a",
+ "OKX|SWAP|PERPETUAL|PENGU-USDT-SWAP|BAR|1d|crypto_primary_v2": "1003e71f15735e53b0712ec7bd0582af5557394baef6995b7b43c8eb5c0420e5",
+ "OKX|SWAP|PERPETUAL|PEOPLE-USDT-SWAP|BAR|1d|crypto_primary_v2": "5e77daf84b43014546cc51de6c0dc7d13c6cc98f26dd66fbca4621a6c4a76f23",
+ "OKX|SWAP|PERPETUAL|PEPE-USDT-SWAP|BAR|1d|crypto_primary_v2": "81dfba81c3ab1997ee3af72d957e1c5b40f36ce6d5a048a572c9286bb0440899",
+ "OKX|SWAP|PERPETUAL|PIEVERSE-USDT-SWAP|BAR|1d|crypto_primary_v2": "bcec3904bd91d93867506c2128a7fbd32c8401f251e4893e3338ec5e3e632618",
+ "OKX|SWAP|PERPETUAL|PIPPIN-USDT-SWAP|BAR|1d|crypto_primary_v2": "cef627143afa78cb253d69ab4d08ac30607ce0995aec9b97c30d824f0682b883",
+ "OKX|SWAP|PERPETUAL|PLUME-USDT-SWAP|BAR|1d|crypto_primary_v2": "e1389d40b492238e32b6b44d5d4bb3580970d5967cbf3c61b88aa16e9d3ef521",
+ "OKX|SWAP|PERPETUAL|PNUT-USDT-SWAP|BAR|1d|crypto_primary_v2": "aec5fe7a2f9139fe43517bf766a26f99b8874da8ee21cf21dc9472ab945a5006",
+ "OKX|SWAP|PERPETUAL|POL-USDT-SWAP|BAR|1d|crypto_primary_v2": "61465767cb1b2c594c662def0590474c7ff8695f648f36f16ce038ebbd4ac32b",
+ "OKX|SWAP|PERPETUAL|POPCAT-USDT-SWAP|BAR|1d|crypto_primary_v2": "9e1eadf583010092e323084f0f8da225411aab72301f9cbb70c63cd753b422bd",
+ "OKX|SWAP|PERPETUAL|PROVE-USDT-SWAP|BAR|1d|crypto_primary_v2": "4c8936821490512ba8a760c3dd11a4da1e7042b7082667ced9574f2a63e365a0",
+ "OKX|SWAP|PERPETUAL|PUMP-USDT-SWAP|BAR|1d|crypto_primary_v2": "0f60fec8d31315c07017a457944ba2b02901f9a879900254fb2953cb098cee72",
+ "OKX|SWAP|PERPETUAL|PYTH-USDT-SWAP|BAR|1d|crypto_primary_v2": "174ec64dffa53f4bea5cc50d6eb1a266cc88baf9e26ae8a5627e622573062075",
+ "OKX|SWAP|PERPETUAL|QNT-USDT-SWAP|BAR|1d|crypto_primary_v2": "fb6301aacf8079896dcc20017550b5b96b7955f2b60096989d3f67d20bd78613",
+ "OKX|SWAP|PERPETUAL|QTUM-USDT-SWAP|BAR|1d|crypto_primary_v2": "4fe7c7b0d57473d8de46ed0d395a6b10eeb57279c73bcbc0dffa6edab24a3fef",
+ "OKX|SWAP|PERPETUAL|RAVE-USDT-SWAP|BAR|1d|crypto_primary_v2": "d7367439f9877914d53a20da1d5fa777b50c4cfee22a9243c3f22b68e7910092",
+ "OKX|SWAP|PERPETUAL|RE-USDT-SWAP|BAR|1d|crypto_primary_v2": "2f39b90749435af488877f5a4a6d94e87234adf08394756a7ab9747448172e57",
+ "OKX|SWAP|PERPETUAL|RECALL-USDT-SWAP|BAR|1d|crypto_primary_v2": "57bdc27354c812710f63bc9e6f2113c4b9f8315bfd1bfdf81e4a354233e383a0",
+ "OKX|SWAP|PERPETUAL|RENDER-USDT-SWAP|BAR|1d|crypto_primary_v2": "524fea0229887f359f284c02b98e71b3c82890178420d608f59a325c3775d67e",
+ "OKX|SWAP|PERPETUAL|RESOLV-USDT-SWAP|BAR|1d|crypto_primary_v2": "9aff6edc2962a4acf1af151a8c310c88997c079d5b927a8328501b607a07c53c",
+ "OKX|SWAP|PERPETUAL|RIVER-USDT-SWAP|BAR|1d|crypto_primary_v2": "a26e51afd264749d3e08a5695b38a7561c54072d0d788728d5818b9cba9ad876",
+ "OKX|SWAP|PERPETUAL|ROBO-USDT-SWAP|BAR|1d|crypto_primary_v2": "b2a46d20a6e24642c3163094c099905ab2087abdddc24cdb854495dc2f1786c2",
+ "OKX|SWAP|PERPETUAL|RSR-USDT-SWAP|BAR|1d|crypto_primary_v2": "3c55f3648b048f74a7bbd2b81dfb4141aad626afaba45764bf520e372c55a2e5",
+ "OKX|SWAP|PERPETUAL|RVN-USDT-SWAP|BAR|1d|crypto_primary_v2": "f8db78920cd2f41f91299f47de67601a373624fbd5b33ddb0b596b78f43e6f5d",
+ "OKX|SWAP|PERPETUAL|S-USDT-SWAP|BAR|1d|crypto_primary_v2": "74ea80a75364b035684d07e6dc41ce3ee874cbdeb3956f27c50c1ee10e68a975",
+ "OKX|SWAP|PERPETUAL|SAHARA-USDT-SWAP|BAR|1d|crypto_primary_v2": "4c4cd6a67de512aedd7869c84366333e4ace9b3c8f1dcd3348dd30f832683af5",
+ "OKX|SWAP|PERPETUAL|SAND-USDT-SWAP|BAR|1d|crypto_primary_v2": "c2238f654618719fbdc4916b82197215de203e50b4bef4a30cc17062a528bf91",
+ "OKX|SWAP|PERPETUAL|SAPIEN-USDT-SWAP|BAR|1d|crypto_primary_v2": "46937890438d4187dc56972fcb82fb7560e6a59f5737d907db4b87a5ab83c3c3",
+ "OKX|SWAP|PERPETUAL|SATS-USDT-SWAP|BAR|1d|crypto_primary_v2": "c5dd3103a47fb7c095c008fc23e83905d977ec8b94d6267cefe2a7fd146837d2",
+ "OKX|SWAP|PERPETUAL|SEI-USDT-SWAP|BAR|1d|crypto_primary_v2": "c530750600e1c54519b3462cce795a3e01d6706e5d78b362fd52d27c9f5eaa30",
+ "OKX|SWAP|PERPETUAL|SENT-USDT-SWAP|BAR|1d|crypto_primary_v2": "e6f56106b34bccb5a36c16f1bad81f7133c6bb926038f0f86030bc09bc26d141",
+ "OKX|SWAP|PERPETUAL|SHIB-USDT-SWAP|BAR|1d|crypto_primary_v2": "f54ed0855d7e9eca75e39c0c955f49a1ed1d64eba24f23d06b414c49e547b0a7",
+ "OKX|SWAP|PERPETUAL|SIGN-USDT-SWAP|BAR|1d|crypto_primary_v2": "9c131059b03b4431f79a6141a29b297aaf7531964f05c69964f868c855ca3aa7",
+ "OKX|SWAP|PERPETUAL|SKY-USDT-SWAP|BAR|1d|crypto_primary_v2": "8fe15f9f5f94e18057b90dea7a040da4e78ff9ad25d63fe84a74dbecd5095c59",
+ "OKX|SWAP|PERPETUAL|SLX-USDT-SWAP|BAR|1d|crypto_primary_v2": "6ccef1b39ed0e68fd4dfa04a49c7f01e359bcd7a164902530630a20242ec057e",
+ "OKX|SWAP|PERPETUAL|SNX-USDT-SWAP|BAR|1d|crypto_primary_v2": "2ae6e1229622ccffb41c3a6e6f63c637c3402ba362ef58e96a38c42d15ac3587",
+ "OKX|SWAP|PERPETUAL|SOON-USDT-SWAP|BAR|1d|crypto_primary_v2": "477a931b25970d481c76a33f481f8aa8ea12efbf37a845ca8fdf3a3620d7a05c",
+ "OKX|SWAP|PERPETUAL|SOPH-USDT-SWAP|BAR|1d|crypto_primary_v2": "2e0fe87376d5a9e780147fcaea86a8f31ff78f21284fe5f2b12f873e43ead636",
+ "OKX|SWAP|PERPETUAL|SPACE-USDT-SWAP|BAR|1d|crypto_primary_v2": "4a8f1027cf3a0263b6226faaedee776c31c8a4b563f06eafef8c9dfc47507182",
+ "OKX|SWAP|PERPETUAL|SPK-USDT-SWAP|BAR|1d|crypto_primary_v2": "bf974c4ff93a36752132d91db06303b01ebdbfbdd5dde9d0d18ab7e756891c65",
+ "OKX|SWAP|PERPETUAL|SPX-USDT-SWAP|BAR|1d|crypto_primary_v2": "5d9f5b526ed24385048b71e00b272cd8a6136a5b1b28722c261852ae539d711c",
+ "OKX|SWAP|PERPETUAL|SSV-USDT-SWAP|BAR|1d|crypto_primary_v2": "8fe008919db41317df0c8173b2b4bd06e86ec71ea7e4a2690a5b728e9bd4a3d4",
+ "OKX|SWAP|PERPETUAL|STABLE-USDT-SWAP|BAR|1d|crypto_primary_v2": "7894e95c05aa52ee1b6afe78213c4cb5604fbfaef04c08dbd474bf6a164d0ea6",
+ "OKX|SWAP|PERPETUAL|STRK-USDT-SWAP|BAR|1d|crypto_primary_v2": "64d62c11dab1cb374b2e8edcc1fd568bd572948c2eeb484f05e0973b2456824d",
+ "OKX|SWAP|PERPETUAL|STX-USDT-SWAP|BAR|1d|crypto_primary_v2": "db1393a1d686c6027c231ecf91bafd574cb70f6be511171a73f24740e72552d4",
+ "OKX|SWAP|PERPETUAL|SUI-USDT-SWAP|BAR|1d|crypto_primary_v2": "47609f54840623289d46e1197461b4278fc524104bbb72297490e01c37fbaa37",
+ "OKX|SWAP|PERPETUAL|SUSHI-USDT-SWAP|BAR|1d|crypto_primary_v2": "a8ba54a1698d1f40e994355151ebeed6adff50e8abe3604f6bf8e8bbd125809a",
+ "OKX|SWAP|PERPETUAL|SYRUP-USDT-SWAP|BAR|1d|crypto_primary_v2": "894fda1c5817d54f9ca9b284c5d6d63b08013ecf25cd43227f4c24a09c8795e4",
+ "OKX|SWAP|PERPETUAL|TAO-USDT-SWAP|BAR|1d|crypto_primary_v2": "cec6f7c570d3babb83bdcde78a04bc85a95b66401bd62da9e423f5428104b39c",
+ "OKX|SWAP|PERPETUAL|THETA-USDT-SWAP|BAR|1d|crypto_primary_v2": "8e12f23ef9ea97d40764b243c4558cd3125f44428ed2bd313a1b0428aea7c178",
+ "OKX|SWAP|PERPETUAL|TIA-USDT-SWAP|BAR|1d|crypto_primary_v2": "4d83b2e4f7f675c7e2f3ad7c7359b3e0f3601fc6b4e057c65c35f19881981c56",
+ "OKX|SWAP|PERPETUAL|TRB-USDT-SWAP|BAR|1d|crypto_primary_v2": "92997d943fbd9957267b2e7abe33485dcccc86101c01cbccbb7821479da57390",
+ "OKX|SWAP|PERPETUAL|TRIA-USDT-SWAP|BAR|1d|crypto_primary_v2": "5674151fb6aed4bbf53ef67d548b3448153f024a504279fb845a85d3c7fa56e8",
+ "OKX|SWAP|PERPETUAL|TRUMP-USDT-SWAP|BAR|1d|crypto_primary_v2": "64fa82cb70f3b949f40b4182b9df781836503a4e35a46af1116e550e8636ee68",
+ "OKX|SWAP|PERPETUAL|TRUST-USDT-SWAP|BAR|1d|crypto_primary_v2": "65e38c589d36c32fda772cc95d5c06efc397486a99a5ef78d29efd182c56fe8f",
+ "OKX|SWAP|PERPETUAL|TRUTH-USDT-SWAP|BAR|1d|crypto_primary_v2": "e950480b79a4341345288b2a3fd8231d7e370caac8e56abd45ca3405ac75d2b9",
+ "OKX|SWAP|PERPETUAL|TRX-USDT-SWAP|BAR|1d|crypto_primary_v2": "07722b62f4b0f55ef6e3e85ac4aa3e1719383020bd7265fb1901f901fe3c5c38",
+ "OKX|SWAP|PERPETUAL|TURBO-USDT-SWAP|BAR|1d|crypto_primary_v2": "0cae524eb3b286808625c0c9e78cfd9e05919d2a3d0ceab04ba3dbadc5c379a7",
+ "OKX|SWAP|PERPETUAL|UB-USDT-SWAP|BAR|1d|crypto_primary_v2": "da971d1858154cbfaf29a35ccf76739ba826f517e7f538c12e6e93dad2b4eb48",
+ "OKX|SWAP|PERPETUAL|UMA-USDT-SWAP|BAR|1d|crypto_primary_v2": "83f03d4429b2bad62b7291ffcbf6422e361264de2aa977a9ffda510d402da4d1",
+ "OKX|SWAP|PERPETUAL|UNI-USDT-SWAP|BAR|1d|crypto_primary_v2": "26d0b9b3165eaf93809f9578237e065623b9c3ecde7cea8bc4d331c7370b1f68",
+ "OKX|SWAP|PERPETUAL|USELESS-USDT-SWAP|BAR|1d|crypto_primary_v2": "ad2f967ec27e671f1c9473bce428891865ff08f6b52cd1eb1c90282dce64467c",
+ "OKX|SWAP|PERPETUAL|VANA-USDT-SWAP|BAR|1d|crypto_primary_v2": "e2293aefa792f91767ecb4f79cebdb1ca6a39c652ab796f9ae5dde6975dcaaf3",
+ "OKX|SWAP|PERPETUAL|VIRTUAL-USDT-SWAP|BAR|1d|crypto_primary_v2": "27a44e5dbfd4e52d55eee85a4526aaf39561797453c04d6c1d498d345785c8f9",
+ "OKX|SWAP|PERPETUAL|VVV-USDT-SWAP|BAR|1d|crypto_primary_v2": "4e239d8f3b4595951dd3f67f390b814814f98af961a7e3d65b11611bf0da11a7",
+ "OKX|SWAP|PERPETUAL|W-USDT-SWAP|BAR|1d|crypto_primary_v2": "a1ddf5f6f2481a395ef744df0461488934058ec3dcb6267d19801a1a057160f7",
+ "OKX|SWAP|PERPETUAL|WAL-USDT-SWAP|BAR|1d|crypto_primary_v2": "5ddec5bed5d4861cb36545d16f825430720a216dea0e36dc7eede9a9f22c3d0c",
+ "OKX|SWAP|PERPETUAL|WCT-USDT-SWAP|BAR|1d|crypto_primary_v2": "ba844449e1c3317c1edd4fc4a8e3085be39db555687168ab982a5fcc2d6c2ac4",
+ "OKX|SWAP|PERPETUAL|WET-USDT-SWAP|BAR|1d|crypto_primary_v2": "55d0cfbc77e601045773946d2c8aef2d8a16504d848ab00d68a312ccfd9a4aef",
+ "OKX|SWAP|PERPETUAL|WIF-USDT-SWAP|BAR|1d|crypto_primary_v2": "bf4d76115b3b9b1aa81a96392563a7fa40fa6b077b811d8df64bee3e8f2283a8",
+ "OKX|SWAP|PERPETUAL|WLD-USDT-SWAP|BAR|1d|crypto_primary_v2": "edfd3e6353c9b928ea0a65d93ab6782d337c39a9f6ecfe2107e3e46262b69e92",
+ "OKX|SWAP|PERPETUAL|WLFI-USDT-SWAP|BAR|1d|crypto_primary_v2": "36b11e230082107503123ed98420ea738cafd2ebb5d78c6dac72cfae9f1150bf",
+ "OKX|SWAP|PERPETUAL|WOO-USDT-SWAP|BAR|1d|crypto_primary_v2": "26ffc4ff040cd2537055eec65f8f16642bebe08ce4b0dc8e0012e41bc7b2a635",
+ "OKX|SWAP|PERPETUAL|XLM-USDT-SWAP|BAR|1d|crypto_primary_v2": "d2ac1ba1bf56969946aaa9e5444bbe47ca92a76f8c6471dd961df8ec213738da",
+ "OKX|SWAP|PERPETUAL|XPL-USDT-SWAP|BAR|1d|crypto_primary_v2": "30ff875160d4ac17085c80ff0b23134d86c5d6ae168a7cec23d39b35fd07af40",
+ "OKX|SWAP|PERPETUAL|XRP-USDT-SWAP|BAR|1d|crypto_primary_v2": "6cb98278f0fd203527f363a342b6bb96dbe57c5a9ed1b4bfec14aa71b258f70e",
+ "OKX|SWAP|PERPETUAL|XTZ-USDT-SWAP|BAR|1d|crypto_primary_v2": "2b1fc633bc86c74846f31e8f5bb1e929d6beb041e9014f2f2eee48249786f2df",
+ "OKX|SWAP|PERPETUAL|YB-USDT-SWAP|BAR|1d|crypto_primary_v2": "b9ebc5974ef4df02ed2960653231f1ba03a8d60f6a8c2f5c28fa71e6fbc41dea",
+ "OKX|SWAP|PERPETUAL|YFI-USDT-SWAP|BAR|1d|crypto_primary_v2": "d21c61b564dd66b90591b46c6b0722b0a3fad85e27f893665260148b3603e29f",
+ "OKX|SWAP|PERPETUAL|YGG-USDT-SWAP|BAR|1d|crypto_primary_v2": "83fcadcbcde63d50c48c380a6f0f9c5cd512741314404fd646687a58e0ff1037",
+ "OKX|SWAP|PERPETUAL|ZAMA-USDT-SWAP|BAR|1d|crypto_primary_v2": "dfb4c180c3d93c393d9fc62a314f025f38c7e6fad4817f2749ec9488b2f5cd01",
+ "OKX|SWAP|PERPETUAL|ZBT-USDT-SWAP|BAR|1d|crypto_primary_v2": "62a8aef104f21889442e0717b8c8ddba5943c57c0df22ad0109909a09c6940c3",
+ "OKX|SWAP|PERPETUAL|ZEC-USDT-SWAP|BAR|1d|crypto_primary_v2": "3b26578bae5194e3341111d314eda9bcd9c78651843db57a4c1af86f432ca3d6",
+ "OKX|SWAP|PERPETUAL|ZEN-USDT-SWAP|BAR|1d|crypto_primary_v2": "c0ccf6e7e883b52c682cf885a4c4acec52a35f1855afbd42af69505c61c43099",
+ "OKX|SWAP|PERPETUAL|ZETA-USDT-SWAP|BAR|1d|crypto_primary_v2": "265ca008d6a61b2cb15f35e1797f625ee042f4041fafc27411f077194ebff2bf",
+ "OKX|SWAP|PERPETUAL|ZIL-USDT-SWAP|BAR|1d|crypto_primary_v2": "b5f1d2cc28b0c902a227300c1e1b605ebe2c77203a1919f9f12d40f9a698e0b5",
+ "OKX|SWAP|PERPETUAL|ZK-USDT-SWAP|BAR|1d|crypto_primary_v2": "f82da908993621ab0f7f45e52c46064db3767b186edcf18c7595d893354f55a0",
+ "OKX|SWAP|PERPETUAL|ZKP-USDT-SWAP|BAR|1d|crypto_primary_v2": "2ef0a913b1ba375ac8b528d376cd73a06dd61bc936ef051a8b173790d0ba5faf",
+ "OKX|SWAP|PERPETUAL|ZORA-USDT-SWAP|BAR|1d|crypto_primary_v2": "23e38fa92f5015383d0c544b3bf1a8da58d94f6b7efa427596d8b73a70938c27",
+ "OKX|SWAP|PERPETUAL|ZRO-USDT-SWAP|BAR|1d|crypto_primary_v2": "b4294138bc39e9c21d342749251a7b78be5c84f1d658a366f09d18f917e1ec21",
+ "OKX|SWAP|PERPETUAL|ZRX-USDT-SWAP|BAR|1d|crypto_primary_v2": "08887fb7bd2638dfa38825f1627bf1c9898e10c8e65aee272a50595242a4f227"
+ }
+ },
+ "schema": "qdl.d48.demand-ownership.v1",
+ "universe_revision": 1
+}
diff --git a/config/v2/v211-target-acceptance-budget.json b/config/v2/v211-target-acceptance-budget.json
new file mode 100644
index 00000000..1926b4e5
--- /dev/null
+++ b/config/v2/v211-target-acceptance-budget.json
@@ -0,0 +1,159 @@
+{
+ "schema": "qdl.v211.target-acceptance-budget.v1",
+ "frozen_at": "2026-09-23",
+ "source": "DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md#read-plane-v211-target-closure",
+ "note": "Frozen before the first target run. A missed target is an open exit to optimize, never a threshold edited after results.",
+ "stages": {
+ "5": {
+ "mix": [
+ 2,
+ 1,
+ 1,
+ 1
+ ],
+ "seconds": 90
+ },
+ "20": {
+ "mix": [
+ 8,
+ 6,
+ 4,
+ 2
+ ],
+ "seconds": 120
+ },
+ "35": {
+ "mix": [
+ 14,
+ 10,
+ 7,
+ 4
+ ],
+ "seconds": 180
+ },
+ "50": {
+ "mix": [
+ 20,
+ 15,
+ 10,
+ 5
+ ],
+ "seconds": 300
+ }
+ },
+ "latency_ms": {
+ "QUOTE_SNAPSHOT": {
+ "feed": "QUOTE",
+ "operation": "SNAPSHOT",
+ "p95": 100,
+ "p99": 250
+ },
+ "TRADE_SNAPSHOT": {
+ "feed": "TRADE",
+ "operation": "SNAPSHOT",
+ "p95": 100,
+ "p99": 250
+ },
+ "MARK_INDEX_REFERENCE": {
+ "feed": "MARK_INDEX_PRICE",
+ "operation": "REFERENCE_BATCH",
+ "p95": 250,
+ "p99": 500
+ },
+ "L2_SNAPSHOT": {
+ "feed": "BOOK_SNAPSHOT",
+ "operation": "SNAPSHOT",
+ "p95": 300,
+ "p99": 750
+ },
+ "BAR_LATEST": {
+ "feed": "BAR",
+ "operation": "SNAPSHOT",
+ "p95": 1000,
+ "p99": 2000
+ }
+ },
+ "latency_scope": "Gated per latency class and venue on the steady window, across symbols and replicas; every venue/symbol/replica group is reported with its own count.",
+ "sample_rule": {
+ "p99_min_samples": 100,
+ "p95_min_samples": 20,
+ "below_p95_min": "max must be within the p99 target"
+ },
+ "requests": {
+ "max_missed_ticks": 0,
+ "max_failed_steady": 0,
+ "max_failed_fault_windows": 0,
+ "client_validity_scheduler_lag_p99_ms": 250
+ },
+ "streams": {
+ "max_stream_errors": 0,
+ "first_event_required_feeds": [
+ "TRADE",
+ "QUOTE",
+ "BOOK_DELTA"
+ ],
+ "min_final_bars_per_bar_stream": 1,
+ "bar_continuity": "consecutive final opens differ by exactly one interval; a repeated open is a revision, an older open is a FIFO violation"
+ },
+ "cold": {
+ "rows": [
+ 2500,
+ 5000
+ ],
+ "per_venue": true,
+ "max_errors": 0,
+ "rows_must_equal_request": true
+ },
+ "startup": {
+ "max_setup_seconds": 240,
+ "retry_codes": [
+ "RATE_LIMITED"
+ ],
+ "retry_max_attempts": 10,
+ "retry_base_seconds": 0.25,
+ "retry_max_seconds": 4.0
+ },
+ "probes": {
+ "period_seconds": 5.0,
+ "feeds": [
+ "TRADE",
+ "BOOK_SNAPSHOT",
+ "BAR"
+ ],
+ "note": "Per-venue latency probes, rotating the five symbols; not part of the 50-alpha offered load."
+ },
+ "final": {
+ "burst": {
+ "extra_fraction": 0.25,
+ "seconds": 10,
+ "at_fraction": 0.4
+ },
+ "slow_reader": {
+ "streams": 1,
+ "pause_seconds": 5,
+ "at_fraction": 0.2
+ },
+ "reconnect": {
+ "fraction": 0.1,
+ "at_fraction": 0.7
+ }
+ },
+ "trading_system": {
+ "demanded_routes": 60,
+ "every_sample_ready": true,
+ "max_fallback": 0,
+ "max_v2_error_increase": 0,
+ "max_disconnect_rate_over_baseline_per_minute": 10.0,
+ "forbidden_disconnect_codes": [
+ "UNAUTHENTICATED",
+ "PERMISSION_DENIED",
+ "MANIFEST_REVISION_MISMATCH",
+ "INVALID_ARGUMENT"
+ ],
+ "allowed_quiet_slices": []
+ },
+ "writer_health_report_only": {
+ "projector_canonical_age_ms_max": 60000,
+ "note": "Reported, not a gate: the single-writer ceiling is recorded at dl-v2-r1-outcome-20260916."
+ }
+}
diff --git a/consumers/stable/alpha-binance-paper.yaml b/consumers/stable/alpha-binance-paper.yaml
index 5ad65df6..bcc0831a 100644
--- a/consumers/stable/alpha-binance-paper.yaml
+++ b/consumers/stable/alpha-binance-paper.yaml
@@ -5,7 +5,7 @@ metadata:
owner: alpha-platform
subject: spiffe://qdl/paper/alpha-binance-stable
environment: paper
- revision: 12
+ revision: 14
spec:
sdk_major: 2
rollback_contract: V1
@@ -20,186 +20,3544 @@ spec:
purposes:
- INTERNAL_ALPHA
quotas:
- requests_per_minute: 180
+ requests_per_minute: 2400
max_batch_items: 50
max_warmup_rows: 10000
- max_streams: 20
+ max_streams: 60
max_buffer_events: 2000
requirements:
+ - instrument_uid: 00d1d68e-45b0-5cbf-9825-15ba00cb6a66
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 01c74f7d-2449-5630-b743-f563a900108b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 05658343-bcbb-5aed-87b2-1ce21349e227
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0638ba89-f890-535a-9fc7-3358aa53179f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0723c5e4-0af0-59a3-a7c6-d9c9c36968af
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 07b68da9-76a6-5e50-9de1-bf5ffe70711f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 07d4bbcf-2e5a-581c-81f5-a13caa3bfb0b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0bb4ca88-2c89-5118-a7de-5d58985ba27b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0c8454bd-825f-53f9-801c-1d1edc623a87
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0d772919-4b2c-57f4-9543-a60eb316e676
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0dc95513-2b93-56c1-8966-78e06012e967
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0e94d287-5960-5af4-89d2-a14bf24d8595
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0eee0320-f54c-50c6-8c31-cedc978f4246
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0f8b8578-7850-5863-929a-d3292a9cba31
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 115fba5d-673e-5ad8-b14d-53c6b077d8b8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 123ff4ea-21a7-54a0-9ad3-e56059b81bde
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 132d4a1b-3464-5de1-b9ad-1f3ebe728589
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 13d30031-2c7c-5df3-a625-d9aa62e58106
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1422c865-e99b-5cad-90dc-8f3ba4166691
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 145d10f1-0ec4-56ef-8098-050c7991da3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 172daa75-28b7-5d37-a0bd-86a43f7d17b9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 17c00406-ec03-5025-8703-ed77896ef07c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 18112b74-b3c6-5c66-aeac-33daaf604127
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 18b9b339-1a7f-5110-bdd1-5b3585e2ebff
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 19c3628a-2fce-505b-bd05-aceefe47132e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1bee6fd7-6bff-59ec-8d72-50ffce31b6ed
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1de09ca8-0a41-5153-96f2-edfb42bd4cd6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1efbe499-8627-57ba-bb85-3a4546926231
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 21b23463-7fd8-5950-9f2b-7fe1e67fedc0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 23552d71-b038-5575-97b9-3ae8604876d0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 24a32009-108b-54bd-b8ba-3806976c4053
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 24ed3fe9-70d2-5715-a0e6-d2dd06e02d0e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 26260988-93d4-536e-8400-f3fadbd530de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2832d236-116d-5e82-92d8-c4faae68ab1e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 28387599-f1ea-5df6-a4f2-a04aa341c5d0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 28486f53-7cf2-5fc7-a18c-3b39524c2969
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 29b5753d-f377-5c23-8df5-e40e8f7df423
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2a49a9f8-c5b7-546d-b55f-9cacf4855532
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2a8062eb-9c40-5101-9711-45c6d0a0b02a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2ba7c8e9-f2a8-5816-8b2d-9d6b0b0a6cd3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2e9f13cf-f529-575b-bb66-6caea3ee1a14
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 30e34c60-350e-5d13-8341-fe76633080c3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 327e2814-ea95-5cc6-a8d9-d6c2952dae9f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 334e1fb1-c81f-5660-b445-87aa58b5e0b4
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 34043a94-1386-58d7-a507-e80a173199d7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 355cdfa9-18a0-5274-b761-ad8dffa29ed3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 35eea6b0-e366-5885-9c58-f1c850631acc
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3726da06-2869-5143-b334-db8e1546f540
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 39392d40-34f4-5531-85db-da715726cec4
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 397bdb54-bb4c-57d8-ba48-ab6b6712428a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3a14f40f-96cf-5810-8931-35ac5b2538b1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3c6f6997-1b46-5e9e-acf9-df60b2075142
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3c70b7c6-b026-5feb-8e8b-6693b7674f0a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3d2403d3-44cb-5989-924f-946704ccc6b8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3e2393ec-4ff4-5722-bc6d-01f7085e84d5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 40ecf915-b50f-5552-ae3b-b11ba6ce7aac
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4266e54f-5d02-511f-a9df-549689ea7361
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4275cccf-ed9f-5948-904f-e4b1ae933e66
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 44cfd3f6-82e1-54be-981c-254d7f805ce5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 463ef46b-8665-5a5b-a9c8-259d2a4f18f6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 46aca998-9432-55d5-a619-72ae55c92f7e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 46f4fd8b-58db-578c-9c23-01d890296726
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 473238ca-4cf4-5dcf-8dd6-8731dd1d10f5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 47574e33-d716-5573-ab29-c2a3635f6aeb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 47871e91-fb6a-5273-9f22-fc663cdc2f32
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 47ad1648-48ef-50a8-9daf-c8beadd93cdb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 47d98081-d269-5aeb-9766-5f689e2c6b35
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 486818ad-fab1-522c-bb5c-9258c3911afe
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 48c9207b-c6c9-5901-ad33-368f55774c47
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 49355b7d-5da7-5768-bded-cf08dfe0ddca
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4948e3b5-3037-57ba-88da-3b10f69d0627
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 49fd25fe-bbe4-5c84-97c2-510dd94dddd9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4aaf2734-e6e6-5ad1-b5dd-1dac4aa549a5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4e448108-2fdd-506a-9cf6-ca999736f8fb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5068359f-b79a-5501-833c-4bc0bdcddb8c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 51cce06a-7b90-5c59-be0e-433d02cc4f7e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 52a78a60-e48b-5507-b823-e5b8867db2df
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 54de4137-c09a-52f0-ad34-696fdd5b4f04
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 54dfc708-50c9-5cb4-aff3-3a7b372014b3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 555b8bc8-ad58-5bea-83ef-0a59f7d8032f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 56075a4c-2f7b-5773-a88c-a7b00323721a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 56277e8e-e8d2-56ec-bf9b-cb742cf17883
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5a093e28-0a61-5d94-adbf-5f88f221496a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5a5e88ec-7e10-5f61-9b23-78aacd43ad1d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5c42b635-5750-5801-82a7-95ed1d3d6e31
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5dd80de2-abd6-5fd9-aae6-2eb0fc73738b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 61352f58-1260-5a3f-a4c3-389c74b74ec5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6253da80-82c8-5692-9d71-73a071d66ca8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 64e64842-f7cc-52a3-a72b-8400375f5505
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 64f3b5bb-feb8-5035-909d-fd5aaff1f7cc
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6765fdee-a03e-5596-bed2-a33b415087d8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6a503e86-9477-53de-be2a-2e9af1fd5163
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6aeb7e7c-9024-5160-8ede-be20c6d489d3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6af3697a-83a0-5c72-9e1f-22a111c47cd4
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6bb5fd3e-27ef-5cbd-b535-df991800b752
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c00dc57-9aad-5881-910c-6dab3b593b53
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6cf90303-3b4a-58e9-94f8-3574c64c3fa2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6d64b790-bb5c-5d6c-9377-09b12c56b5eb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6e48b1c7-2340-5e07-aacf-1c6048498b00
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6f42584d-668f-5dab-80a1-a00058020e24
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7107b106-eed7-513c-8c1b-0a1ff512afee
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7228c509-3bf3-510f-9f00-63625011fc9b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7270dafa-54f4-5bc8-8190-71b330ee95b5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 72f3bbcf-3630-5e35-b583-5721f484266b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 746233b9-ee75-5cbc-8a6c-daa63a4d82ce
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7524658d-fa43-5121-91c5-fd55afea5953
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 77296e5e-bb08-5aa2-94e0-96d7e7adb517
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 78148a03-d1cf-5907-a639-ccbcbb0975fd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 789ea412-0d8d-5d54-a4a4-a0ea2dee338c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7d3db013-5ac0-5483-ba8b-0f03441f5672
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7d9c02f5-b2cd-507c-a478-ccfeba874b5d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7fec48ed-999d-52ef-8872-bbda8b1dffe7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 82c3d1ea-8098-5e21-b841-e51469ca5bb0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 830f340b-3646-5066-b5e7-4d0b126a44fe
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8375c606-0c2b-5e50-8f16-64650fcdedc0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 841529df-3a07-505f-b19e-dde3762242cf
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8425e4e9-5eef-59fe-aee3-50a5616aa529
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8540dfa8-3e81-5216-88b2-9a551d94fd6f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 86b2ba7e-454f-53d0-b404-803f937583a5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 870270bb-8d67-5eee-82e5-93f24b2fcdb1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 875e2059-18c6-5e10-bfbe-67894b86386c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 879ff3cb-0774-5705-b2fa-82101137410c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8832e103-2121-5ef4-b1c0-d8e55e1f40e9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8871d17f-b326-5ae6-9e7b-fd3dff2b0815
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8876d78b-3edf-5e4f-9be4-7be3b2db1966
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8947d88d-729a-59a7-bb25-3e1189b7a5ac
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: TRADE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 15000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: QUOTE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 5000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1m
+ warmup_limit: 10000
+ max_freshness_ms: 180000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3m
+ warmup_limit: 10000
+ max_freshness_ms: 540000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 5m
+ warmup_limit: 10000
+ max_freshness_ms: 900000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 15m
+ warmup_limit: 10000
+ max_freshness_ms: 2700000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 30m
+ warmup_limit: 10000
+ max_freshness_ms: 5400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1h
+ warmup_limit: 10000
+ max_freshness_ms: 10800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2h
+ warmup_limit: 10000
+ max_freshness_ms: 21600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 4h
+ warmup_limit: 10000
+ max_freshness_ms: 43200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 6h
+ warmup_limit: 10000
+ max_freshness_ms: 64800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 8h
+ warmup_limit: 10000
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 12h
+ warmup_limit: 10000
+ max_freshness_ms: 129600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3d
+ warmup_limit: 10000
+ max_freshness_ms: 777600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1w
+ warmup_limit: 10000
+ max_freshness_ms: 1814400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BOOK_SNAPSHOT
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 60000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ max_session_liveness_ms: 45000
+ - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ feed: BOOK_DELTA
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 2000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: 8b09286f-23d1-5740-8372-4a34941d74b7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 91733082-acf5-569b-8029-1e38ed470d51
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 921f65bb-ef9f-5869-9a43-52655e58aad9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 922e938c-8c6b-5c10-a6bd-8e21a0db4b35
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 933546f2-5d49-5a75-9313-231ce70bf001
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 935b8777-171b-5d46-94d7-cc6d55e57ea3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 94469df5-8e0e-5839-85c1-f6464481b1d3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9446e524-b1ae-5e7b-96ac-b699a171c87b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 944cf7e3-3429-5f32-9b47-594aa0c525c1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9492e60f-ef93-54c1-8a82-120a66af229a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9591218d-358d-5d5b-aa1c-7d9653e487ad
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 96004c94-3fb4-5eba-863e-3e0167e7a606
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9603abcf-8d45-588f-a676-2872dc3c62ba
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 966b2e80-c83a-5ad2-bb60-af1daea63fca
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 98d54c7c-3319-5a73-9c36-6a66dcbabd6a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9c67e4be-b8bd-5203-ae50-445479a4a48e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9cea9ea3-bffb-5af7-ba48-266c77a830bf
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9d5eafc6-2af9-5f86-9950-c9bc0beef049
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9e012444-b0b9-55ab-a994-a6a2b8384b02
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9fb02777-3d2f-51bd-86e9-a37e52224326
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a0053062-3a08-5328-8869-5148cf4def68
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a0d9742b-a58d-5cbf-808a-efe8de857cbe
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a0e845a9-a853-50b1-b256-913925fbf1d2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a1899d6f-1b1b-53e4-9f6d-53850d91f93b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a2ded063-b730-5294-a024-b1c4abcadc5e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a2ecb519-7c65-5c8e-b489-b6b0aa663e53
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a478a674-5118-59a0-8a89-49f9d9d17910
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a570e234-e1e3-5c85-aade-f95859ac928a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a5b65023-ca4e-522a-a14a-42d57ed978a9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a76839ab-ecdd-59ef-9416-17ac1af4b3d0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a76febbe-c89f-5d57-b68a-3089e7b1a512
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a90edd17-ed7a-5b6e-90c6-b38c9de23edd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: TRADE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 15000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: QUOTE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 5000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1m
+ warmup_limit: 10000
+ max_freshness_ms: 180000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3m
+ warmup_limit: 10000
+ max_freshness_ms: 540000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 5m
+ warmup_limit: 10000
+ max_freshness_ms: 900000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 15m
+ warmup_limit: 10000
+ max_freshness_ms: 2700000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 30m
+ warmup_limit: 10000
+ max_freshness_ms: 5400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1h
+ warmup_limit: 10000
+ max_freshness_ms: 10800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2h
+ warmup_limit: 10000
+ max_freshness_ms: 21600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 4h
+ warmup_limit: 10000
+ max_freshness_ms: 43200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 6h
+ warmup_limit: 10000
+ max_freshness_ms: 64800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 8h
+ warmup_limit: 10000
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 12h
+ warmup_limit: 10000
+ max_freshness_ms: 129600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3d
+ warmup_limit: 10000
+ max_freshness_ms: 777600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1w
+ warmup_limit: 10000
+ max_freshness_ms: 1814400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BOOK_SNAPSHOT
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 60000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ max_session_liveness_ms: 45000
+ - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ feed: BOOK_DELTA
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 2000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: a9813a7f-04b3-537b-abbb-8bc599de3873
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: aa92932b-1957-545f-825d-8d62cff956cb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ab468c88-f893-52e4-8334-f04ec8907fa6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ad64efb9-c362-5e43-a52d-369589b8f662
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: af23ec18-0a39-56bf-ac1b-87d5e2248251
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: af73725a-ff81-59f4-980d-06bd4cc2c082
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: af7e715a-ccad-5012-9fd4-bd7c16d4fcc2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: afb33b46-b1fd-53cf-8df6-7c881c12f6a1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: afd75136-bcc0-57ed-a85b-10d470fb8336
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: afdb7e7f-fd83-5bd7-ac2b-5bfa08397f66
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
feed: TRADE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 15000
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 15000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: QUOTE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 5000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1m
+ warmup_limit: 10000
+ max_freshness_ms: 180000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3m
+ warmup_limit: 10000
+ max_freshness_ms: 540000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 5m
+ warmup_limit: 10000
+ max_freshness_ms: 900000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 15m
+ warmup_limit: 10000
+ max_freshness_ms: 2700000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 30m
+ warmup_limit: 10000
+ max_freshness_ms: 5400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1h
+ warmup_limit: 10000
+ max_freshness_ms: 10800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2h
+ warmup_limit: 10000
+ max_freshness_ms: 21600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 4h
+ warmup_limit: 10000
+ max_freshness_ms: 43200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 6h
+ warmup_limit: 10000
+ max_freshness_ms: 64800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 8h
+ warmup_limit: 10000
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 12h
+ warmup_limit: 10000
+ max_freshness_ms: 129600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3d
+ warmup_limit: 10000
+ max_freshness_ms: 777600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1w
+ warmup_limit: 10000
+ max_freshness_ms: 1814400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BOOK_SNAPSHOT
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 60000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ max_session_liveness_ms: 45000
+ - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ feed: BOOK_DELTA
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 2000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: b41b2b3f-65b7-509d-a0b3-e7f3440d9a6a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b616b571-b4db-5d27-ae73-0e03e71e3125
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b6af67f3-e4ea-5982-a4d2-e2a4ed8b823e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b7b0141d-1de2-5b79-af97-a4d60ff6a9f5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b7b526a6-9361-5d6f-b4cc-f33a0ed80d47
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b96798e4-730a-5634-8c1a-8a4094b01660
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b9c46ba4-1d0f-5fbe-a751-b2bd086f5a23
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bc65c082-4ca8-5450-8597-f7f65a0ba923
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bcd51a8d-2e9f-5c7e-9796-eda0427c43b1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bdf97724-b6a0-5891-801a-a6a951c9174e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: be066d07-eee6-50a8-a137-73949877eeea
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: be32efaa-307f-595b-bc0a-4f1e5e00aba2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: be6c712f-0218-5350-b162-75cd18a1e8d1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bf08776d-5b74-54e8-8330-dd87635e9435
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bf1f6c47-30eb-5467-aea4-a66760bf5e5e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bf47b0d3-dd95-53fe-be70-52a0d8975e44
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bfbd909d-851e-5b08-93f3-197719ad65e2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c07b42ad-ab20-599a-b33f-053209030c55
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c26690f5-48a3-5cc3-8997-3c10a2a8b413
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c494f843-964d-549c-ae22-7831f47327ea
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c4f936dd-3d28-54c6-8b01-30296462bbb9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c62e2e82-9528-5d8b-96d5-2b22eaa4badd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c684a346-4477-5d60-a3a2-07907ea6657c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c76c9c52-1ca5-5d63-a9c4-03b9df5954b6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c7717222-2721-54a5-9119-4397db9205f0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cc0ebfed-f4ea-55dd-a7a6-fa83ff72befc
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ceddccfd-3365-5c05-bfb8-660f7ec23bad
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cf1b39f8-e1e2-5826-9683-67f3a1e11da8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d0a88aa5-d055-594d-9db7-fb56b8c06680
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d0b4908a-8eb5-5155-9c19-0880eb94aace
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d152df3e-e0d3-59b1-ba1f-7fa427418803
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d155abb8-8f0f-5934-81cc-39f102c4f2f5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d3583ef9-febd-54a0-9d23-5a2f62f6dbbe
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d397ccef-78a6-582e-a22a-52f39137a180
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d3a82a86-2d20-5b86-b9fe-5e53176d94d7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d4316760-92df-50ad-b291-79b043564d85
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: QUOTE
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d4ab40bf-f09d-5fe5-9d04-e9f3fef19d69
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 5000
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d4b0d87b-fdeb-5b7b-86bc-381ee82ecd1f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 180000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: d4f4fccc-77ba-584a-893d-db5c7fe40d9a
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 540000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: d7ab8d28-d6c2-5fab-876c-c968296b482d
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 5m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 900000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: d909a518-8b6e-5286-ad80-ac435c739328
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 15m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 2700000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: da43e311-fa63-5201-ba73-a92e3672a3b4
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 30m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 5400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: db35329e-fec3-5e5e-8dea-0e0e42aa71df
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 10800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: dd71effc-462a-5862-997d-74a587a49b61
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 21600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: de05bab8-6979-5f2a-ac65-fe3ca6141157
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 4h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 43200000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: dfbcd529-82a2-52f0-892c-529e0a38c350
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 6h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 64800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: e0377966-ec4b-5dd6-994b-ad4c0542e214
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 8h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 86400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: e10c1a3c-f11a-57d8-ba19-c3c04dbeb028
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 12h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 129600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: e11e62f8-26b3-5d07-8bfe-1d4603547dc9
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -212,62 +3570,59 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: e178f3a4-1ceb-5e0e-adc2-a3123c89d420
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 777600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
+ - instrument_uid: e1c5a42c-cd07-53de-b750-372fe3f3879a
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1w
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 1814400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: BOOK_SNAPSHOT
+ - instrument_uid: e2688e6c-660f-5deb-ba4b-5690d98ee452
+ feed: BAR
consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- max_session_liveness_ms: 45000
- - instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
- feed: BOOK_DELTA
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e395cb40-0cbd-5603-83b9-9c30ec14b062
+ feed: BAR
consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 2000
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: TRADE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -282,7 +3637,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: QUOTE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -297,7 +3652,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -310,7 +3665,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -323,7 +3678,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -336,7 +3691,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -349,7 +3704,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -362,7 +3717,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -375,7 +3730,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -388,7 +3743,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -401,7 +3756,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -414,7 +3769,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -427,7 +3782,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -440,7 +3795,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -453,7 +3808,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -466,7 +3821,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -479,7 +3834,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BOOK_SNAPSHOT
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -493,7 +3848,7 @@ spec:
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: LATEST
max_session_liveness_ms: 45000
- - instrument_uid: a953e16e-7138-5562-b5e8-c337a44d0b65
+ - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
feed: BOOK_DELTA
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -505,183 +3860,101 @@ spec:
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: TRADE
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 15000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: QUOTE
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 5000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BAR
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 1m
- warmup_limit: 10000
- max_freshness_ms: 180000
- require_full_coverage: true
- require_final_bars: true
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BAR
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 3m
- warmup_limit: 10000
- max_freshness_ms: 540000
- require_full_coverage: true
- require_final_bars: true
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BAR
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 5m
- warmup_limit: 10000
- max_freshness_ms: 900000
- require_full_coverage: true
- require_final_bars: true
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BAR
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 15m
- warmup_limit: 10000
- max_freshness_ms: 2700000
- require_full_coverage: true
- require_final_bars: true
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: e4cebf99-5916-5aa6-ab39-f66cbecba1ca
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 30m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 5400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: e4e0e48e-9508-50c5-bce5-0abce19965b9
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 10800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: e52590aa-7cd3-5cc9-9fd6-71026ee0eb26
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 21600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: e70f56d4-69db-5b2c-9484-de67bd4ec8bf
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 4h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 43200000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: e840b0bc-066b-5a63-9368-8654ade8462f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 6h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 64800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: e85dc2e1-f82f-544f-b55e-3176925d996c
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 8h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 86400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: e8fe4622-da4d-5922-a87c-eddfb07c88f6
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 12h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 129600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: ea9b707d-7913-5476-b9c7-a17a3c42d7c9
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -694,62 +3967,33 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: ecfceb71-472a-5e6b-8228-51fe99af10dd
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 777600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
+ - instrument_uid: ed47715e-b8e0-53b8-a82c-686b40c69eaa
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1w
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 1814400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BOOK_SNAPSHOT
- consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- max_session_liveness_ms: 45000
- - instrument_uid: b2d78145-b541-58e2-941b-06c44c65e45f
- feed: BOOK_DELTA
- consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 2000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: TRADE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -764,7 +4008,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: QUOTE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -779,7 +4023,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -792,7 +4036,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -805,7 +4049,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -818,7 +4062,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -831,7 +4075,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -844,7 +4088,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -857,7 +4101,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -870,7 +4114,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -883,7 +4127,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -896,7 +4140,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -909,7 +4153,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -922,7 +4166,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -935,7 +4179,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -948,7 +4192,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -961,7 +4205,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BOOK_SNAPSHOT
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -975,7 +4219,7 @@ spec:
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: LATEST
max_session_liveness_ms: 45000
- - instrument_uid: e4ce7249-a4e8-5073-beb8-dab908596c34
+ - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
feed: BOOK_DELTA
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -990,180 +4234,176 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: TRADE
+ - instrument_uid: ef08a051-1cfb-5456-83e2-a0ceff1a1bf4
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 15000
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: QUOTE
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: f0fc7947-d63b-5d68-9693-e57180133118
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 5000
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: f122c0e0-d424-55af-a030-a421e88e6549
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 180000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f1fa334d-15e7-5ca3-9e11-5b805b3426a1
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 540000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f2816e98-1b6c-5558-a201-02b744d72cc3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 5m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 900000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f3d07537-e856-5793-9fe4-75d9f1e54e5b
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 15m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 2700000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f41d64f2-dc4f-53f1-8911-bf8dd7a59249
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 30m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 5400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f51c770c-f711-54e5-ab83-8ef6cc63d247
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 10800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f5fb66fd-577f-59cf-87a4-9d1d43547626
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 21600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f693e7fa-26b4-554f-b4ab-5d34841777e5
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 4h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 43200000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f6a20794-dd2f-5d62-943e-dadb6e05749b
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 6h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 64800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f6b38750-2d9a-52ff-b76e-9f26fb70bd46
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 8h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 86400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f75e5f45-7f1b-5282-9acc-18800ba9364e
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 12h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 129600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f888a2f7-79c3-5a8f-9170-cca6be1325f5
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -1176,61 +4416,71 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: f975d17f-3347-5fcf-b56a-fb8b8f6b0de2
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 777600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
+ - instrument_uid: fa2e9712-8ce9-538a-8b92-37c85401156c
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1w
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 1814400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: BOOK_SNAPSHOT
+ - instrument_uid: fdde788f-16a2-5b0b-a66b-19ae99a38d08
+ feed: BAR
consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- max_session_liveness_ms: 45000
- - instrument_uid: ee93fabf-68df-5b50-8924-51bf25a5a757
- feed: BOOK_DELTA
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: fdfdbfc0-5545-5fb1-bd8f-5c4a345ada59
+ feed: BAR
consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 2000
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: fe2efca0-97a3-5b71-977a-e64af44d657c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
- instrument_uid: 8aedd349-6999-5874-b0dd-34c6451c0b3a
feed: BASIS
consumer_grade: ALPHA
diff --git a/consumers/stable/alpha-okx-paper.yaml b/consumers/stable/alpha-okx-paper.yaml
index 42af206c..346dd4f0 100644
--- a/consumers/stable/alpha-okx-paper.yaml
+++ b/consumers/stable/alpha-okx-paper.yaml
@@ -5,7 +5,7 @@ metadata:
owner: alpha-platform
subject: spiffe://qdl/paper/alpha-okx-stable
environment: paper
- revision: 11
+ revision: 14
spec:
sdk_major: 2
rollback_contract: V1
@@ -20,13 +20,3394 @@ spec:
purposes:
- INTERNAL_ALPHA
quotas:
- requests_per_minute: 180
+ requests_per_minute: 2400
max_batch_items: 50
max_warmup_rows: 10000
- max_streams: 20
+ max_streams: 60
max_buffer_events: 2000
requirements:
+ - instrument_uid: 00014941-4c7d-5d7a-92cc-00a83d5cf499
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0414ddcb-cdf9-5526-bee6-c1e163b0dddc
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0641ed20-dbfb-52af-be4c-fa513302dda6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 07013277-a316-5034-b845-949aef2c6d33
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0894b131-b84e-5572-8739-cdf71c3635d9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 08aae292-6843-515e-9dc0-b3df41676f40
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0937b736-4c89-563f-ab1d-ffdab60ff40a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0c366f91-4035-5e8f-a90d-79b7fe6f9d8f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0c4da48d-3f48-5d08-a5ab-077db6880253
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0c9901a2-d4ff-53d6-b55e-66bc1fe92f23
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0d6874fd-9a88-5f6f-bb81-61233d9870db
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0dcec1fa-50ad-5331-9f21-54a763d63728
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 0e38b4ee-be80-5bf8-9c23-2ff2172781bd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 12db7dc2-d833-569e-ade1-36d630dc90a8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1386e6fa-2743-506b-90e9-e312c87d0b30
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 14d5f443-1410-568b-9cad-ea30566aa1f2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 15e8ca6e-7618-524c-8548-dab9d49d155c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 15fc9a9d-0df2-5151-a349-584edc626597
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 176b8d35-f51e-5abb-8eda-fcd70b43b2f0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 178533cf-690f-53b6-892b-8d2064e856cb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 17b0014a-f8aa-54b3-aba3-8bb3b53a0cb5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 17b7003c-122e-5e83-9347-757a0f55deb8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 183d6b91-1ac1-5334-9b0c-f86a98316df3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 195652dd-5450-5ed1-8059-3a90ff9d2e3d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1a495947-d440-5313-b4b5-491c73ded166
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1d51893f-f23d-5ea1-a0db-e98d5d85ddf8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1ddf760f-6bde-550c-81ab-928b528b0796
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1df523d5-6806-57a8-80d0-7a86598b321b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1e759e5a-7609-57d9-8376-dd32765a78a6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 1ff01016-b08e-5be8-b10f-30e4a459c5e3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 203a98b3-8a3e-5453-8355-e54e502f3e0e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 20646822-2fc8-5481-b537-5512f04bbfcd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 20b68200-9172-5ad5-9bbf-de59df6bf723
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 20df3a21-188b-5d43-bd86-89cdb130b05f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 235049a1-cf7f-5522-b01e-e37d40f9369a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 235dac6d-c8f4-5fdf-9e43-c63b7acb2695
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 24c96a8e-7426-5015-b35c-6f3d68a07ab2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 256ec9a1-8d20-597a-b2fb-38f5dc1fe565
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 25e71abf-12a5-5592-bb66-01aeb4ec654e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 25eef1f1-eee5-5f91-8312-4e63c09d3a06
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 26baedc8-2048-50f2-9a1c-af80f289753e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 26e96bfc-418b-534a-b86b-8845cec5b53b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 270bf956-2840-5f96-8280-f4d6086edf9f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 27982e73-8051-5150-9427-09d97acfe909
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 289763f0-b5a1-54c7-bba4-056f17165f0c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 292be648-85a0-5bc0-b2ac-a92b78bf59b3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2938c47d-5ce9-5831-902c-39668fde211f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2a20f1eb-ccd6-591d-aea6-310c5273eef7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2b84d2ac-ae1c-5f7b-892d-0ee66ea524ce
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2bf7bb7d-d4be-51fa-934f-89687d9c89f9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2d440aae-79d3-5944-821b-0dca146f4f5a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2d9b86aa-6d14-5b37-9606-cbeb7f9fb99f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2e519d06-1197-50f2-acf8-62f5dfc66e2a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 2f110c43-e43d-5784-8ceb-9970d2d16742
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 30f599c1-3235-58aa-a8cb-734f70804b89
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3146ec6a-27dc-5e20-9a42-39063691ca94
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 318696f4-cfb2-52b1-9f52-105f6a8ac140
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 319aae36-a24a-5e82-9b70-aa2770aabbee
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 31fa85a6-84af-5460-a60b-60d36d7dd9c1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3225191d-c00c-585f-b9b2-38638a334156
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 33e59369-e856-5e56-a8ce-7353901b4145
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 35774e81-f965-5c8e-accf-3324fecc1fa5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 35b1c49f-18fe-5ef3-945c-e49b6201ffc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 35bf552b-63d1-5895-9701-0250484053ab
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 36634174-d68e-5d1b-8a57-0746757d61ae
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 38720d66-4542-519f-8340-f51bc0435fc5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 387cd038-59b0-5bbc-a1d0-b70c809fdbaf
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3972e5a1-86e2-5ad3-b618-fb0c3c3883b5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3a073d46-0cc7-52c3-84ab-7e9dcc070d29
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3a3e5936-9911-56a6-8c11-f74a5df1ae48
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3b9dba04-5e62-5afa-9646-1ea56ea22c71
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3bf03be6-473d-5b0d-98c1-229146bb1ca9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3c1609c9-5606-53bd-ba2f-92ee45eadf5c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3da91678-916e-5b47-89e8-f17415a6c86f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3e398787-071d-5908-a5e1-2ce40fdc1ab5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3fc9f34e-9f0b-51f7-88e5-541bce2ffa01
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 3ffaf140-0a92-512f-9024-d5e2ee2fe059
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 42cadfc3-bbc5-57c8-9dd7-3db712ea2c50
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4546dfee-c278-5efd-932e-6c7d70fe7614
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4577295f-71f8-5786-b492-3860d3628a0b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 45d2fda2-8fd6-58da-a98f-7f88ecfdb233
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 489ea514-438e-557d-afd0-1f45af70d83e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 48ab37f6-4785-5ad6-b3e3-916d52a99fcd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4ad24830-64f9-5e62-b115-f11c5619bdef
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4c64df18-1b0c-5421-8fa7-311e99b8f2c3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4dfc6d0e-ead5-5b66-b680-ab4be9fcb006
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 4ed9c3b0-c7a2-5503-9b76-6e55bfd2796b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 507e7575-15f4-5f2e-bd0b-e846fe5526a0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5165ddf3-9ae3-58de-ac8a-8d63ccaee28b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 529720c7-b5fc-5cbf-a468-bf7d090de894
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5336b28c-d8c6-5ec9-a71d-f35fffe2b35d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 54f7a9c4-b91b-50d5-a8d9-8c4e0481f2ec
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 570343fe-2838-5406-bbfb-f33f719eeb93
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5788acc3-3acc-56dc-91b5-3864d190995f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 58356b9a-8f38-5bb9-b04a-9f6955732264
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 584edfc0-b4dc-55fb-92ba-6c11d6c23beb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 58d2c7fc-59d2-5269-9523-6303dfc8bcce
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5b8fa4b3-8e22-527e-9c5f-1bc4bce52ea1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5c0400ee-5571-5e36-ae79-5898f75f7e49
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5cdb4aec-8296-5fe4-8819-4d4c59359237
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5d2fbdcc-38dd-56be-b409-25f9a6e292eb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5e2aad21-b8c6-5a22-badf-df62fcfd8b8b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 5f170209-f395-577f-8871-bac517578c30
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6060943d-4f6b-5a3f-a7b7-33e32b136f9f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 60a93fc7-e0c2-5bf1-baba-91248afba2d0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 61db3057-2ee1-5185-a84f-639b8bc5f0e8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 62df6d23-97c0-56d2-b692-2599900de181
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 63b3db9e-afe4-5b72-821a-184be6395dd4
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 646c3736-dfab-5991-b6da-630371e190dd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 65a8ce81-79af-5f85-9e44-4475ae3605d2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 65f789bb-7953-55b3-88ed-bb47357ad12a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 65ff2489-e48d-5bf9-add1-c6914ee0256a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6725804c-2929-5315-bd4e-4a21d3825f75
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 690463df-9bd3-5454-a02c-5f4ed16d0cc3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 695383b0-8790-5789-9eac-4704b3087cbb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: TRADE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 15000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: QUOTE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 5000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1m
+ warmup_limit: 10000
+ max_freshness_ms: 180000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3m
+ warmup_limit: 10000
+ max_freshness_ms: 540000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 5m
+ warmup_limit: 10000
+ max_freshness_ms: 900000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 15m
+ warmup_limit: 10000
+ max_freshness_ms: 2700000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 30m
+ warmup_limit: 10000
+ max_freshness_ms: 5400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1h
+ warmup_limit: 10000
+ max_freshness_ms: 10800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2h
+ warmup_limit: 10000
+ max_freshness_ms: 21600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 4h
+ warmup_limit: 10000
+ max_freshness_ms: 43200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 6h
+ warmup_limit: 10000
+ max_freshness_ms: 64800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 12h
+ warmup_limit: 10000
+ max_freshness_ms: 129600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2d
+ warmup_limit: 10000
+ max_freshness_ms: 518400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3d
+ warmup_limit: 10000
+ max_freshness_ms: 777600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1w
+ warmup_limit: 10000
+ max_freshness_ms: 1814400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BOOK_SNAPSHOT
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 60000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ max_session_liveness_ms: 45000
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: BOOK_DELTA
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 2000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: 6ce36c6d-918e-59a9-8b5d-372b6ab95d52
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6d3356bb-1bd4-53ae-9e44-f6f5f922c113
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 6eab37a2-e239-501a-9c28-bdb217207626
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7152cd4d-c839-54cb-9380-833718f8ed53
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 71811c18-9781-5d02-9d09-26e6177ae6c2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 71938fe0-fd7b-55ea-b43d-569751b83945
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 71f6156c-a6f2-5cc1-b917-0a60c5966bd3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 73db6ef0-8d34-55fa-ae44-a531598b5c19
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 748fd517-7800-5b0c-a9b0-fbd43c6fa65f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7550c6c6-2f96-55cf-b1ba-d4cc98f0ff29
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 75ca584b-3205-54bf-81bf-e1e712bbb724
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 79f2eb58-b5bc-5319-8e8a-4b7951365d67
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7d0a90b7-1135-5fda-9dd3-1679af5ca334
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7d199ba4-65b9-5d0a-a61e-0329cad893f2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7d5325c8-5aca-5be3-9f12-f32e1ee54403
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7d65b700-2308-5a0c-a7a9-252d41c80981
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 7e348480-a4c5-564c-b594-8c78c1b61c38
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8198b1a1-966b-584b-95cf-40fd8877de2c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 82032262-6777-5cf9-8f1a-bf683a6ddb41
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 853e2ca1-d5ec-5ce1-b7aa-2d0384a242f2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 86b10bc8-6dd9-51a0-ad1d-5c56b1491bee
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 884cf4b4-b78d-5b31-862f-92f6c3a59781
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 895966bd-d394-5110-81da-212f87eb5f1b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8ae72fb1-bcd8-59de-8a72-dce8afc111b9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8b6e8b7c-bbef-5f4b-bd43-26d6807b7ed3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8c029be8-d578-5909-b2af-10ed4d7092c4
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8c38db3b-1506-5cb8-aad8-88eff197632b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8d648cb4-d326-52d5-8812-5b75a638c275
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8d68ba2a-28c6-597c-94ec-a34cbda836d1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8d97188f-2e7d-5da4-8119-f0a72b370ce0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 8f467d3f-0a67-5b81-82f9-16f0d8385b39
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 90c794b3-17ca-5335-876f-244747669c7f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 90f3b14e-e641-5e4f-a838-139b568ae459
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 911d8f09-a9c1-5d0f-b448-8ff475f26fac
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9351416b-7e70-583d-8b77-869eb6c5bea0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9413e3e7-2a07-5580-a1e2-c94693917f36
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 95294011-4f97-5df4-bac8-b9a1e128e595
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9662e66c-84cc-5cfa-a5e6-28339c41bdc2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 98d5b8b5-75af-5e2b-b9ce-1d0480d98316
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 99660d9e-89eb-5e36-82a9-386a20e9456a
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 99a4b5da-751f-54f9-85b2-b37fac4f1c84
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9f885fc0-baed-514b-8208-93680d827cd5
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: 9f8acd08-a48b-5250-8f11-cfba5a08d003
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a06885be-3b01-5dcf-80a0-a06da823219d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a0a4d5db-8302-5642-9bd4-b2793fe1be87
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a0ae3b67-529c-5c60-b1d5-992b2a5dfe90
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a2098fe2-1ea7-524b-973a-51a12170995b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a34f42e7-0573-5df3-80cd-9084b7f75687
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a3b5105d-867a-5642-8bd6-839890060801
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a447abdb-17fa-52da-9499-aaf4cf51048e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a583d89b-cbb8-522a-b0ef-2d45958b97be
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a640fd51-235d-59b7-b21a-c2e6b42e8eea
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: TRADE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 15000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: QUOTE
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 5000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1m
+ warmup_limit: 10000
+ max_freshness_ms: 180000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3m
+ warmup_limit: 10000
+ max_freshness_ms: 540000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 5m
+ warmup_limit: 10000
+ max_freshness_ms: 900000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 15m
+ warmup_limit: 10000
+ max_freshness_ms: 2700000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 30m
+ warmup_limit: 10000
+ max_freshness_ms: 5400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1h
+ warmup_limit: 10000
+ max_freshness_ms: 10800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2h
+ warmup_limit: 10000
+ max_freshness_ms: 21600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 4h
+ warmup_limit: 10000
+ max_freshness_ms: 43200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 6h
+ warmup_limit: 10000
+ max_freshness_ms: 64800000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 12h
+ warmup_limit: 10000
+ max_freshness_ms: 129600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 2d
+ warmup_limit: 10000
+ max_freshness_ms: 518400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 3d
+ warmup_limit: 10000
+ max_freshness_ms: 777600000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1w
+ warmup_limit: 10000
+ max_freshness_ms: 1814400000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BOOK_SNAPSHOT
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 60000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ max_session_liveness_ms: 45000
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: BOOK_DELTA
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 2000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: a6acc2cc-47b2-5408-956c-6d9516376d78
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: a94e40cf-8e6a-5861-ba13-dafed1d90271
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ab30f1b5-36ae-5ed3-8d53-75389fa69760
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ab646932-485c-5c6f-92c1-65427d0c4a96
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ac172201-2cdd-5d63-906a-5e567bf2a6f7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: adc4bf83-b054-5f94-8ff6-7678579db124
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ae8a6bb7-2cd4-54c3-b4f8-361b9e8975d1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ae998e95-9c34-5d87-9e0e-8677dcea9e1f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: aeb5de89-5b1b-55ee-9168-09d36928c04d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: afefd678-4d6f-51a9-82aa-8cf6584c1280
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b05f357a-776d-5fb2-a701-483e0838bf6d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b07cf454-cbe6-58ab-a0db-c6f2cd0c9aaa
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b1eba3de-3bef-55a7-9f3d-a83b0f5b2883
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b62cec8c-d821-5a30-bb62-3fccb691e94c
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b825c1a3-edec-52b7-999c-a336a4bcd817
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: b9e653fa-d3cf-5fae-bd8e-c5abc89f8a0f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: baa311c7-ab43-5131-b076-64337b2e2c39
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bad074bb-5acd-5bcd-943c-0219c7fd7beb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bd0199bd-f1ef-591c-b8e8-302087a52eb8
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: be5ea6cc-f563-51fa-bc10-9c058c425bf3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bee2d394-e836-518d-ab8e-2df7c5d2f804
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: bfef0630-a478-5996-a534-78a181d72cbc
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c2577593-ef21-50d4-ad40-3c23bb0fa4cc
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c2a4cfc9-f776-5b5f-92e5-93968a3b5f7f
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c3705bd0-6cfc-5fce-b553-a7a9cadfae83
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c3b6e04c-e7ea-5345-8bf7-53548d7ca3e6
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c3b75c12-276b-5a3d-8313-dc7145c321e7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c464706c-3b06-56e0-944e-f267bc9a6ce3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c5b36eb9-1f69-5f18-90db-6d517c0488bb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c6ae2a4c-3338-544d-b14e-05035b0976cb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c7931346-0c07-52e2-86ff-54453b265e14
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c82e28aa-40a0-50b0-94b1-67d52f67689e
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c86dd48a-f192-5370-9023-cc8654f83f30
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: c93702ef-d71b-512e-8cc8-5ecd3615a644
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: caa279de-37c7-5511-aa49-c173cd3b2208
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cc8696da-de35-5b97-a735-305be3007c5d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: ccdc25a6-00a2-593f-bf6c-98d6a45441fd
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cdb92414-5c7b-5513-a600-371746aa36fb
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cec3acd8-dd93-5666-8aaa-257f41cd90ef
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cf6b9041-4ee3-5085-b4fe-96dca6d5e559
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cf8247ac-2438-5123-90c0-5774c79d0ca2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: cfb1b966-854f-5ae3-ada3-a20f775cc056
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d10ee13d-a2a2-5305-bb0d-678a9c63c5e2
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d35d084c-ebb6-5fc0-9e7c-f71a1a0b1228
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d3d01f05-c55c-5871-bac8-26ccfe5af5b0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d51c82b5-73b7-59ac-9619-162ae56cbf31
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d5a36311-364a-5c91-bdc1-e4aa7a6a6847
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d7657b6a-8c62-5c36-b0cf-865b310a50e0
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: d7d32090-97db-5095-8253-b5de3e21d5d1
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: da4e0df9-0b8c-54c1-9a9c-309187cbb94d
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: de72f091-5621-58d0-af8a-db73f1c171ee
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e00eeab2-0a7b-50a1-ba68-05d951812aac
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e0acf5c2-36a0-586c-aa61-f605130f80b7
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e1dbf2df-216a-589f-9d50-160825eec9c3
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e20788ab-5f1e-54f9-9db7-eb43eadcd6d9
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e25cd054-6591-5215-ab8e-acea61b96e3b
+ feed: BAR
+ consumer_grade: ALPHA
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: true
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: SNAPSHOT_AND_REPLAY
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: TRADE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -41,7 +3422,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: QUOTE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -56,7 +3437,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -69,7 +3450,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -82,7 +3463,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -95,7 +3476,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -108,7 +3489,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -121,7 +3502,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -134,7 +3515,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -147,7 +3528,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -160,7 +3541,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -173,7 +3554,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -186,7 +3567,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -199,7 +3580,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -212,7 +3593,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -225,7 +3606,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -238,7 +3619,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BOOK_SNAPSHOT
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -252,7 +3633,7 @@ spec:
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: LATEST
max_session_liveness_ms: 45000
- - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: BOOK_DELTA
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -267,167 +3648,124 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: TRADE
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 15000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: QUOTE
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 5000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: BAR
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 1m
- warmup_limit: 10000
- max_freshness_ms: 180000
- require_full_coverage: true
- require_final_bars: true
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: e653b192-ecf4-5325-88a8-a04551746c1a
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 540000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: e8d8b9ac-61c8-53d9-aa43-f8015e885f58
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 5m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 900000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: e8f4a1d8-7c75-5271-9f2c-cebed1e317c0
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 15m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 2700000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: ea7a81ea-5876-5db2-89f2-1af550f455ef
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 30m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 5400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: ea9eb608-383e-5b81-9669-6a4afbf2b530
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 10800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: eac1a50e-ee45-5720-9299-5aedf9727450
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 21600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: ebeef153-4f05-50b4-8152-fc22e2d2c5fe
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 4h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 43200000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: ed4319f7-8e4a-5570-a34d-88118cb1c276
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 6h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 64800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: edb2816d-e9d4-5547-bf3b-abb14dec58bb
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 12h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 129600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: eef06df7-cf51-5d7c-9642-e7a4309c225b
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -440,75 +3778,46 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: ef06e949-902e-5a7b-86fc-f4513675ca51
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 518400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: f0218fe0-e2bf-56b3-b9c0-de1182f1c5f8
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 777600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ - instrument_uid: f2d5dfed-750e-5fe4-adc2-b7e0a731eff7
feed: BAR
consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 1w
- warmup_limit: 10000
- max_freshness_ms: 1814400000
- require_full_coverage: true
- require_final_bars: true
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: BOOK_SNAPSHOT
- consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- max_session_liveness_ms: 45000
- - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
- feed: BOOK_DELTA
- consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 2000
+ source_policy_id: crypto_primary_v2
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: TRADE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -523,7 +3832,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: QUOTE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -538,7 +3847,7 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -551,7 +3860,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -564,7 +3873,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -577,7 +3886,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -590,7 +3899,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -603,7 +3912,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -616,7 +3925,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -629,7 +3938,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -642,7 +3951,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -655,7 +3964,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -668,7 +3977,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -681,7 +3990,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -694,7 +4003,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -707,7 +4016,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -720,7 +4029,7 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BOOK_SNAPSHOT
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -734,7 +4043,7 @@ spec:
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: LATEST
max_session_liveness_ms: 45000
- - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: BOOK_DELTA
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
@@ -749,284 +4058,251 @@ spec:
bar_revision_policy: LATEST
event_recency_policy: OBSERVE
max_session_liveness_ms: 45000
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: TRADE
+ - instrument_uid: f356265e-f401-5851-8157-ff8e294f34d2
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 15000
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: QUOTE
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: f5a63ee0-7db9-5696-b84e-ab0d4b06ce2a
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 5000
+ interval: 1d
+ warmup_limit: 10000
+ max_freshness_ms: 259200000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ bar_revision_policy: EMIT_REVISIONS
+ - instrument_uid: f6f6342f-5ea9-5491-be55-0d2cac840f88
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 180000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: f8054e3a-1f79-57fb-9b98-a21a24348e74
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 540000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: f869a1e1-e714-53d9-9dfe-828b42ae81c3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 5m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 900000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fab3bb0f-c0e5-58b6-94b9-7515d3fef752
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 15m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 2700000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: BAR
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: TRADE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 30m
- warmup_limit: 10000
- max_freshness_ms: 5400000
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 15000
require_full_coverage: true
- require_final_bars: true
+ require_final_bars: false
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: BAR
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: QUOTE
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1h
- warmup_limit: 10000
- max_freshness_ms: 10800000
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 5000
require_full_coverage: true
- require_final_bars: true
+ require_final_bars: false
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2h
+ interval: 1m
warmup_limit: 10000
- max_freshness_ms: 21600000
+ max_freshness_ms: 180000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 4h
+ interval: 3m
warmup_limit: 10000
- max_freshness_ms: 43200000
+ max_freshness_ms: 540000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 6h
+ interval: 5m
warmup_limit: 10000
- max_freshness_ms: 64800000
+ max_freshness_ms: 900000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 12h
+ interval: 15m
warmup_limit: 10000
- max_freshness_ms: 129600000
+ max_freshness_ms: 2700000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1d
+ interval: 30m
warmup_limit: 10000
- max_freshness_ms: 259200000
+ max_freshness_ms: 5400000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2d
+ interval: 1h
warmup_limit: 10000
- max_freshness_ms: 518400000
+ max_freshness_ms: 10800000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3d
+ interval: 2h
warmup_limit: 10000
- max_freshness_ms: 777600000
+ max_freshness_ms: 21600000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1w
+ interval: 4h
warmup_limit: 10000
- max_freshness_ms: 1814400000
+ max_freshness_ms: 43200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: BOOK_SNAPSHOT
- consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- max_session_liveness_ms: 45000
- - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
- feed: BOOK_DELTA
- consumer_grade: ALPHA
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 2000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: TRADE
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 15000
+ interval: 6h
+ warmup_limit: 10000
+ max_freshness_ms: 64800000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
+ bar_revision_policy: EMIT_REVISIONS
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: QUOTE
+ feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 5000
+ interval: 12h
+ warmup_limit: 10000
+ max_freshness_ms: 129600000
require_full_coverage: true
- require_final_bars: false
+ require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
+ bar_revision_policy: EMIT_REVISIONS
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1m
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 180000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
@@ -1037,9 +4313,9 @@ spec:
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3m
+ interval: 2d
warmup_limit: 10000
- max_freshness_ms: 540000
+ max_freshness_ms: 518400000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
@@ -1050,9 +4326,9 @@ spec:
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 5m
+ interval: 3d
warmup_limit: 10000
- max_freshness_ms: 900000
+ max_freshness_ms: 777600000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
@@ -1063,9 +4339,9 @@ spec:
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 15m
+ interval: 1w
warmup_limit: 10000
- max_freshness_ms: 2700000
+ max_freshness_ms: 1814400000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
@@ -1073,84 +4349,87 @@ spec:
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: BAR
- consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 30m
- warmup_limit: 10000
- max_freshness_ms: 5400000
+ feed: BOOK_SNAPSHOT
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 60000
require_full_coverage: true
- require_final_bars: true
+ require_final_bars: false
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
+ bar_revision_policy: LATEST
+ max_session_liveness_ms: 45000
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: BAR
+ feed: BOOK_DELTA
consumer_grade: ALPHA
- source_policy_id: crypto_primary_v2
- interval: 1h
- warmup_limit: 10000
- max_freshness_ms: 10800000
+ source_policy_id: crypto_liquid_v2
+ interval: null
+ warmup_limit: 0
+ max_freshness_ms: 2000
require_full_coverage: true
- require_final_bars: true
+ require_final_bars: false
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ bar_revision_policy: LATEST
+ event_recency_policy: OBSERVE
+ max_session_liveness_ms: 45000
+ - instrument_uid: fc7a72ab-a650-5172-993f-9d097b16dcac
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 21600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fc938060-7733-5efe-9050-68be8f156a9e
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 4h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 43200000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fcb15aad-f5e9-5245-9f5c-3aa66b4d6507
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 6h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 64800000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fd7ff987-a411-5139-9f6b-e70c7f03d6e4
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 12h
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 129600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fe05b11d-24ac-5fe8-8f49-f393e6a50748
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
@@ -1163,81 +4442,78 @@ spec:
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fe539963-7719-5e2b-85f8-213f889f2433
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 2d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 518400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fe9a679f-abf6-5670-9aa4-06c0c82e4af2
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 3d
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 777600000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ - instrument_uid: fefc51a7-8247-5790-bf82-6817bf12e7b3
feed: BAR
consumer_grade: ALPHA
source_policy_id: crypto_primary_v2
- interval: 1w
+ interval: 1d
warmup_limit: 10000
- max_freshness_ms: 1814400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: true
stale_policy: BLOCK
gap_policy: BLOCK
recovery: SNAPSHOT_AND_REPLAY
bar_revision_policy: EMIT_REVISIONS
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: BOOK_SNAPSHOT
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: CONTRACT_METADATA
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
interval: null
warmup_limit: 0
- max_freshness_ms: 60000
+ max_freshness_ms: 86400000
require_full_coverage: true
require_final_bars: false
stale_policy: BLOCK
gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
+ recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
- max_session_liveness_ms: 45000
- - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
- feed: BOOK_DELTA
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: FUNDING_RATE
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
interval: null
warmup_limit: 0
- max_freshness_ms: 2000
+ max_freshness_ms: 28800000
require_full_coverage: true
require_final_bars: false
stale_policy: BLOCK
gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
+ recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
- event_recency_policy: OBSERVE
- max_session_liveness_ms: 45000
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: CONTRACT_METADATA
+ feed: LONG_SHORT_RATIO
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
- interval: null
+ interval: 1d
warmup_limit: 0
- max_freshness_ms: 86400000
+ max_freshness_ms: 259200000
require_full_coverage: true
require_final_bars: false
stale_policy: BLOCK
@@ -1245,12 +4521,12 @@ spec:
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: FUNDING_RATE
+ feed: MARK_INDEX_PRICE
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
interval: null
warmup_limit: 0
- max_freshness_ms: 28800000
+ max_freshness_ms: 60000
require_full_coverage: true
require_final_bars: false
stale_policy: BLOCK
@@ -1258,12 +4534,12 @@ spec:
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
- instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
- feed: MARK_INDEX_PRICE
+ feed: OPEN_INTEREST
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
interval: null
warmup_limit: 0
- max_freshness_ms: 60000
+ max_freshness_ms: 86400000
require_full_coverage: true
require_final_bars: false
stale_policy: BLOCK
@@ -1274,7 +4550,7 @@ spec:
feed: OPEN_INTEREST
consumer_grade: ALPHA
source_policy_id: crypto_liquid_v2
- interval: null
+ interval: 1d
warmup_limit: 0
max_freshness_ms: 86400000
require_full_coverage: true
@@ -1283,6 +4559,19 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: TAKER_FLOW
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: CONTRACT_METADATA
consumer_grade: ALPHA
@@ -1309,6 +4598,19 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: LONG_SHORT_RATIO
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
feed: MARK_INDEX_PRICE
consumer_grade: ALPHA
@@ -1335,6 +4637,32 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: OPEN_INTEREST
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: TAKER_FLOW
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: CONTRACT_METADATA
consumer_grade: ALPHA
@@ -1361,6 +4689,19 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: LONG_SHORT_RATIO
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
feed: MARK_INDEX_PRICE
consumer_grade: ALPHA
@@ -1387,6 +4728,32 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: OPEN_INTEREST
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: TAKER_FLOW
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: CONTRACT_METADATA
consumer_grade: ALPHA
@@ -1413,6 +4780,19 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: LONG_SHORT_RATIO
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: MARK_INDEX_PRICE
consumer_grade: ALPHA
@@ -1439,6 +4819,32 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: OPEN_INTEREST
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: TAKER_FLOW
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: CONTRACT_METADATA
consumer_grade: ALPHA
@@ -1465,6 +4871,19 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: LONG_SHORT_RATIO
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
- instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
feed: MARK_INDEX_PRICE
consumer_grade: ALPHA
@@ -1491,3 +4910,29 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: OPEN_INTEREST
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: TAKER_FLOW
+ consumer_grade: ALPHA
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
diff --git a/consumers/stable/reference-l2-stable.yaml b/consumers/stable/reference-l2-stable.yaml
index e40b9c93..1932a647 100644
--- a/consumers/stable/reference-l2-stable.yaml
+++ b/consumers/stable/reference-l2-stable.yaml
@@ -5,7 +5,7 @@ metadata:
owner: data-platform
subject: spiffe://qdl/paper/reference-l2-stable
environment: paper
- revision: 4
+ revision: 6
spec:
sdk_major: 2
rollback_contract: V2
@@ -188,8 +188,6 @@ spec:
source_policy_id: crypto_liquid_v2
interval: null
warmup_limit: 0
- # Binance settles every 8h but may publish the settled record after the
- # boundary; retain a bounded 1h provider-publication grace.
max_freshness_ms: 32400000
require_full_coverage: true
require_final_bars: false
@@ -249,32 +247,6 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
- - instrument_uid: 9e24d8dd-e74b-5f9b-a770-2556bbc89d37
- feed: BOOK_DELTA
- consumer_grade: RESEARCH
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- - instrument_uid: 9e24d8dd-e74b-5f9b-a770-2556bbc89d37
- feed: BOOK_SNAPSHOT
- consumer_grade: RESEARCH
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- instrument_uid: a1bf2602-781a-56be-9922-52d1fbf327e5
feed: BOOK_DELTA
consumer_grade: RESEARCH
@@ -899,32 +871,6 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
- - instrument_uid: f1228887-3053-5b61-9aea-11d3833f8a62
- feed: BOOK_DELTA
- consumer_grade: RESEARCH
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- - instrument_uid: f1228887-3053-5b61-9aea-11d3833f8a62
- feed: BOOK_SNAPSHOT
- consumer_grade: RESEARCH
- source_policy_id: crypto_liquid_v2
- interval: null
- warmup_limit: 0
- max_freshness_ms: 60000
- require_full_coverage: true
- require_final_bars: false
- stale_policy: BLOCK
- gap_policy: BLOCK
- recovery: SNAPSHOT_AND_REPLAY
- bar_revision_policy: LATEST
- instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
feed: CONTRACT_METADATA
consumer_grade: RESEARCH
@@ -1055,3 +1001,198 @@ spec:
gap_policy: BLOCK
recovery: FRESH_SNAPSHOT
bar_revision_policy: LATEST
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: OPEN_INTEREST
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: OPEN_INTEREST
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: OPEN_INTEREST
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: OPEN_INTEREST
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: OPEN_INTEREST
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 86400000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: LONG_SHORT_RATIO
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: LONG_SHORT_RATIO
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: LONG_SHORT_RATIO
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: LONG_SHORT_RATIO
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: LONG_SHORT_RATIO
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3
+ feed: TAKER_FLOW
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: fb26214c-7b9b-5961-95b2-55154755af0f
+ feed: TAKER_FLOW
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: 6c7c9256-2905-5c75-a149-fa0ac36bbbc7
+ feed: TAKER_FLOW
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: e49b54ae-c23d-5351-9e64-47934aac28f8
+ feed: TAKER_FLOW
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
+ - instrument_uid: a6884fb3-1fa0-53e0-9621-d01ba5f9a2de
+ feed: TAKER_FLOW
+ consumer_grade: RESEARCH
+ source_policy_id: crypto_liquid_v2
+ interval: 1d
+ warmup_limit: 0
+ max_freshness_ms: 259200000
+ require_full_coverage: true
+ require_final_bars: false
+ stale_policy: BLOCK
+ gap_policy: BLOCK
+ recovery: FRESH_SNAPSHOT
+ bar_revision_policy: LATEST
diff --git a/contracts/buf.gen.yaml b/contracts/buf.gen.yaml
index 5eb74eca..4ceb3f07 100644
--- a/contracts/buf.gen.yaml
+++ b/contracts/buf.gen.yaml
@@ -7,6 +7,10 @@ plugins:
- remote: buf.build/community/neoeinstein-prost:v0.5.0
revision: 1
out: ../generated/rust
+ - remote: buf.build/community/neoeinstein-tonic:v0.4.1
+ revision: 1
+ out: ../generated/rust
+ opt:
+ - no_include
inputs:
- directory: proto
-
diff --git a/contracts/golden/kn_v220/cursor_v3.json b/contracts/golden/kn_v220/cursor_v3.json
new file mode 100644
index 00000000..acb1afb8
--- /dev/null
+++ b/contracts/golden/kn_v220/cursor_v3.json
@@ -0,0 +1,708 @@
+{
+ "active_key_id": "kn1-test-k2",
+ "canonical": {
+ "body": "{\"catalog_revision\":9,\"consumer_id\":\"alpha.okx.paper.stable\",\"environment\":\"paper\",\"expires_at_ns\":1790182800123456789,\"issued_at_ns\":1790179200123456789,\"key_id\":\"kn1-test-k2\",\"partition_plan_epoch\":1,\"product_key\":\"lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-\",\"requirement_digest\":\"3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81\",\"route_generation\":\"kn-v220-r1\",\"schema\":\"qdl.handoff-cursor.v3\",\"schema_major\":2,\"snapshot_id\":\"3f1c9a0d5b7e2f4a8c6d1e0b9a7f5c3e1d2b4a6c8e0f1a3b5c7d9e1f2a4b6c8d\",\"source_offset\":9223372036854775806,\"source_partition\":3,\"source_policy_revision\":1,\"source_topic_id\":\"ljfjPYApRpWQd79McfTtZg\",\"stream\":\"md.canonical.v2\"}",
+ "claims": {
+ "catalog_revision": 9,
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expires_at_ns": 1790182800123456789,
+ "issued_at_ns": 1790179200123456789,
+ "key_id": "kn1-test-k2",
+ "partition_plan_epoch": 1,
+ "product_key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "snapshot_id": "3f1c9a0d5b7e2f4a8c6d1e0b9a7f5c3e1d2b4a6c8e0f1a3b5c7d9e1f2a4b6c8d",
+ "source_offset": 9223372036854775806,
+ "source_partition": 3,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ "cases": [
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "valid_u64_ns_precision",
+ "now_ns": 1790179500000000000,
+ "outcome": "OK",
+ "reason": null,
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "valid_rotated_verification_key",
+ "now_ns": 1790179500000000000,
+ "outcome": "OK",
+ "reason": null,
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMSIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.1wqaKihOd74726Sw0PO7Xy7kwDt8wkA6AspEiRpoC9o"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "tamper_body_resigned_not",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "SIGNATURE",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjEsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.binance.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "wrong_consumer",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "CONSUMER",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "live",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "wrong_environment",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "ENVIRONMENT",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "cross_venue_requirement",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "REQUIREMENT",
+ "requirement_digest": "0d1ec3040b5f976413dacb2b293bc825a30196251ef917fd05756d7a86ff01b8",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "mismatch_source_policy_revision",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "SOURCE_POLICY",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjIsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.ATv8mbwS675h3x51dWwBCI_Hs12-lYPiaJ9cnZn2g_w"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "mismatch_catalog_revision",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "CATALOG",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjoxMCwiY29uc3VtZXJfaWQiOiJhbHBoYS5va3gucGFwZXIuc3RhYmxlIiwiZW52aXJvbm1lbnQiOiJwYXBlciIsImV4cGlyZXNfYXRfbnMiOjE3OTAxODI4MDAxMjM0NTY3ODksImlzc3VlZF9hdF9ucyI6MTc5MDE3OTIwMDEyMzQ1Njc4OSwia2V5X2lkIjoia24xLXRlc3QtazIiLCJwYXJ0aXRpb25fcGxhbl9lcG9jaCI6MSwicHJvZHVjdF9rZXkiOiJscGsxfHBhcGVyfE9LWHxTV0FQfGZiMjYyMTRjLTdiOWItNTk2MS05NWIyLTU1MTU0NzU1YWYwZnxUUkFERXwtIiwicmVxdWlyZW1lbnRfZGlnZXN0IjoiMzcyMGViOTcyNDU1MWVhM2MyZWFlNzVmZDk1MWVjMmU4YzhhN2NlZGIwZmZiZDBjYTkwYmFlNDNiNjRhY2Y4MSIsInJvdXRlX2dlbmVyYXRpb24iOiJrbi12MjIwLXIxIiwic2NoZW1hIjoicWRsLmhhbmRvZmYtY3Vyc29yLnYzIiwic2NoZW1hX21ham9yIjoyLCJzbmFwc2hvdF9pZCI6IjNmMWM5YTBkNWI3ZTJmNGE4YzZkMWUwYjlhN2Y1YzNlMWQyYjRhNmM4ZTBmMWEzYjVjN2Q5ZTFmMmE0YjZjOGQiLCJzb3VyY2Vfb2Zmc2V0Ijo5MjIzMzcyMDM2ODU0Nzc1ODA2LCJzb3VyY2VfcGFydGl0aW9uIjozLCJzb3VyY2VfcG9saWN5X3JldmlzaW9uIjoxLCJzb3VyY2VfdG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIiwic3RyZWFtIjoibWQuY2Fub25pY2FsLnYyIn0.eIhWshG8W1EQCsvgX68gEXDwtqIgL6DkkMNhrZiRrGw"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "mismatch_schema_major",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "SCHEMA_MAJOR",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjMsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.LoVZQheRPl9trM9qtmZD3K8qvu_53R5dzSh1_Ew8kDU"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "mismatch_source_topic_id",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "TOPIC_GENERATION",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6Ik5FV1RPUElDSUR4eHh4eHh4eHh4eHgiLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.aYvQxJLO4jq1jyk-VwItTPuk1pY15qVLwaR10xztKHw"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "mismatch_partition_plan_epoch",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "PARTITION_PLAN",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoyLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.8EA1c_9gbJDqRk_RCcV3p6nHB9oKnRiKaaBPAnLLoXE"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "mismatch_route_generation",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "ROUTE_GENERATION",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjIiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.CsqThBt1P8kIFMFpkf1JFePJh886S4gmEFyaEfstNes"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "expired_at_boundary",
+ "now_ns": 1790182800123456789,
+ "outcome": "EXPIRED",
+ "reason": "EXPIRED",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "legacy_v2_spool_token",
+ "now_ns": 1790179500000000000,
+ "outcome": "EXPIRED",
+ "reason": "LEGACY_SCHEMA",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJleHBpcmVzX2F0X25zIjo0NjExNjg2MDE4NDI3Mzg3OTA0LCJnZW5lcmF0aW9uX2lkIjoiMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWYiLCJpc3N1ZWRfYXRfbnMiOjEsImtleV9pZCI6InN0YWJsZS1rMSIsInBhcnRpdGlvbl9rZXkiOiJmYjI2MjE0Yy03YjliLTU5NjEtOTViMi01NTE1NDc1NWFmMGYvdHJhZGUvb2t4LXN3YXAiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjIiLCJzbmFwc2hvdF9pZCI6InMiLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIiLCJ3YXRlcm1hcmtfb2Zmc2V0Ijo0Mn0.x7EI4Tfg1N6Cdsk1Ja8M7j2aDl_HYIVlT_SX8nBtBfA"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "unknown_key",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "UNKNOWN_KEY",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rOSIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.n9p-uBYoJ4mwjZb4qqgV8esPQX5UmaFkPN1SGBVYX8Q"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "non_canonical_whitespace",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "NON_CANONICAL",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCAiY29uc3VtZXJfaWQiOiJhbHBoYS5va3gucGFwZXIuc3RhYmxlIiwiZW52aXJvbm1lbnQiOiJwYXBlciIsImV4cGlyZXNfYXRfbnMiOjE3OTAxODI4MDAxMjM0NTY3ODksImlzc3VlZF9hdF9ucyI6MTc5MDE3OTIwMDEyMzQ1Njc4OSwia2V5X2lkIjoia24xLXRlc3QtazIiLCJwYXJ0aXRpb25fcGxhbl9lcG9jaCI6MSwicHJvZHVjdF9rZXkiOiJscGsxfHBhcGVyfE9LWHxTV0FQfGZiMjYyMTRjLTdiOWItNTk2MS05NWIyLTU1MTU0NzU1YWYwZnxUUkFERXwtIiwicmVxdWlyZW1lbnRfZGlnZXN0IjoiMzcyMGViOTcyNDU1MWVhM2MyZWFlNzVmZDk1MWVjMmU4YzhhN2NlZGIwZmZiZDBjYTkwYmFlNDNiNjRhY2Y4MSIsInJvdXRlX2dlbmVyYXRpb24iOiJrbi12MjIwLXIxIiwic2NoZW1hIjoicWRsLmhhbmRvZmYtY3Vyc29yLnYzIiwic2NoZW1hX21ham9yIjoyLCJzbmFwc2hvdF9pZCI6IjNmMWM5YTBkNWI3ZTJmNGE4YzZkMWUwYjlhN2Y1YzNlMWQyYjRhNmM4ZTBmMWEzYjVjN2Q5ZTFmMmE0YjZjOGQiLCJzb3VyY2Vfb2Zmc2V0Ijo5MjIzMzcyMDM2ODU0Nzc1ODA2LCJzb3VyY2VfcGFydGl0aW9uIjozLCJzb3VyY2VfcG9saWN5X3JldmlzaW9uIjoxLCJzb3VyY2VfdG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIiwic3RyZWFtIjoibWQuY2Fub25pY2FsLnYyIn0.TICLz9XsBoKVrMH5tQ1-HLz6osUZN0-MZ7MeOltOVLw"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "float_number",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "FIELD_RANGE",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LjAsImNvbnN1bWVyX2lkIjoiYWxwaGEub2t4LnBhcGVyLnN0YWJsZSIsImVudmlyb25tZW50IjoicGFwZXIiLCJleHBpcmVzX2F0X25zIjoxNzkwMTgyODAwMTIzNDU2Nzg5LCJpc3N1ZWRfYXRfbnMiOjE3OTAxNzkyMDAxMjM0NTY3ODksImtleV9pZCI6ImtuMS10ZXN0LWsyIiwicGFydGl0aW9uX3BsYW5fZXBvY2giOjEsInByb2R1Y3Rfa2V5IjoibHBrMXxwYXBlcnxPS1h8U1dBUHxmYjI2MjE0Yy03YjliLTU5NjEtOTViMi01NTE1NDc1NWFmMGZ8VFJBREV8LSIsInJlcXVpcmVtZW50X2RpZ2VzdCI6IjM3MjBlYjk3MjQ1NTFlYTNjMmVhZTc1ZmQ5NTFlYzJlOGM4YTdjZWRiMGZmYmQwY2E5MGJhZTQzYjY0YWNmODEiLCJyb3V0ZV9nZW5lcmF0aW9uIjoia24tdjIyMC1yMSIsInNjaGVtYSI6InFkbC5oYW5kb2ZmLWN1cnNvci52MyIsInNjaGVtYV9tYWpvciI6Miwic25hcHNob3RfaWQiOiIzZjFjOWEwZDViN2UyZjRhOGM2ZDFlMGI5YTdmNWMzZTFkMmI0YTZjOGUwZjFhM2I1YzdkOWUxZjJhNGI2YzhkIiwic291cmNlX29mZnNldCI6OTIyMzM3MjAzNjg1NDc3NTgwNiwic291cmNlX3BhcnRpdGlvbiI6Mywic291cmNlX3BvbGljeV9yZXZpc2lvbiI6MSwic291cmNlX3RvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyIsInN0cmVhbSI6Im1kLmNhbm9uaWNhbC52MiJ9.gHOT4jjzAPP98IjOGC-YhCreYVkeLDtCBk0MLBusCb8"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "extra_field",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "FIELDS",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIiLCJ6ZXh0cmEiOiJ4In0.PoMXggEPZioS8S69rYQtacm-apb8X0XM2M7TFHp8iYM"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "charset_space",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "FIELD_CHARSET",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuIHYyMjAiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.f8-yMYcCGjTD1N7ULL7SxKQBnuARAsbrdIQe-eSmTc0"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "bad_encoding",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "ENCODING",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "not-a-token"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "nan_constant",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "ENCODING",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjpOYU4sImNvbnN1bWVyX2lkIjoiYWxwaGEub2t4LnBhcGVyLnN0YWJsZSIsImVudmlyb25tZW50IjoicGFwZXIiLCJleHBpcmVzX2F0X25zIjoxNzkwMTgyODAwMTIzNDU2Nzg5LCJpc3N1ZWRfYXRfbnMiOjE3OTAxNzkyMDAxMjM0NTY3ODksImtleV9pZCI6ImtuMS10ZXN0LWsyIiwicGFydGl0aW9uX3BsYW5fZXBvY2giOjEsInByb2R1Y3Rfa2V5IjoibHBrMXxwYXBlcnxPS1h8U1dBUHxmYjI2MjE0Yy03YjliLTU5NjEtOTViMi01NTE1NDc1NWFmMGZ8VFJBREV8LSIsInJlcXVpcmVtZW50X2RpZ2VzdCI6IjM3MjBlYjk3MjQ1NTFlYTNjMmVhZTc1ZmQ5NTFlYzJlOGM4YTdjZWRiMGZmYmQwY2E5MGJhZTQzYjY0YWNmODEiLCJyb3V0ZV9nZW5lcmF0aW9uIjoia24tdjIyMC1yMSIsInNjaGVtYSI6InFkbC5oYW5kb2ZmLWN1cnNvci52MyIsInNjaGVtYV9tYWpvciI6Miwic25hcHNob3RfaWQiOiIzZjFjOWEwZDViN2UyZjRhOGM2ZDFlMGI5YTdmNWMzZTFkMmI0YTZjOGUwZjFhM2I1YzdkOWUxZjJhNGI2YzhkIiwic291cmNlX29mZnNldCI6OTIyMzM3MjAzNjg1NDc3NTgwNiwic291cmNlX3BhcnRpdGlvbiI6Mywic291cmNlX3BvbGljeV9yZXZpc2lvbiI6MSwic291cmNlX3RvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyIsInN0cmVhbSI6Im1kLmNhbm9uaWNhbC52MiJ9.xwmz9ZZEf7flt9MSdlG9aH-ZIG9vIx5ajm0uL5LlFnI"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "bad_base64_length",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "ENCODING",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQA.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQQ"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "duplicate_key",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "NON_CANONICAL",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIiLCJjYXRhbG9nX3JldmlzaW9uIjo5fQ.dGvwsO-WIaR1XvOYpH5OFAY7CXzztE0zYnliVZk0Bms"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "non_canonical_base64_trailing_bits",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "ENCODING",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjMiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.caLT-xdbyBPbFObHZMmEYnWkup_fKtluUpeFWTvhVQR"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "unknown_schema",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "SCHEMA",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOiJxZGwuaGFuZG9mZi1jdXJzb3IudjkiLCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.-k_yiAEkd_PrBxyiQacehRROB_nzgNIPIR1X0aqg0-Q"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "schema_array",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "SCHEMA",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOlsicWRsLmhhbmRvZmYtY3Vyc29yLnYyIl0sInNjaGVtYV9tYWpvciI6Miwic25hcHNob3RfaWQiOiIzZjFjOWEwZDViN2UyZjRhOGM2ZDFlMGI5YTdmNWMzZTFkMmI0YTZjOGUwZjFhM2I1YzdkOWUxZjJhNGI2YzhkIiwic291cmNlX29mZnNldCI6OTIyMzM3MjAzNjg1NDc3NTgwNiwic291cmNlX3BhcnRpdGlvbiI6Mywic291cmNlX3BvbGljeV9yZXZpc2lvbiI6MSwic291cmNlX3RvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyIsInN0cmVhbSI6Im1kLmNhbm9uaWNhbC52MiJ9.9iU9aR0oq8I3XrxUGmok6ZLxduWnU5IFUF9j0vnDJOY"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "schema_object",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "SCHEMA",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxIiwicm91dGVfZ2VuZXJhdGlvbiI6ImtuLXYyMjAtcjEiLCJzY2hlbWEiOnsidiI6InFkbC5oYW5kb2ZmLWN1cnNvci52MiJ9LCJzY2hlbWFfbWFqb3IiOjIsInNuYXBzaG90X2lkIjoiM2YxYzlhMGQ1YjdlMmY0YThjNmQxZTBiOWE3ZjVjM2UxZDJiNGE2YzhlMGYxYTNiNWM3ZDllMWYyYTRiNmM4ZCIsInNvdXJjZV9vZmZzZXQiOjkyMjMzNzIwMzY4NTQ3NzU4MDYsInNvdXJjZV9wYXJ0aXRpb24iOjMsInNvdXJjZV9wb2xpY3lfcmV2aXNpb24iOjEsInNvdXJjZV90b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmciLCJzdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifQ.bx8ifSOBElEi_zv8bg9GzvXYcl4yeJAJQHSeZ7QT9VE"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable\n",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "consumer_trailing_newline",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "FIELD_CHARSET",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGVcbiIsImVudmlyb25tZW50IjoicGFwZXIiLCJleHBpcmVzX2F0X25zIjoxNzkwMTgyODAwMTIzNDU2Nzg5LCJpc3N1ZWRfYXRfbnMiOjE3OTAxNzkyMDAxMjM0NTY3ODksImtleV9pZCI6ImtuMS10ZXN0LWsyIiwicGFydGl0aW9uX3BsYW5fZXBvY2giOjEsInByb2R1Y3Rfa2V5IjoibHBrMXxwYXBlcnxPS1h8U1dBUHxmYjI2MjE0Yy03YjliLTU5NjEtOTViMi01NTE1NDc1NWFmMGZ8VFJBREV8LSIsInJlcXVpcmVtZW50X2RpZ2VzdCI6IjM3MjBlYjk3MjQ1NTFlYTNjMmVhZTc1ZmQ5NTFlYzJlOGM4YTdjZWRiMGZmYmQwY2E5MGJhZTQzYjY0YWNmODEiLCJyb3V0ZV9nZW5lcmF0aW9uIjoia24tdjIyMC1yMSIsInNjaGVtYSI6InFkbC5oYW5kb2ZmLWN1cnNvci52MyIsInNjaGVtYV9tYWpvciI6Miwic25hcHNob3RfaWQiOiIzZjFjOWEwZDViN2UyZjRhOGM2ZDFlMGI5YTdmNWMzZTFkMmI0YTZjOGUwZjFhM2I1YzdkOWUxZjJhNGI2YzhkIiwic291cmNlX29mZnNldCI6OTIyMzM3MjAzNjg1NDc3NTgwNiwic291cmNlX3BhcnRpdGlvbiI6Mywic291cmNlX3BvbGljeV9yZXZpc2lvbiI6MSwic291cmNlX3RvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyIsInN0cmVhbSI6Im1kLmNhbm9uaWNhbC52MiJ9.tbY7A2c5RtOZxy4a4N6N5GpV7WsYS9xtuOpW4NmW4as"
+ },
+ {
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expectation": {
+ "catalog_revision": 9,
+ "environment": "paper",
+ "partition_plan_epoch": 1,
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "digest_trailing_newline",
+ "now_ns": 1790179500000000000,
+ "outcome": "INVALID",
+ "reason": "FIELD_CHARSET",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81\n",
+ "token": "eyJjYXRhbG9nX3JldmlzaW9uIjo5LCJjb25zdW1lcl9pZCI6ImFscGhhLm9reC5wYXBlci5zdGFibGUiLCJlbnZpcm9ubWVudCI6InBhcGVyIiwiZXhwaXJlc19hdF9ucyI6MTc5MDE4MjgwMDEyMzQ1Njc4OSwiaXNzdWVkX2F0X25zIjoxNzkwMTc5MjAwMTIzNDU2Nzg5LCJrZXlfaWQiOiJrbjEtdGVzdC1rMiIsInBhcnRpdGlvbl9wbGFuX2Vwb2NoIjoxLCJwcm9kdWN0X2tleSI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8ZmIyNjIxNGMtN2I5Yi01OTYxLTk1YjItNTUxNTQ3NTVhZjBmfFRSQURFfC0iLCJyZXF1aXJlbWVudF9kaWdlc3QiOiIzNzIwZWI5NzI0NTUxZWEzYzJlYWU3NWZkOTUxZWMyZThjOGE3Y2VkYjBmZmJkMGNhOTBiYWU0M2I2NGFjZjgxXG4iLCJyb3V0ZV9nZW5lcmF0aW9uIjoia24tdjIyMC1yMSIsInNjaGVtYSI6InFkbC5oYW5kb2ZmLWN1cnNvci52MyIsInNjaGVtYV9tYWpvciI6Miwic25hcHNob3RfaWQiOiIzZjFjOWEwZDViN2UyZjRhOGM2ZDFlMGI5YTdmNWMzZTFkMmI0YTZjOGUwZjFhM2I1YzdkOWUxZjJhNGI2YzhkIiwic291cmNlX29mZnNldCI6OTIyMzM3MjAzNjg1NDc3NTgwNiwic291cmNlX3BhcnRpdGlvbiI6Mywic291cmNlX3BvbGljeV9yZXZpc2lvbiI6MSwic291cmNlX3RvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyIsInN0cmVhbSI6Im1kLmNhbm9uaWNhbC52MiJ9.5lSlGrXxv0Z08DfELwXOCmD7tGDXxZ54iCdAu2rRbBI"
+ }
+ ],
+ "claims_invalid": [
+ {
+ "claims": {
+ "catalog_revision": 9,
+ "consumer_id": "alpha.okx.paper.stable\n",
+ "environment": "paper",
+ "expires_at_ns": 1790182800123456789,
+ "issued_at_ns": 1790179200123456789,
+ "key_id": "kn1-test-k2",
+ "partition_plan_epoch": 1,
+ "product_key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "snapshot_id": "3f1c9a0d5b7e2f4a8c6d1e0b9a7f5c3e1d2b4a6c8e0f1a3b5c7d9e1f2a4b6c8d",
+ "source_offset": 9223372036854775806,
+ "source_partition": 3,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "consumer_trailing_newline",
+ "reason": "FIELD_CHARSET"
+ },
+ {
+ "claims": {
+ "catalog_revision": 9,
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expires_at_ns": 1790182800123456789,
+ "issued_at_ns": 1790179200123456789,
+ "key_id": "kn1-test-k2",
+ "partition_plan_epoch": 1,
+ "product_key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81\n",
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "snapshot_id": "3f1c9a0d5b7e2f4a8c6d1e0b9a7f5c3e1d2b4a6c8e0f1a3b5c7d9e1f2a4b6c8d",
+ "source_offset": 9223372036854775806,
+ "source_partition": 3,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "digest_trailing_newline",
+ "reason": "FIELD_CHARSET"
+ },
+ {
+ "claims": {
+ "catalog_revision": 9,
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expires_at_ns": 1790182800123456789,
+ "issued_at_ns": 1790179200123456789,
+ "key_id": "kn1-test-k2",
+ "partition_plan_epoch": 1,
+ "product_key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-\n",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "snapshot_id": "3f1c9a0d5b7e2f4a8c6d1e0b9a7f5c3e1d2b4a6c8e0f1a3b5c7d9e1f2a4b6c8d",
+ "source_offset": 9223372036854775806,
+ "source_partition": 3,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "product_key_trailing_newline",
+ "reason": "FIELD_CHARSET"
+ },
+ {
+ "claims": {
+ "catalog_revision": 9,
+ "consumer_id": "alpha.okx.paper.stable",
+ "environment": "paper",
+ "expires_at_ns": 1790182800123456789,
+ "issued_at_ns": 1790179200123456789,
+ "key_id": "kn1-test-k2",
+ "partition_plan_epoch": 1,
+ "product_key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-",
+ "requirement_digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "route_generation": "kn-v220-r1",
+ "schema_major": 2,
+ "snapshot_id": "3f1c9a0d5b7e2f4a8c6d1e0b9a7f5c3e1d2b4a6c8e0f1a3b5c7d9e1f2a4b6c8d",
+ "source_offset": true,
+ "source_partition": 3,
+ "source_policy_revision": 1,
+ "source_topic_id": "ljfjPYApRpWQd79McfTtZg",
+ "stream": "md.canonical.v2"
+ },
+ "name": "bool_offset",
+ "reason": "FIELD_RANGE"
+ }
+ ],
+ "keys": {
+ "kn1-test-k1": "kn1-golden-TEST-ONLY-rotated-key-00002",
+ "kn1-test-k2": "kn1-golden-TEST-ONLY-key-not-prod-0001"
+ },
+ "provenance": "TEST-ONLY keys; never production secrets. Hand-specified outcomes, bytes produced by qdl/replay/cursor_v3.py.",
+ "schema": "qdl.kn.v220.golden.cursor-v3.v1"
+}
diff --git a/contracts/golden/kn_v220/delivery_policy.json b/contracts/golden/kn_v220/delivery_policy.json
new file mode 100644
index 00000000..adc4d5c6
--- /dev/null
+++ b/contracts/golden/kn_v220/delivery_policy.json
@@ -0,0 +1,92 @@
+{
+ "cases": [
+ {
+ "bar_lifecycle": null,
+ "feed": "TRADE",
+ "policy": "LOSSLESS"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "QUOTE",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": "UNSPECIFIED",
+ "feed": "BAR",
+ "policy": "ERROR"
+ },
+ {
+ "bar_lifecycle": "IN_PROGRESS",
+ "feed": "BAR",
+ "policy": "LIFECYCLE_COALESCE"
+ },
+ {
+ "bar_lifecycle": "FINAL",
+ "feed": "BAR",
+ "policy": "LOSSLESS"
+ },
+ {
+ "bar_lifecycle": "REVISED",
+ "feed": "BAR",
+ "policy": "LOSSLESS"
+ },
+ {
+ "bar_lifecycle": "CANCELLED",
+ "feed": "BAR",
+ "policy": "LOSSLESS"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "BOOK_SNAPSHOT",
+ "policy": "LOSSLESS"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "BOOK_DELTA",
+ "policy": "LOSSLESS"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "FUNDING_RATE",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "OPEN_INTEREST",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "MARK_INDEX_PRICE",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "TICKER",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "LONG_SHORT_RATIO",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "TAKER_FLOW",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "BASIS",
+ "policy": "LATEST_STATE"
+ },
+ {
+ "bar_lifecycle": null,
+ "feed": "CONTRACT_METADATA",
+ "policy": "LATEST_STATE"
+ }
+ ],
+ "note": "ERROR = the domain refuses a BAR without an explicit lifecycle; the stream treats it as LOSSLESS (fail-safe)",
+ "schema": "qdl.kn.v220.golden.delivery-policy.v1",
+ "source": "qdl.ingestion.contracts.delivery_policy; query feed -> domain feed: {\"TRADE\": \"trade\", \"QUOTE\": \"bbo\", \"BAR\": \"bar\", \"BOOK_SNAPSHOT\": \"book\", \"BOOK_DELTA\": \"book\"}, any other public feed -> not lossless (LATEST_STATE)"
+}
diff --git a/contracts/golden/kn_v220/requirement_digest.json b/contracts/golden/kn_v220/requirement_digest.json
new file mode 100644
index 00000000..81782e27
--- /dev/null
+++ b/contracts/golden/kn_v220/requirement_digest.json
@@ -0,0 +1,112 @@
+{
+ "note": "warmup horizon is excluded: warm500 and warm5000 share a digest; stale_policy changes it.",
+ "schema": "qdl.kn.v220.golden.requirement-digest.v1",
+ "vectors": [
+ {
+ "digest": "0d1ec3040b5f976413dacb2b293bc825a30196251ef917fd05756d7a86ff01b8",
+ "name": "binance_usdm_btc_trade",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65",
+ "max_freshness_ms": 2000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK"
+ }
+ },
+ {
+ "digest": "3720eb9724551ea3c2eae75fd951ec2e8c8a7cedb0ffbd0ca90bae43b64acf81",
+ "name": "okx_swap_btc_trade",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "max_freshness_ms": 2000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK"
+ }
+ },
+ {
+ "digest": "474734cab1ed81b2794f2cddd97e98d30094e6e2c5f81806f442552aaa870084",
+ "name": "okx_swap_btc_bar_1m_warm500",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup_limit": 500
+ }
+ },
+ {
+ "digest": "474734cab1ed81b2794f2cddd97e98d30094e6e2c5f81806f442552aaa870084",
+ "name": "okx_swap_btc_bar_1m_warm5000",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup_limit": 5000
+ }
+ },
+ {
+ "digest": "a3cce35e7599ebcfafad50c6bae4308f04507af51ca05e3344dc59dcb5d2a835",
+ "name": "binance_usdm_btc_mark_execution",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "MARK_INDEX_PRICE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65",
+ "max_freshness_ms": 3000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "FRESH_SNAPSHOT",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK"
+ }
+ },
+ {
+ "digest": "929d160b8adf3d0caaf3cb504f4558a6847f6b769553092309acd72963f56834",
+ "name": "binance_usdm_btc_trade_observe",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65",
+ "max_freshness_ms": 2000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "OBSERVE"
+ }
+ }
+ ]
+}
diff --git a/contracts/golden/kn_v220/requirement_validation.json b/contracts/golden/kn_v220/requirement_validation.json
new file mode 100644
index 00000000..1e952495
--- /dev/null
+++ b/contracts/golden/kn_v220/requirement_validation.json
@@ -0,0 +1,2027 @@
+{
+ "cases": [
+ {
+ "name": "valid_alpha_trade_observe",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "valid_bar_rows_warmup",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 500
+ },
+ "rule": null
+ },
+ {
+ "name": "valid_bar_time_range",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 60000000001,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 1
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "valid_open_interest_without_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "OPEN_INTEREST",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "valid_execution_trade",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "valid_warmup_cache_age_zero",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 0,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "feed_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "UNSPECIFIED",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "FEED_UNSPECIFIED"
+ },
+ {
+ "name": "grade_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "UNSPECIFIED",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "GRADE_UNSPECIFIED"
+ },
+ {
+ "name": "stale_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "UNSPECIFIED",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "STALE_UNSPECIFIED"
+ },
+ {
+ "name": "gap_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "UNSPECIFIED",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "GAP_UNSPECIFIED"
+ },
+ {
+ "name": "recovery_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "UNSPECIFIED",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "RECOVERY_UNSPECIFIED"
+ },
+ {
+ "name": "revision_unspecified",
+ "requirement": {
+ "bar_revision_policy": "UNSPECIFIED",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "REVISION_UNSPECIFIED"
+ },
+ {
+ "name": "feed_checked_before_stale",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "UNSPECIFIED",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "UNSPECIFIED",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "FEED_UNSPECIFIED"
+ },
+ {
+ "name": "warmup_without_horizon",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "none",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_HORIZON"
+ },
+ {
+ "name": "warmup_interval_source_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "UNSPECIFIED",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_INTERVAL_SOURCE"
+ },
+ {
+ "name": "warmup_rows_zero",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 0,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_ROWS_RANGE"
+ },
+ {
+ "name": "warmup_rows_over_range",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 100001,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_ROWS_RANGE"
+ },
+ {
+ "name": "warmup_time_range_not_increasing",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 5,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 5
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_TIME_RANGE"
+ },
+ {
+ "name": "warmup_time_range_start_zero",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 5,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_TIME_RANGE"
+ },
+ {
+ "name": "warmup_cache_age_over",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 86400001,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_CACHE_AGE"
+ },
+ {
+ "name": "warmup_deadline_zero",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 0,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_DEADLINE"
+ },
+ {
+ "name": "warmup_deadline_over",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 120001,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_DEADLINE"
+ },
+ {
+ "name": "instrument_uid_blank",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": " ",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "INSTRUMENT_UID"
+ },
+ {
+ "name": "source_policy_blank",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "SOURCE_POLICY_ID"
+ },
+ {
+ "name": "warmup_limit_over",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 10001
+ },
+ "rule": "WARMUP_LIMIT"
+ },
+ {
+ "name": "warmup_rows_public_cap",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 10001,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_ROWS_PUBLIC"
+ },
+ {
+ "name": "warmup_limit_conflicts_rows",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 400
+ },
+ "rule": "WARMUP_LIMIT_CONFLICT"
+ },
+ {
+ "name": "warmup_time_range_with_limit",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 2,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 1
+ },
+ "warmup_limit": 10
+ },
+ "rule": "WARMUP_TIME_RANGE_LIMIT"
+ },
+ {
+ "name": "observe_without_session_sla",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "RECENCY_OBSERVE_SLA"
+ },
+ {
+ "name": "bar_without_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "BAR_INTERVAL"
+ },
+ {
+ "name": "bar_blank_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": " ",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "BAR_INTERVAL"
+ },
+ {
+ "name": "metric_without_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "BASIS",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "METRIC_INTERVAL"
+ },
+ {
+ "name": "open_interest_blank_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "OPEN_INTEREST",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": " ",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "OI_INTERVAL_BLANK"
+ },
+ {
+ "name": "trade_with_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "INTERVAL_NOT_ALLOWED"
+ },
+ {
+ "name": "execution_non_price_feed",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "FUNDING_RATE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "EXECUTION_FEED"
+ },
+ {
+ "name": "execution_stale_observe",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "OBSERVE",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "OBSERVE",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "EXECUTION_STALE"
+ },
+ {
+ "name": "execution_gap_observe",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "OBSERVE",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "EXECUTION_GAP"
+ },
+ {
+ "name": "feed_unknown_number",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": 99,
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "ENUM_UNKNOWN"
+ },
+ {
+ "name": "recency_unknown_number",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": 77,
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "ENUM_UNKNOWN"
+ },
+ {
+ "name": "warmup_interval_source_unknown_number",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": 9,
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "ENUM_UNKNOWN"
+ },
+ {
+ "name": "instrument_uid_python_whitespace_only",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "\u001f\u0085",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "INSTRUMENT_UID"
+ },
+ {
+ "name": "instrument_uid_zero_width_is_not_blank",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "\u200b",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "bar_python_whitespace_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "\u001c",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "BAR_INTERVAL"
+ },
+ {
+ "name": "edge_warmup_rows_1",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 1,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_warmup_rows_10000_public",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 10000,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 10000
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_warmup_limit_10000",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 10000
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_deadline_100",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 100,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_deadline_99",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 99,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_DEADLINE"
+ },
+ {
+ "name": "edge_deadline_120000",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 120000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_cache_age_86400000",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 86400000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_rows_100000_structural_then_public_cap",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 100000,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_ROWS_PUBLIC"
+ },
+ {
+ "name": "edge_time_range_start_1_end_2",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 2,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 1
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_time_range_int64_max",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 9223372036854775807,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 1
+ },
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_time_range_negative_start",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 5,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": -5
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_TIME_RANGE"
+ },
+ {
+ "name": "edge_session_sla_1ms",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 1,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_freshness_u64_max",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 18446744073709551615,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_session_sla_u64_max",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 18446744073709551615,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": null
+ },
+ {
+ "name": "edge_enum_negative_wire",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": -1,
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "ENUM_UNKNOWN"
+ },
+ {
+ "name": "order_enum_unknown_stale_before_gap_unspecified",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "UNSPECIFIED",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": 42,
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "ENUM_UNKNOWN"
+ },
+ {
+ "name": "order_revision_unspecified_before_warmup",
+ "requirement": {
+ "bar_revision_policy": "UNSPECIFIED",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "none",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "REVISION_UNSPECIFIED"
+ },
+ {
+ "name": "order_warmup_horizon_before_instrument",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "none",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_HORIZON"
+ },
+ {
+ "name": "order_interval_source_before_rows",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "UNSPECIFIED",
+ "max_cache_age_ms": 60000,
+ "rows": 0,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_INTERVAL_SOURCE"
+ },
+ {
+ "name": "order_time_range_before_deadline",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 0,
+ "end_time_ns": 1,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 5
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_TIME_RANGE"
+ },
+ {
+ "name": "order_rows_before_cache_age",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 86400001,
+ "rows": 0,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_ROWS_RANGE"
+ },
+ {
+ "name": "order_cache_age_before_deadline",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 0,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 86400001,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_CACHE_AGE"
+ },
+ {
+ "name": "order_warmup_spec_before_instrument",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": " ",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 0,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 0
+ },
+ "rule": "WARMUP_DEADLINE"
+ },
+ {
+ "name": "order_instrument_before_source_policy",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "INSTRUMENT_UID"
+ },
+ {
+ "name": "order_source_policy_before_limit",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": " ",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 10001
+ },
+ "rule": "SOURCE_POLICY_ID"
+ },
+ {
+ "name": "order_limit_before_public_rows",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 20000,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 10001
+ },
+ "rule": "WARMUP_LIMIT"
+ },
+ {
+ "name": "order_public_rows_before_conflict",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": null,
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 0,
+ "horizon": "rows",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 20000,
+ "start_time_ns": 0
+ },
+ "warmup_limit": 5
+ },
+ "rule": "WARMUP_ROWS_PUBLIC"
+ },
+ {
+ "name": "order_time_range_limit_before_recency",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "BAR",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 180000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": {
+ "deadline_ms": 20000,
+ "end_time_ns": 2,
+ "horizon": "time_range",
+ "interval_source_policy": "NATIVE_ONLY",
+ "max_cache_age_ms": 60000,
+ "rows": 500,
+ "start_time_ns": 1
+ },
+ "warmup_limit": 3
+ },
+ "rule": "WARMUP_TIME_RANGE_LIMIT"
+ },
+ {
+ "name": "order_recency_before_interval",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "ALPHA",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 0,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "RECENCY_OBSERVE_SLA"
+ },
+ {
+ "name": "order_interval_before_execution",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": false,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "INTERVAL_NOT_ALLOWED"
+ },
+ {
+ "name": "order_execution_feed_before_stale",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "FUNDING_RATE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": true,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "OBSERVE",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "EXECUTION_FEED"
+ },
+ {
+ "name": "order_execution_gap_before_coverage",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "OBSERVE",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": false,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "EXECUTION_GAP"
+ },
+ {
+ "name": "execution_partial_coverage",
+ "requirement": {
+ "bar_revision_policy": "LATEST",
+ "consumer_grade": "EXECUTION",
+ "event_recency_policy": "OBSERVE",
+ "feed": "TRADE",
+ "gap_policy": "BLOCK",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "",
+ "max_freshness_ms": 15000,
+ "max_session_liveness_ms": 5000,
+ "recovery": "SNAPSHOT_AND_REPLAY",
+ "require_final_bars": true,
+ "require_full_coverage": false,
+ "source_policy_id": "crypto_primary_v2",
+ "stale_policy": "BLOCK",
+ "warmup": null,
+ "warmup_limit": 0
+ },
+ "rule": "EXECUTION_COVERAGE"
+ }
+ ],
+ "note": "each refusal's message starts with rule_messages[rule] in both languages; cases named order_* carry several violations and pin which rule is reported first",
+ "rule_messages": {
+ "BAR_INTERVAL": "bar requirements need an interval",
+ "ENUM_UNKNOWN": "Enum ",
+ "EXECUTION_COVERAGE": "execution-grade requirements need full coverage",
+ "EXECUTION_FEED": "execution-grade requirements need an execution-price validation feed",
+ "EXECUTION_GAP": "execution-grade gap policy must BLOCK",
+ "EXECUTION_STALE": "execution-grade stale policy must BLOCK",
+ "FEED_UNSPECIFIED": "feed_type_ cannot be UNSPECIFIED",
+ "GAP_UNSPECIFIED": "gap_policy_ cannot be UNSPECIFIED",
+ "GRADE_UNSPECIFIED": "consumer_grade_ cannot be UNSPECIFIED",
+ "INSTRUMENT_UID": "instrument_uid is required",
+ "INTERVAL_NOT_ALLOWED": "interval is valid only for bar or metric-series requirements",
+ "METRIC_INTERVAL": "metric-series requirements need a sampling interval",
+ "OI_INTERVAL_BLANK": "open-interest sampling interval cannot be blank",
+ "RECENCY_OBSERVE_SLA": "observed event recency requires an explicit provider session SLA",
+ "RECOVERY_UNSPECIFIED": "recovery_policy_ cannot be UNSPECIFIED",
+ "REVISION_UNSPECIFIED": "bar_revision_policy_ cannot be UNSPECIFIED",
+ "SOURCE_POLICY_ID": "source_policy_id is required",
+ "STALE_UNSPECIFIED": "stale_policy_ cannot be UNSPECIFIED",
+ "WARMUP_CACHE_AGE": "warmup max_cache_age_ms is outside bounds",
+ "WARMUP_DEADLINE": "warmup deadline_ms must be between 100 and 120000",
+ "WARMUP_HORIZON": "warmup horizon is required",
+ "WARMUP_INTERVAL_SOURCE": "warmup interval source policy is required",
+ "WARMUP_LIMIT": "warmup_limit must be between 0 and 10000",
+ "WARMUP_LIMIT_CONFLICT": "warmup_limit conflicts with warmup.rows",
+ "WARMUP_ROWS_PUBLIC": "public V2 warmup rows cannot exceed 10000",
+ "WARMUP_ROWS_RANGE": "warmup rows must be between 1 and 100000",
+ "WARMUP_TIME_RANGE": "warmup time range must be positive and increasing",
+ "WARMUP_TIME_RANGE_LIMIT": "time-range warmup cannot also declare warmup_limit"
+ },
+ "rules": [
+ "BAR_INTERVAL",
+ "ENUM_UNKNOWN",
+ "EXECUTION_COVERAGE",
+ "EXECUTION_FEED",
+ "EXECUTION_GAP",
+ "EXECUTION_STALE",
+ "FEED_UNSPECIFIED",
+ "GAP_UNSPECIFIED",
+ "GRADE_UNSPECIFIED",
+ "INSTRUMENT_UID",
+ "INTERVAL_NOT_ALLOWED",
+ "METRIC_INTERVAL",
+ "OI_INTERVAL_BLANK",
+ "RECENCY_OBSERVE_SLA",
+ "RECOVERY_UNSPECIFIED",
+ "REVISION_UNSPECIFIED",
+ "SOURCE_POLICY_ID",
+ "STALE_UNSPECIFIED",
+ "WARMUP_CACHE_AGE",
+ "WARMUP_DEADLINE",
+ "WARMUP_HORIZON",
+ "WARMUP_INTERVAL_SOURCE",
+ "WARMUP_LIMIT",
+ "WARMUP_LIMIT_CONFLICT",
+ "WARMUP_ROWS_PUBLIC",
+ "WARMUP_ROWS_RANGE",
+ "WARMUP_TIME_RANGE",
+ "WARMUP_TIME_RANGE_LIMIT"
+ ],
+ "schema": "qdl.kn.v220.golden.requirement-validation.v1",
+ "source": "outcomes produced by qdl.stream.grpc_service.requirement_from_proto (the Python server path)"
+}
diff --git a/contracts/golden/kn_v220/state_codec.json b/contracts/golden/kn_v220/state_codec.json
new file mode 100644
index 00000000..c07c268e
--- /dev/null
+++ b/contracts/golden/kn_v220/state_codec.json
@@ -0,0 +1,185 @@
+{
+ "schema":"qdl.kn.v220.state-codec-golden.v1",
+ "generated_by":"scripts/kn_state_codec_golden.py",
+ "provenance":{"sample":"canonical-sample.json","canonical_bytes":"real md.canonical.v2 records read from the stable spool (read-only sample)","source_coordinates":"generator-assigned; the sample comes from the spool, not from Kafka","legacy_lineage":"real spool stream, partition key and logical offset of each record","synthetic":"records/vectors marked synthetic are derived test fixtures"},
+ "constants":{"trailer_bytes":48,"frame_magic":"QKS1","frame_prefix_bytes":9,"max_header_bytes":4096,"max_json_depth":127,"legacy_provenance":"legacy_import","murmur2_seed":2538058380,"kinds":{"LATEST":1,"BAR_REVISION":2,"RETENTION_FLOOR":3,"LEGACY_BAR":4}},
+ "reasons":[
+ "TRUNCATED",
+ "MAGIC",
+ "KIND",
+ "HEADER_SIZE",
+ "HEADER_JSON",
+ "HEADER_FIELDS",
+ "FIELD",
+ "NON_CANONICAL",
+ "BODY",
+ "CONTENT_HASH",
+ "ENVELOPE",
+ "NOT_BAR",
+ "PRODUCT_MISMATCH",
+ "OPEN_TIME",
+ "HEADER_MISMATCH",
+ "TRAILER",
+ "ENVELOPE_NOT_CANONICAL",
+ "PARTITIONS"
+ ],
+ "records":[
+ {"name":"bar-1d-final-binance","synthetic":false,"tag":"bar|1d|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-1d-primary-v2","spool_offset":1102,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ5bDpraRx54y094HHJ+6FMSokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0xZC1wcmltYXJ5LXYycAF4AYABwPuC0I6WhuwYiAGzsY/rppaG7BiQAbOxj+umlobsGJgBs7GP66aWhuwYogEbMTc5MDEyMTYwMDAwMDoxNzkwMjA3OTk5OTk5qAGB9c/mg/AZsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIJs3/CbushSlqji4eF2tBXQekqmzI8L+OcXRn36PhI7B0gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjFkOjE3OTAxMjE2MDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgn2ZUwaGO/LYDlz8T6dE9HuUZ859Vnfv79ePhCXl/eICKAhBMf+eKwz4hz4ZRzXgpCSTO0gK5AQoCMWQQgICExsXD8usYGMD7gtCOlobsGCIQCOCgDBAMIggwLjEwMDQwMCoQCOTeDBAMIggwLjEwNDM3MDIQCLSNCxAMIggwLjA5MDk3MDoQCPynCxAMIggwLjA5MjY3MEITCPL80/tPIgsxMDczMjg2MzI4OUiAmrQBUAFgAWgCeAGCARMI8vzT+08iCzEwNzMyODYzMjg5igEeCMSWqZ3c6twDEAwiETEwNDg1Njg1MTQuNTUzMjUw","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":0},"materializer_epoch":1,"latest_value_trailer_hex":"0000000000000000000000000000000167aed43752d01a2dd6ec69b7171b38b5ba856ba74e5dd10184dbdcf59867a218","bar_row_b64":"AAAAAAAAAAAAAAAAAAAAAWeu1DdS0Bot1uxptxcbOLW6hWunTl3RAYTb3PWYZ6IYChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ5bDpraRx54y094HHJ+6FMTIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItMWQtcHJpbWFyeS12MnABeAGAAcD7gtCOlobsGIgBs7GP66aWhuwYkAGzsY/rppaG7BiYAbOxj+umlobsGKIBGzE3OTAxMjE2MDAwMDA6MTc5MDIwNzk5OTk5OagBgfXP5oPwGbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASCbN/wm7rIUpao4uHhdrQV0HpKpsyPC/jnF0Z9+j4SOwdIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDoxZDoxNzkwMTIxNjAwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3OTAxNDI3OTQ3NzUwOTk2OTnoAbPyrZ6yrPfrGPABAfgBAYICIJ9mVMGhjvy2A5c/E+nRPR7lGfOfVZ37+/Xj4Ql5f3iAigIQTH/nisM+Ic+GUc14KQkkztICtQEQgICExsXD8usYGMD7gtCOlobsGCIQCOCgDBAMIggwLjEwMDQwMCoQCOTeDBAMIggwLjEwNDM3MDIQCLSNCxAMIggwLjA5MDk3MDoQCPynCxAMIggwLjA5MjY3MEITCPL80/tPIgsxMDczMjg2MzI4OUiAmrQBUAFgAWgCeAGCARMI8vzT+08iCzEwNzMyODYzMjg5igEeCMSWqZ3c6twDEAwiETEwNDg1Njg1MTQuNTUzMjUw","headers":{"LATEST":"{\"content_sha256\":\"67aed43752d01a2dd6ec69b7171b38b5ba856ba74e5dd10184dbdcf59867a218\",\"event_id\":\"e5b0e9ada471e78cb4f781c727ee8531\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d\",\"materializer_epoch\":1,\"source\":{\"offset\":0,\"partition\":0,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"67aed43752d01a2dd6ec69b7171b38b5ba856ba74e5dd10184dbdcf59867a218\",\"event_id\":\"e5b0e9ada471e78cb4f781c727ee8531\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d\",\"materializer_epoch\":1,\"open_time_ms\":1790121600000,\"revision\":0,\"source\":{\"offset\":0,\"partition\":0,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","LEGACY_BAR":"{\"content_sha256\":\"67aed43752d01a2dd6ec69b7171b38b5ba856ba74e5dd10184dbdcf59867a218\",\"event_id\":\"e5b0e9ada471e78cb4f781c727ee8531\",\"is_final\":true,\"legacy\":{\"spool_logical_offset\":1102,\"spool_partition_key\":\"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-1d-primary-v2\",\"spool_stream\":\"md.canonical.v2\"},\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d\",\"materializer_epoch\":1,\"open_time_ms\":1790121600000,\"provenance\":\"legacy_import\",\"revision\":0}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1d|1790121600000|f0|67aed43752d01a2d"},"partitions":{"1":0,"3":2,"6":5,"12":11,"48":35}},
+ {"name":"bar-2d-final-okx","synthetic":false,"tag":"bar|2d|final","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-2d-primary-v2","spool_offset":551,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQtgbt80ClCy2Oo9wcy09pKiokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTJkLXByaW1hcnktdjJwAXgBgAGAgMi7/PDe6xiIAZb38OGRlobsGJABlvfw4ZGWhuwYmAGW9/DhkZaG7BiiAQ8xNzkwMDM1MjAwMDAwOjGoAcHEzP3P8xqyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBIOEN1oxE058yLnVNRka9TLMEuCxtDqOYzDpBLKUuzmzd0gEgNDQxYTQyOWUxZDFkMzBhNWMyMmJhMTc4Zjc1MzRiNjHYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ3LTE3OTAxNzcwMjg2MDU4NTYxNDjoAS/wAQH4AQGCAiB0pKHr5bKi0io5gVyabpv8z5Jdou+6Khr0MGsngwzsWYoCEEQaQp4dHTClwiuhePdTS2HSAtIBCgIyZBCAgMi7/PDe6xgYwPuC0I6WhuwYIg8IiJwBEAoiBzAuMDk5ODgqDwjMpQEQCiIHMC4xMDU5ODIPCJ6OARAKIgcwLjA5MTAzOg8I5pABEAoiBzAuMDkyNjdCFQje4pzeCxAEIgsxNTc1MTk2OC40N1ABYAFoAngDggEYCLiRvc6VCRACIg0xNTc1MTk2ODQ3MC4wigEhCKC0z8mmgsapBBAQIhMxNTU4MDk2MzMyLjg2MDkwMDAwkgEVCN7inN4LEAQiCzE1NzUxOTY4LjQ3","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":2147483647,"offset":9223372036854775807},"materializer_epoch":9223372036854775807,"latest_value_trailer_hex":"7fffffffffffffff7fffffffffffffffdc06296c0f2929924df9b61d08ea1cd5d0f59895a05b5b484eedf494c0c56678","bar_row_b64":"f/////////9//////////9wGKWwPKSmSTfm2HQjqHNXQ9ZiVoFtbSE7t9JTAxWZ4ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQtgbt80ClCy2Oo9wcy09pKjIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMmQtcHJpbWFyeS12MnABeAGAAYCAyLv88N7rGIgBlvfw4ZGWhuwYkAGW9/DhkZaG7BiYAZb38OGRlobsGKIBDzE3OTAwMzUyMDAwMDA6MagBwcTM/c/zGrIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEg4Q3WjETTnzIudU1GRr1MswS4LG0Oo5jMOkEspS7ObN3SASA0NDFhNDI5ZTFkMWQzMGE1YzIyYmExNzhmNzUzNGI2MdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDctMTc5MDE3NzAyODYwNTg1NjE0OOgBL/ABAfgBAYICIHSkoevlsqLSKjmBXJpum/zPkl2i77oqGvQwayeDDOxZigIQRBpCnh0dMKXCK6F491NLYdICzgEQgIDIu/zw3usYGMD7gtCOlobsGCIPCIicARAKIgcwLjA5OTg4Kg8IzKUBEAoiBzAuMTA1OTgyDwiejgEQCiIHMC4wOTEwMzoPCOaQARAKIgcwLjA5MjY3QhUI3uKc3gsQBCILMTU3NTE5NjguNDdQAWABaAJ4A4IBGAi4kb3OlQkQAiINMTU3NTE5Njg0NzAuMIoBIQigtM/JpoLGqQQQECITMTU1ODA5NjMzMi44NjA5MDAwMJIBFQje4pzeCxAEIgsxNTc1MTk2OC40Nw==","headers":{"LATEST":"{\"content_sha256\":\"dc06296c0f2929924df9b61d08ea1cd5d0f59895a05b5b484eedf494c0c56678\",\"event_id\":\"b606edf340a50b2d8ea3dc1ccb4f692a\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d\",\"materializer_epoch\":9223372036854775807,\"source\":{\"offset\":9223372036854775807,\"partition\":2147483647,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"dc06296c0f2929924df9b61d08ea1cd5d0f59895a05b5b484eedf494c0c56678\",\"event_id\":\"b606edf340a50b2d8ea3dc1ccb4f692a\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d\",\"materializer_epoch\":9223372036854775807,\"open_time_ms\":1790035200000,\"revision\":0,\"source\":{\"offset\":9223372036854775807,\"partition\":2147483647,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","LEGACY_BAR":"{\"content_sha256\":\"dc06296c0f2929924df9b61d08ea1cd5d0f59895a05b5b484eedf494c0c56678\",\"event_id\":\"b606edf340a50b2d8ea3dc1ccb4f692a\",\"is_final\":true,\"legacy\":{\"spool_logical_offset\":551,\"spool_partition_key\":\"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-2d-primary-v2\",\"spool_stream\":\"md.canonical.v2\"},\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d\",\"materializer_epoch\":9223372036854775807,\"open_time_ms\":1790035200000,\"provenance\":\"legacy_import\",\"revision\":0}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|2d|1790035200000|f0|dc06296c0f292992"},"partitions":{"1":0,"3":0,"6":0,"12":6,"48":42}},
+ {"name":"bar-3d-final-binance","synthetic":false,"tag":"bar|3d|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-3d-primary-v2","spool_offset":368,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQJeYnudE6pLBTeAiL3DpsWyokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0zZC1wcmltYXJ5LXYycAF4AYABwPvGxcXD8usYiAG9wOHd3MPy6xiQAb3A4d3cw/LrGJgBvcDh3dzD8usYogEbMTc4OTg2MjQwMDAwMDoxNzkwMTIxNTk5OTk5qAGBrc2+4ugWsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIDkBm7K89k+8swWTYONfIlmICr83ptaPBddACeB4vY/p0gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjNkOjE3ODk4NjI0MDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc4OTgwNjU4MzczNDc1MTU1NOgBwqKpwa7zqusY8AEB+AEBggIgHkF6vXkwiQLtOchel2YunoVJVO0LZVephIzqjSZTOyuKAhAfIA7SCvhhekPstD2u6vsx0gK7AQoCM2QQgIDQpurLt+sYGMD7xsXFw/LrGCIQCLzaChAMIggwLjA4NzcxMCoQCKj3DBAMIggwLjEwNTk0MDIQCOilChAMIggwLjA4NDM0MDoQCOCgDBAMIggwLjEwMDQwMEIUCKrt8snqASILMzE0ODQ0MzUyODVIsf+JBFABYAFoAngBggEUCKrt8snqASILMzE0ODQ0MzUyODWKAR4IvIrYr9vX0woQDCIRMjk5ODc3NTYwOS43NTQyNzA=","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":2,"offset":1015838},"materializer_epoch":3,"latest_value_trailer_hex":"00000000000f801e0000000000000003d13084663aebc6ccfb7f5995475ebadac665c4e326f658f95d64ea6dc7b1497d","bar_row_b64":"AAAAAAAPgB4AAAAAAAAAA9EwhGY668bM+39ZlUdeutrGZcTjJvZY+V1k6m3HsUl9ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQJeYnudE6pLBTeAiL3DpsWzIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItM2QtcHJpbWFyeS12MnABeAGAAcD7xsXFw/LrGIgBvcDh3dzD8usYkAG9wOHd3MPy6xiYAb3A4d3cw/LrGKIBGzE3ODk4NjI0MDAwMDA6MTc5MDEyMTU5OTk5OagBga3NvuLoFrIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASA5AZuyvPZPvLMFk2DjXyJZiAq/N6bWjwXXQAngeL2P6dIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDozZDoxNzg5ODYyNDAwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3ODk4MDY1ODM3MzQ3NTE1NTToAcKiqcGu86rrGPABAfgBAYICIB5Ber15MIkC7TnIXpdmLp6FSVTtC2VXqYSM6o0mUzsrigIQHyAO0gr4YXpD7LQ9rur7MdICtwEQgIDQpurLt+sYGMD7xsXFw/LrGCIQCLzaChAMIggwLjA4NzcxMCoQCKj3DBAMIggwLjEwNTk0MDIQCOilChAMIggwLjA4NDM0MDoQCOCgDBAMIggwLjEwMDQwMEIUCKrt8snqASILMzE0ODQ0MzUyODVIsf+JBFABYAFoAngBggEUCKrt8snqASILMzE0ODQ0MzUyODWKAR4IvIrYr9vX0woQDCIRMjk5ODc3NTYwOS43NTQyNzA=","headers":{"LATEST":"{\"content_sha256\":\"d13084663aebc6ccfb7f5995475ebadac665c4e326f658f95d64ea6dc7b1497d\",\"event_id\":\"25e627b9d13aa4b05378088bdc3a6c5b\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d\",\"materializer_epoch\":3,\"source\":{\"offset\":1015838,\"partition\":2,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"d13084663aebc6ccfb7f5995475ebadac665c4e326f658f95d64ea6dc7b1497d\",\"event_id\":\"25e627b9d13aa4b05378088bdc3a6c5b\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d\",\"materializer_epoch\":3,\"open_time_ms\":1789862400000,\"revision\":0,\"source\":{\"offset\":1015838,\"partition\":2,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","LEGACY_BAR":"{\"content_sha256\":\"d13084663aebc6ccfb7f5995475ebadac665c4e326f658f95d64ea6dc7b1497d\",\"event_id\":\"25e627b9d13aa4b05378088bdc3a6c5b\",\"is_final\":true,\"legacy\":{\"spool_logical_offset\":368,\"spool_partition_key\":\"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-3d-primary-v2\",\"spool_stream\":\"md.canonical.v2\"},\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d\",\"materializer_epoch\":3,\"open_time_ms\":1789862400000,\"provenance\":\"legacy_import\",\"revision\":0}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3d|1789862400000|f0|d13084663aebc6cc"},"partitions":{"1":0,"3":0,"6":0,"12":0,"48":0}},
+ {"name":"bar-1h-final-okx","synthetic":false,"tag":"bar|1h|final","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1h-primary-v2","spool_offset":10173,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQDAnlkIPod3BmqR46uZrfayokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFoLXByaW1hcnktdjJwAXgBgAGAwPuP0JaP7BiIAe/VnN63/4/sGJAB79Wc3rf/j+wYmAHv1Zzet/+P7BiiAQ8xNzkwMjQ3NjAwMDAwOjGoAcHXzYjm6hiyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBICzM5UUeLaw/PBBW6ZUBSp1E0+2lZcIW9mJKU7Yj9zED0gEgYzVhZTkzMjQ0OGFiNDMxM2Q1ZTQxZjdmZGJjOGMzMTTYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiCfGSTuOQp2TB4oKIxk4KdLdlAd+4eoIejdKh4T65qwB4oCEMWukyRIq0MT1eQff9vIwxTSAsYBCgIxaBCAwPuP0JaP7BgYwPuglbP/j+wYIg8I8pABEAoiBzAuMDkyNzMqDwimkQEQCiIHMC4wOTI5OTIPCLiQARAKIgcwLjA5MjQ0Og8I5pABEAoiBzAuMDkyNjdCEgi+xMkNEAQiCTE0MjMzOC44N1ABYAFoAngDggEVCLjAuc0KEAIiCzE0MjMzODg3MC4wigEeCKCO4Y2oidgEEBAiETEzMTk1NzM5LjU1MjkwMDAwkgESCL7EyQ0QBCIJMTQyMzM4Ljg3","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":3,"offset":1023757},"materializer_epoch":1,"latest_value_trailer_hex":"00000000000f9f0d0000000000000001c35f4b2667ed2dd669d48e2781f7e52d2dad6200088519ff5881fd5dafb8c0e6","bar_row_b64":"AAAAAAAPnw0AAAAAAAAAAcNfSyZn7S3WadSOJ4H35S0trWIACIUZ/1iB/V2vuMDmChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQDAnlkIPod3BmqR46uZrfazIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMWgtcHJpbWFyeS12MnABeAGAAYDA+4/Qlo/sGIgB79Wc3rf/j+wYkAHv1Zzet/+P7BiYAe/VnN63/4/sGKIBDzE3OTAyNDc2MDAwMDA6MagBwdfNiObqGLIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgLMzlRR4trD88EFbplQFKnUTT7aVlwhb2YkpTtiP3MQPSASBjNWFlOTMyNDQ4YWI0MzEzZDVlNDFmN2ZkYmM4YzMxNNgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIJ8ZJO45CnZMHigojGTgp0t2UB37h6gh6N0qHhPrmrAHigIQxa6TJEirQxPV5B9/28jDFNICwgEQgMD7j9CWj+wYGMD7oJWz/4/sGCIPCPKQARAKIgcwLjA5MjczKg8IppEBEAoiBzAuMDkyOTkyDwi4kAEQCiIHMC4wOTI0NDoPCOaQARAKIgcwLjA5MjY3QhIIvsTJDRAEIgkxNDIzMzguODdQAWABaAJ4A4IBFQi4wLnNChACIgsxNDIzMzg4NzAuMIoBHgigjuGNqInYBBAQIhExMzE5NTczOS41NTI5MDAwMJIBEgi+xMkNEAQiCTE0MjMzOC44Nw==","headers":{"LATEST":"{\"content_sha256\":\"c35f4b2667ed2dd669d48e2781f7e52d2dad6200088519ff5881fd5dafb8c0e6\",\"event_id\":\"0c09e59083e8777066a91e3ab99adf6b\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h\",\"materializer_epoch\":1,\"source\":{\"offset\":1023757,\"partition\":3,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"c35f4b2667ed2dd669d48e2781f7e52d2dad6200088519ff5881fd5dafb8c0e6\",\"event_id\":\"0c09e59083e8777066a91e3ab99adf6b\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h\",\"materializer_epoch\":1,\"open_time_ms\":1790247600000,\"revision\":0,\"source\":{\"offset\":1023757,\"partition\":3,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","LEGACY_BAR":"{\"content_sha256\":\"c35f4b2667ed2dd669d48e2781f7e52d2dad6200088519ff5881fd5dafb8c0e6\",\"event_id\":\"0c09e59083e8777066a91e3ab99adf6b\",\"is_final\":true,\"legacy\":{\"spool_logical_offset\":10173,\"spool_partition_key\":\"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1h-primary-v2\",\"spool_stream\":\"md.canonical.v2\"},\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h\",\"materializer_epoch\":1,\"open_time_ms\":1790247600000,\"provenance\":\"legacy_import\",\"revision\":0}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1h|1790247600000|f0|c35f4b2667ed2dd6"},"partitions":{"1":0,"3":1,"6":1,"12":1,"48":25}},
+ {"name":"bar-2h-final-binance","synthetic":false,"tag":"bar|2h|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-2h-primary-v2","spool_offset":10087,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|2h","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQmOX3OonpJPeYhKBpM8LrLiokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0yaC1wcmltYXJ5LXYycAF4AYABwPuglbP/j+wYiAHQ7vzcy/+P7BiQAdDu/NzL/4/sGJgB0O783Mv/j+wYogEbMTc5MDI0NDAwMDAwMDoxNzkwMjUxMTk5OTk5qAHB19/85+oYsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIDw+gaknUIhLfdD10vDxWeGuzVzzGT5nPmXL+czHCXCS0gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjJoOjE3OTAyNDQwMDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgt53ZuFyysjFi3l0rdeZmQnoGSf8R7YwQ8Ko2DIBa2uCKAhALs2FKT5x+3qKy1wttFknb0gKxAQoCMmgQgICZiu2tjuwYGMD7oJWz/4/sGCIQCPydCxAMIggwLjA5MjAzMCoQCNSsCxAMIggwLjA5Mjk3MDIQCIiaCxAMIggwLjA5MTc4MDoQCNSnCxAMIggwLjA5MjY1MEIRCLr96+wCIgkzODI1NjYyMzdI6oAIUAFgAWgCeAGCAREIuv3r7AIiCTM4MjU2NjIzN4oBGwiox76piIoQEAwiDzM1MzU3Mjg4LjAyNjU4MA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":4,"offset":1031676},"materializer_epoch":2,"latest_value_trailer_hex":"00000000000fbdfc00000000000000022501cbcd9482b4b9489d8c994433d20bd89ea1fba655805b2dd5cc88dd979ac2","bar_row_b64":"AAAAAAAPvfwAAAAAAAAAAiUBy82UgrS5SJ2MmUQz0gvYnqH7plWAWy3VzIjdl5rCChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQmOX3OonpJPeYhKBpM8LrLjIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItMmgtcHJpbWFyeS12MnABeAGAAcD7oJWz/4/sGIgB0O783Mv/j+wYkAHQ7vzcy/+P7BiYAdDu/NzL/4/sGKIBGzE3OTAyNDQwMDAwMDA6MTc5MDI1MTE5OTk5OagBwdff/OfqGLIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASA8PoGpJ1CIS33Q9dLw8Vnhrs1c8xk+Zz5ly/nMxwlwktIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDoyaDoxNzkwMjQ0MDAwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3OTAxNDI3OTQ3NzUwOTk2OTnoAbPyrZ6yrPfrGPABAfgBAYICILed2bhcsrIxYt5dK3XmZkJ6Bkn/Ee2MEPCqNgyAWtrgigIQC7NhSk+cft6istcLbRZJ29ICrQEQgICZiu2tjuwYGMD7oJWz/4/sGCIQCPydCxAMIggwLjA5MjAzMCoQCNSsCxAMIggwLjA5Mjk3MDIQCIiaCxAMIggwLjA5MTc4MDoQCNSnCxAMIggwLjA5MjY1MEIRCLr96+wCIgkzODI1NjYyMzdI6oAIUAFgAWgCeAGCAREIuv3r7AIiCTM4MjU2NjIzN4oBGwiox76piIoQEAwiDzM1MzU3Mjg4LjAyNjU4MA==","headers":{"LATEST":"{\"content_sha256\":\"2501cbcd9482b4b9489d8c994433d20bd89ea1fba655805b2dd5cc88dd979ac2\",\"event_id\":\"98e5f73a89e924f79884a06933c2eb2e\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|2h\",\"materializer_epoch\":2,\"source\":{\"offset\":1031676,\"partition\":4,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"2501cbcd9482b4b9489d8c994433d20bd89ea1fba655805b2dd5cc88dd979ac2\",\"event_id\":\"98e5f73a89e924f79884a06933c2eb2e\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|2h\",\"materializer_epoch\":2,\"open_time_ms\":1790244000000,\"revision\":0,\"source\":{\"offset\":1031676,\"partition\":4,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|2h","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|2h|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|2h|1790244000000|f0|2501cbcd9482b4b9"},"partitions":{"1":0,"3":0,"6":3,"12":3,"48":27}},
+ {"name":"bar-4h-final-okx","synthetic":false,"tag":"bar|4h|final","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-4h-primary-v2","spool_offset":6614,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|4h","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQyN6RjjLCmNYEX6sRN5VKByokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTRoLXByaW1hcnktdjJwAXgBgAGAgNT+ptyM7BiIAeDP5N23/4/sGJAB4M/k3bf/j+wYmAHgz+Tdt/+P7BiiAQ8xNzkwMjM2ODAwMDAwOjGoAYHso4LStSKyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBII9JpbiZvGAIugcnKGr9LbaiSGQ9P9Os5EQIksN0FlGw0gEgYzM0Mjc4NTJiODIzZDk0OGY2YjY3ODEyMTU0MGQwMGTYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiB8tS12DLWYF4A+8u6MbWHxyLmI77uKxexfaxEXQSQjGooCEMNCeFK4I9lI9rZ4EhVA0A3SAsoBCgI0aBCAgNT+ptyM7BgYwPuglbP/j+wYIg8I4JMBEAoiBzAuMDk0NTYqDwj8kwEQCiIHMC4wOTQ3MDIPCOCOARAKIgcwLjA5MTM2Og8I5pABEAoiBzAuMDkyNjdCEwjYvNhnEAQiCjEwODcyODEuMDhQAWABaAJ4A4IBFgjgtI+BURACIgwxMDg3MjgxMDgwLjCKAR8I4KjCj4Ki6CMQECISMTAwODA5MDcwLjAzNzEwMDAwkgETCNi82GcQBCIKMTA4NzI4MS4wOA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":5,"offset":1039595},"materializer_epoch":3,"latest_value_trailer_hex":"00000000000fdceb00000000000000032a2fe9100605d3b9e1a0193c25799b334d1fd2a65245920174ed4efdeeaf494b","bar_row_b64":"AAAAAAAP3OsAAAAAAAAAAyov6RAGBdO54aAZPCV5mzNNH9KmUkWSAXTtTv3ur0lLChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQyN6RjjLCmNYEX6sRN5VKBzIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItNGgtcHJpbWFyeS12MnABeAGAAYCA1P6m3IzsGIgB4M/k3bf/j+wYkAHgz+Tdt/+P7BiYAeDP5N23/4/sGKIBDzE3OTAyMzY4MDAwMDA6MagBgeyjgtK1IrIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgj0mluJm8YAi6Bycoav0ttqJIZD0/06zkRAiSw3QWUbDSASBjMzQyNzg1MmI4MjNkOTQ4ZjZiNjc4MTIxNTQwZDAwZNgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHy1LXYMtZgXgD7y7oxtYfHIuYjvu4rF7F9rERdBJCMaigIQw0J4Urgj2Uj2tngSFUDQDdICxgEQgIDU/qbcjOwYGMD7oJWz/4/sGCIPCOCTARAKIgcwLjA5NDU2Kg8I/JMBEAoiBzAuMDk0NzAyDwjgjgEQCiIHMC4wOTEzNjoPCOaQARAKIgcwLjA5MjY3QhMI2LzYZxAEIgoxMDg3MjgxLjA4UAFgAWgCeAOCARYI4LSPgVEQAiIMMTA4NzI4MTA4MC4wigEfCOCowo+CougjEBAiEjEwMDgwOTA3MC4wMzcxMDAwMJIBEwjYvNhnEAQiCjEwODcyODEuMDg=","headers":{"LATEST":"{\"content_sha256\":\"2a2fe9100605d3b9e1a0193c25799b334d1fd2a65245920174ed4efdeeaf494b\",\"event_id\":\"c8de918e32c298d6045fab1137954a07\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|4h\",\"materializer_epoch\":3,\"source\":{\"offset\":1039595,\"partition\":5,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"2a2fe9100605d3b9e1a0193c25799b334d1fd2a65245920174ed4efdeeaf494b\",\"event_id\":\"c8de918e32c298d6045fab1137954a07\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|4h\",\"materializer_epoch\":3,\"open_time_ms\":1790236800000,\"revision\":0,\"source\":{\"offset\":1039595,\"partition\":5,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|4h","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|4h|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|4h|1790236800000|f0|2a2fe9100605d3b9"},"partitions":{"1":0,"3":2,"6":5,"12":5,"48":17}},
+ {"name":"bar-6h-final-binance","synthetic":false,"tag":"bar|6h|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-6h-primary-v2","spool_offset":4409,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|6h","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQYKFAuDJH4AFZGvjn0yzRMyokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci02aC1wcmltYXJ5LXYycAF4AYABwPuglbP/j+wYiAGEkomNyv+P7BiQAYSSiY3K/4/sGJgBhJKJjcr/j+wYogEbMTc5MDIyOTYwMDAwMDoxNzkwMjUxMTk5OTk5qAGB3Jz95+oYsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIAczrWTj+qI/BDikzsgclQ50xdlIQoockLoJmBUAMSMU0gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjZoOjE3OTAyMjk2MDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgYqVTvHorztUFZNwN0asMH8Kg6qV5cBwG7opnPB3QE+2KAhCXMsDVWLvHtpwBbEs/1/A70gK0AQoCNmgQgICP8+CKi+wYGMD7oJWz/4/sGCIQCMS9CxAMIggwLjA5NDA1MCoQCOjKCxAMIggwLjA5NDkwMDIQCNSTCxAMIggwLjA5MTM3MDoQCNSnCxAMIggwLjA5MjY1MEISCOrrkY8LIgoxNDkyMjY5ODEzSK7IHFABYAFoAngBggESCOrrkY8LIgoxNDkyMjY5ODEzigEcCOjE+fOnkz8QDCIQMTM4ODcwMjM4LjY4NzU0MA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":6,"offset":1047514},"materializer_epoch":1,"latest_value_trailer_hex":"00000000000ffbda000000000000000184d7aeba282a7a2622ece1e3c153118c68a34fe87a697857df8d2bab21688e7c","bar_row_b64":"AAAAAAAP+9oAAAAAAAAAAYTXrrooKnomIuzh48FTEYxoo0/oeml4V9+NK6shaI58ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQYKFAuDJH4AFZGvjn0yzRMzIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItNmgtcHJpbWFyeS12MnABeAGAAcD7oJWz/4/sGIgBhJKJjcr/j+wYkAGEkomNyv+P7BiYAYSSiY3K/4/sGKIBGzE3OTAyMjk2MDAwMDA6MTc5MDI1MTE5OTk5OagBgdyc/efqGLIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASAHM61k4/qiPwQ4pM7IHJUOdMXZSEKKHJC6CZgVADEjFNIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDo2aDoxNzkwMjI5NjAwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3OTAxNDI3OTQ3NzUwOTk2OTnoAbPyrZ6yrPfrGPABAfgBAYICIGKlU7x6K87VBWTcDdGrDB/CoOqleXAcBu6KZzwd0BPtigIQlzLA1Vi7x7acAWxLP9fwO9ICsAEQgICP8+CKi+wYGMD7oJWz/4/sGCIQCMS9CxAMIggwLjA5NDA1MCoQCOjKCxAMIggwLjA5NDkwMDIQCNSTCxAMIggwLjA5MTM3MDoQCNSnCxAMIggwLjA5MjY1MEISCOrrkY8LIgoxNDkyMjY5ODEzSK7IHFABYAFoAngBggESCOrrkY8LIgoxNDkyMjY5ODEzigEcCOjE+fOnkz8QDCIQMTM4ODcwMjM4LjY4NzU0MA==","headers":{"LATEST":"{\"content_sha256\":\"84d7aeba282a7a2622ece1e3c153118c68a34fe87a697857df8d2bab21688e7c\",\"event_id\":\"60a140b83247e001591af8e7d32cd133\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|6h\",\"materializer_epoch\":1,\"source\":{\"offset\":1047514,\"partition\":6,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"84d7aeba282a7a2622ece1e3c153118c68a34fe87a697857df8d2bab21688e7c\",\"event_id\":\"60a140b83247e001591af8e7d32cd133\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|6h\",\"materializer_epoch\":1,\"open_time_ms\":1790229600000,\"revision\":0,\"source\":{\"offset\":1047514,\"partition\":6,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|6h","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|6h|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|6h|1790229600000|f0|84d7aeba282a7a26"},"partitions":{"1":0,"3":1,"6":4,"12":10,"48":10}},
+ {"name":"bar-8h-final-binance","synthetic":false,"tag":"bar|8h|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-8h-primary-v2","spool_offset":3307,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|8h","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQMVFcPmSkBDjfkLK6akeATiokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci04aC1wcmltYXJ5LXYycAF4AYABwPuW/qbcjOwYiAGw5q+FwtyM7BiQAbDmr4XC3IzsGJgBsOavhcLcjOwYogEbMTc5MDIwODAwMDAwMDoxNzkwMjM2Nzk5OTk5qAHB8YvM0+gssgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIBjzMjP3Ft810vhb9GeGC/jEGAa66FsJKtjD+5P5doHW0gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjhoOjE3OTAyMDgwMDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgzgeuo0mLOS3gQ4qMkbhZNdqW7v8rdqfNjQxo16PtTiuKAhAIYjUtLQKtNuXboI2r1TW10gK0AQoCOGgQgIDA0I6WhuwYGMD7lv6m3IzsGCIQCJCoCxAMIggwLjA5MjY4MCoQCNzOCxAMIggwLjA5NTE1MDIQCPCcCxAMIggwLjA5MTk2MDoQCNTFCxAMIggwLjA5NDU3MEISCJKR5ZQMIgoxNjMyNDEyNzQ1SLXbIFABYAFoAngBggESCJKR5ZQMIgoxNjMyNDEyNzQ1igEcCJTS6ubCv0UQDCIQMTUyODIzOTAyLjU5MDA5MA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":7,"offset":1055433},"materializer_epoch":2,"latest_value_trailer_hex":"0000000000101ac900000000000000024b3a860b4b958eb27ecd2711ab8d48090d9b5780a297ed8d637d1df396c9a8ef","bar_row_b64":"AAAAAAAQGskAAAAAAAAAAks6hgtLlY6yfs0nEauNSAkNm1eAopftjWN9HfOWyajvChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQMVFcPmSkBDjfkLK6akeATjIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItOGgtcHJpbWFyeS12MnABeAGAAcD7lv6m3IzsGIgBsOavhcLcjOwYkAGw5q+FwtyM7BiYAbDmr4XC3IzsGKIBGzE3OTAyMDgwMDAwMDA6MTc5MDIzNjc5OTk5OagBwfGLzNPoLLIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASAY8zIz9xbfNdL4W/Rnhgv4xBgGuuhbCSrYw/uT+XaB1tIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDo4aDoxNzkwMjA4MDAwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3OTAxNDI3OTQ3NzUwOTk2OTnoAbPyrZ6yrPfrGPABAfgBAYICIM4HrqNJizkt4EOKjJG4WTXalu7/K3anzY0MaNej7U4rigIQCGI1LS0CrTbl26CNq9U1tdICsAEQgIDA0I6WhuwYGMD7lv6m3IzsGCIQCJCoCxAMIggwLjA5MjY4MCoQCNzOCxAMIggwLjA5NTE1MDIQCPCcCxAMIggwLjA5MTk2MDoQCNTFCxAMIggwLjA5NDU3MEISCJKR5ZQMIgoxNjMyNDEyNzQ1SLXbIFABYAFoAngBggESCJKR5ZQMIgoxNjMyNDEyNzQ1igEcCJTS6ubCv0UQDCIQMTUyODIzOTAyLjU5MDA5MA==","headers":{"LATEST":"{\"content_sha256\":\"4b3a860b4b958eb27ecd2711ab8d48090d9b5780a297ed8d637d1df396c9a8ef\",\"event_id\":\"31515c3e64a40438df90b2ba6a47804e\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|8h\",\"materializer_epoch\":2,\"source\":{\"offset\":1055433,\"partition\":7,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"4b3a860b4b958eb27ecd2711ab8d48090d9b5780a297ed8d637d1df396c9a8ef\",\"event_id\":\"31515c3e64a40438df90b2ba6a47804e\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|8h\",\"materializer_epoch\":2,\"open_time_ms\":1790208000000,\"revision\":0,\"source\":{\"offset\":1055433,\"partition\":7,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|8h","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|8h|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|8h|1790208000000|f0|4b3a860b4b958eb2"},"partitions":{"1":0,"3":2,"6":2,"12":8,"48":44}},
+ {"name":"bar-12h-final-binance","synthetic":false,"tag":"bar|12h|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-12h-primary-v2","spool_offset":2205,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|12h","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQV6NwRIEF3yGSIpCLuQ3bNCokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGooYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0xMmgtcHJpbWFyeS12MnABeAGAAcD7oJWz/4/sGIgBtP3j2Mn/j+wYkAG0/ePYyf+P7BiYAbT949jJ/4/sGKIBGzE3OTAyMDgwMDAwMDA6MTc5MDI1MTE5OTk5OagBwcOW3+i6GrIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASD+ZrLN2gVFuyy6uIVLHKn2QSar9igqdzAeSp/fwFQf29IBJ2JpbmFuY2U6VVNETTpET0dFVVNEVDoxMmg6MTc5MDIwODAwMDAwMNgBEeIBMnFkbC12Mi1zdGFibGUtYmluYW5jZS1yZXN0LXIxLWcxNzkwMTQyNzk0Nzc1MDk5Njk56AGz8q2esqz36xjwAQH4AQGCAiBIwkTB2JY2eF5AhiLTfrgncPn8zjGgPkrdrVd195j6v4oCEIdV7vQAQ+9sH8ehZFamgYjSArUBCgMxMmgQgIDA0I6WhuwYGMD7oJWz/4/sGCIQCJCoCxAMIggwLjA5MjY4MCoQCNzOCxAMIggwLjA5NTE1MDIQCNSTCxAMIggwLjA5MTM3MDoQCNSnCxAMIggwLjA5MjY1MEISCLr61o4VIgoyODMzOTY0NzAxSPncNVABYAFoAngBggESCLr61o4VIgoyODMzOTY0NzAxigEcCKD1tOSflXgQDCIQMjY0MjQ3ODMzLjk1OTc2MA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":8,"offset":1063352},"materializer_epoch":3,"latest_value_trailer_hex":"00000000001039b800000000000000038cac691a0e11304c57607fff69a6c6a7300b89d3befde55f01e3c17485ccb4b0","bar_row_b64":"AAAAAAAQObgAAAAAAAAAA4ysaRoOETBMV2B//2mmxqcwC4nTvv3lXwHjwXSFzLSwChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQV6NwRIEF3yGSIpCLuQ3bNDIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqKGJpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItMTJoLXByaW1hcnktdjJwAXgBgAHA+6CVs/+P7BiIAbT949jJ/4/sGJABtP3j2Mn/j+wYmAG0/ePYyf+P7BiiARsxNzkwMjA4MDAwMDAwOjE3OTAyNTExOTk5OTmoAcHDlt/ouhqyARNxZGwtcnVzdC1jb3JlLzIuMC4wugESYmluYW5jZS11c2RtLzIuMC4wygEg/mayzdoFRbssuriFSxyp9kEmq/YoKncwHkqf38BUH9vSASdiaW5hbmNlOlVTRE06RE9HRVVTRFQ6MTJoOjE3OTAyMDgwMDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgSMJEwdiWNnheQIYi0364J3D5/M4xoD5K3a1XdfeY+r+KAhCHVe70AEPvbB/HoWRWpoGI0gKwARCAgMDQjpaG7BgYwPuglbP/j+wYIhAIkKgLEAwiCDAuMDkyNjgwKhAI3M4LEAwiCDAuMDk1MTUwMhAI1JMLEAwiCDAuMDkxMzcwOhAI1KcLEAwiCDAuMDkyNjUwQhIIuvrWjhUiCjI4MzM5NjQ3MDFI+dw1UAFgAWgCeAGCARIIuvrWjhUiCjI4MzM5NjQ3MDGKARwIoPW05J+VeBAMIhAyNjQyNDc4MzMuOTU5NzYw","headers":{"LATEST":"{\"content_sha256\":\"8cac691a0e11304c57607fff69a6c6a7300b89d3befde55f01e3c17485ccb4b0\",\"event_id\":\"57a370448105df219222908bb90ddb34\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|12h\",\"materializer_epoch\":3,\"source\":{\"offset\":1063352,\"partition\":8,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"8cac691a0e11304c57607fff69a6c6a7300b89d3befde55f01e3c17485ccb4b0\",\"event_id\":\"57a370448105df219222908bb90ddb34\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|12h\",\"materializer_epoch\":3,\"open_time_ms\":1790208000000,\"revision\":0,\"source\":{\"offset\":1063352,\"partition\":8,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|12h","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|12h|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|12h|1790208000000|f0|8cac691a0e11304c"},"partitions":{"1":0,"3":2,"6":2,"12":2,"48":26}},
+ {"name":"bar-1m-final-okx","synthetic":false,"tag":"bar|1m|final","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8yokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFtLXByaW1hcnktdjJwAXgBgAGAgLS5q5uQ7BiIAZz0u7GOnZDsGJABnPS7sY6dkOwYmAGc9Luxjp2Q7BiiAQ8xNzkwMjUyMTYwMDAwOjGoAcH+4YW90huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBIDSlMS5P0e30ayzR5ShpTbD0BDqGlumet3jTw5Gu9vED0gEgM2Y2MWU2OTY4ZWE5NTBmYmFlZDQ5ZTlhNTRiYmNmZDnYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiB1Q6AXoZCQMBfDxqlJainVSLKXLOEdB2fQefKB/P+UcIoCED9h5paOqVD7rtSemlS7z9nSArYBCgIxbRCAgLS5q5uQ7BgYwKuU+4qdkOwYIg8I6pABEAoiBzAuMDkyNjkqDwjukAEQCiIHMC4wOTI3MTIPCOCQARAKIgcwLjA5MjY0Og8I6pABEAoiBzAuMDkyNjlCDgiUzAgQBCIGNzA0LjEwUAFgAWgCeAOCAREI0L/bBhACIgg3MDQxMDAuMIoBGgjAmOCh5vsCEBAiDjY1MjQ4Ljk2MDIwMDAwkgEOCJTMCBAEIgY3MDQuMTA=","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":9,"offset":1071271},"materializer_epoch":1,"latest_value_trailer_hex":"00000000001058a70000000000000001c0d5f7222d9965d5d33232bd2a2f5a1c8dfa9eec3cdf5584531edc0d4fd48c3f","bar_row_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICsgEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABYAFoAngDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw","headers":{"LATEST":"{\"content_sha256\":\"c0d5f7222d9965d5d33232bd2a2f5a1c8dfa9eec3cdf5584531edc0d4fd48c3f\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":1,\"source\":{\"offset\":1071271,\"partition\":9,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"c0d5f7222d9965d5d33232bd2a2f5a1c8dfa9eec3cdf5584531edc0d4fd48c3f\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":1,\"open_time_ms\":1790252160000,\"revision\":0,\"source\":{\"offset\":1071271,\"partition\":9,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","LEGACY_BAR":"{\"content_sha256\":\"c0d5f7222d9965d5d33232bd2a2f5a1c8dfa9eec3cdf5584531edc0d4fd48c3f\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"is_final\":true,\"legacy\":{\"spool_logical_offset\":22506,\"spool_partition_key\":\"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2\",\"spool_stream\":\"md.canonical.v2\"},\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":1,\"open_time_ms\":1790252160000,\"provenance\":\"legacy_import\",\"revision\":0}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|1790252160000|f0|c0d5f7222d9965d5"},"partitions":{"1":0,"3":1,"6":4,"12":4,"48":40}},
+ {"name":"bar-3m-final-binance","synthetic":false,"tag":"bar|3m|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-3m-primary-v2","spool_offset":14634,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQmlZN7Kek4TeooU9Xg8Ao2CokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0zbS1wcmltYXJ5LXYycAF4AYABwMvZ9suZkOwYiAHtiomw5ZmQ7BiQAe2KibDlmZDsGJgB7YqJsOWZkOwYogEbMTc5MDI1MTkyMDAwMDoxNzkwMjUyMDk5OTk5qAGBotrPv50tsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIJ52yZcom18IObRKjZg5/hvCHbxbSlvU4yXlqInhYQV00gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjNtOjE3OTAyNTE5MjAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgTO+ZcpX8pps3Po4tOLI7SmcYndnP6TTeHumaj6QVGOuKAhBzRdhW8pabLhWYuwv+FPw70gKnAQoCM20QgMC+sK2UkOwYGMDL2fbLmZDsGCIQCMSpCxAMIggwLjA5Mjc3MCoQCNyrCxAMIggwLjA5MjkxMDIQCMCnCxAMIggwLjA5MjY0MDoQCKSoCxAMIggwLjA5MjY5MEIOCNy13gYiBzcwNjQ5NDJImhhQAWABaAJ4AYIBDgjctd4GIgc3MDY0OTQyigEYCLzwy9OTJhAMIg02NTU0NzIuODE5MjMw","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":10,"offset":1079190},"materializer_epoch":2,"latest_value_trailer_hex":"00000000001077960000000000000002693fcd3db4d009265dacb650a8759dac23140ada05576d5a0a8536b69eb2b808","bar_row_b64":"AAAAAAAQd5YAAAAAAAAAAmk/zT200AkmXay2UKh1nawjFAraBVdtWgqFNraesrgIChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQmlZN7Kek4TeooU9Xg8Ao2DIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItM20tcHJpbWFyeS12MnABeAGAAcDL2fbLmZDsGIgB7YqJsOWZkOwYkAHtiomw5ZmQ7BiYAe2KibDlmZDsGKIBGzE3OTAyNTE5MjAwMDA6MTc5MDI1MjA5OTk5OagBgaLaz7+dLbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASCedsmXKJtfCDm0So2YOf4bwh28W0pb1OMl5aiJ4WEFdNIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDozbToxNzkwMjUxOTIwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3OTAxNDI3OTQ3NzUwOTk2OTnoAbPyrZ6yrPfrGPABAfgBAYICIEzvmXKV/KabNz6OLTiyO0pnGJ3Zz+k03h7pmo+kFRjrigIQc0XYVvKWmy4VmLsL/hT8O9ICowEQgMC+sK2UkOwYGMDL2fbLmZDsGCIQCMSpCxAMIggwLjA5Mjc3MCoQCNyrCxAMIggwLjA5MjkxMDIQCMCnCxAMIggwLjA5MjY0MDoQCKSoCxAMIggwLjA5MjY5MEIOCNy13gYiBzcwNjQ5NDJImhhQAWABaAJ4AYIBDgjctd4GIgc3MDY0OTQyigEYCLzwy9OTJhAMIg02NTU0NzIuODE5MjMw","headers":{"LATEST":"{\"content_sha256\":\"693fcd3db4d009265dacb650a8759dac23140ada05576d5a0a8536b69eb2b808\",\"event_id\":\"9a564deca7a4e137a8a14f5783c028d8\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3m\",\"materializer_epoch\":2,\"source\":{\"offset\":1079190,\"partition\":10,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"693fcd3db4d009265dacb650a8759dac23140ada05576d5a0a8536b69eb2b808\",\"event_id\":\"9a564deca7a4e137a8a14f5783c028d8\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3m\",\"materializer_epoch\":2,\"open_time_ms\":1790251920000,\"revision\":0,\"source\":{\"offset\":1079190,\"partition\":10,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3m","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3m|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|3m|1790251920000|f0|693fcd3db4d00926"},"partitions":{"1":0,"3":1,"6":4,"12":10,"48":46}},
+ {"name":"bar-5m-final-okx","synthetic":false,"tag":"bar|5m|final","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-5m-primary-v2","spool_offset":13070,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|5m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQIdQy/oGJrBgArsEvgBvkziokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTVtLXByaW1hcnktdjJwAXgBgAGA4IOs7pCQ7BiIAZa5n7fQmZDsGJABlrmft9CZkOwYmAGWuZ+30JmQ7BiiAQ8xNzkwMjUxODAwMDAwOjGoAYHfjcad0huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBICh+Y8wUARJJcKoc8PmHgLGloFGeVbPslrPCdWSYPA920gEgMzI0ODNlMmJmMDRjMzhiNmY0ODRjM2NjY2VjNjdjMzHYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiAZY2B9ZwC+wIhq1mDiUoHtcAd6oNtoJe9tB/zerodoD4oCEDJIPivwTDi29ITDzM7GfDHSAr0BCgI1bRCA4IOs7pCQ7BgYwMvZ9suZkOwYIg8I7pABEAoiBzAuMDkyNzEqDwiUkQEQCiIHMC4wOTI5MDIPCOCQARAKIgcwLjA5MjY0Og8I7JABEAoiBzAuMDkyNzBCEAiGtn4QBCIIMTAzNTYuNTFQAWABaAJ4A4IBEwjYnOJiEAIiCjEwMzU2NTEwLjCKARsIgO/J2PHYKxAQIg85NjA4NTAuODc5NjAwMDCSARAIhrZ+EAQiCDEwMzU2LjUx","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":11,"offset":1087109},"materializer_epoch":3,"latest_value_trailer_hex":"000000000010968500000000000000038cf7323e623d21728e4ba257bf8c41aac27e814e3ad62d2b412dd60a321538ed","bar_row_b64":"AAAAAAAQloUAAAAAAAAAA4z3Mj5iPSFyjkuiV7+MQarCfoFOOtYtK0Et1goyFTjtChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQIdQy/oGJrBgArsEvgBvkzjIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItNW0tcHJpbWFyeS12MnABeAGAAYDgg6zukJDsGIgBlrmft9CZkOwYkAGWuZ+30JmQ7BiYAZa5n7fQmZDsGKIBDzE3OTAyNTE4MDAwMDA6MagBgd+Nxp3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgKH5jzBQBEklwqhzw+YeAsaWgUZ5Vs+yWs8J1ZJg8D3bSASAzMjQ4M2UyYmYwNGMzOGI2ZjQ4NGMzY2NjZWM2N2MzMdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIBljYH1nAL7AiGrWYOJSge1wB3qg22gl720H/N6uh2gPigIQMkg+K/BMOLb0hMPMzsZ8MdICuQEQgOCDrO6QkOwYGMDL2fbLmZDsGCIPCO6QARAKIgcwLjA5MjcxKg8IlJEBEAoiBzAuMDkyOTAyDwjgkAEQCiIHMC4wOTI2NDoPCOyQARAKIgcwLjA5MjcwQhAIhrZ+EAQiCDEwMzU2LjUxUAFgAWgCeAOCARMI2JziYhACIgoxMDM1NjUxMC4wigEbCIDvydjx2CsQECIPOTYwODUwLjg3OTYwMDAwkgEQCIa2fhAEIggxMDM1Ni41MQ==","headers":{"LATEST":"{\"content_sha256\":\"8cf7323e623d21728e4ba257bf8c41aac27e814e3ad62d2b412dd60a321538ed\",\"event_id\":\"21d432fe8189ac1800aec12f801be4ce\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|5m\",\"materializer_epoch\":3,\"source\":{\"offset\":1087109,\"partition\":11,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"8cf7323e623d21728e4ba257bf8c41aac27e814e3ad62d2b412dd60a321538ed\",\"event_id\":\"21d432fe8189ac1800aec12f801be4ce\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|5m\",\"materializer_epoch\":3,\"open_time_ms\":1790251800000,\"revision\":0,\"source\":{\"offset\":1087109,\"partition\":11,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|5m","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|5m|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|5m|1790251800000|f0|8cf7323e623d2172"},"partitions":{"1":0,"3":1,"6":4,"12":4,"48":16}},
+ {"name":"bar-15m-final-binance","synthetic":false,"tag":"bar|15m|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-15m-primary-v2","spool_offset":11037,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|15m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQU0mY9vTXfhn1IKx96tW0ZiokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGooYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0xNW0tcHJpbWFyeS12MnABeAGAAcDL2fbLmZDsGIgB4trzw+WZkOwYkAHi2vPD5ZmQ7BiYAeLa88PlmZDsGKIBGzE3OTAyNTEyMDAwMDA6MTc5MDI1MjA5OTk5OagBwZ2dz7+dLbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASCbbjC3H9V9PukYu+zjHpfPcUovgX8eJaPMvAXKi85RQNIBJ2JpbmFuY2U6VVNETTpET0dFVVNEVDoxNW06MTc5MDI1MTIwMDAwMNgBEeIBMnFkbC12Mi1zdGFibGUtYmluYW5jZS1yZXN0LXIxLWcxNzkwMTQyNzk0Nzc1MDk5Njk56AGz8q2esqz36xjwAQH4AQGCAiCpZzAkDL64W7E3gu/79ry1kfNlu73S+xDP2kKOkLZYR4oCEMJGcqRqvKJSq+99xLPGg+vSAqwBCgMxNW0QgIDelbP/j+wYGMDL2fbLmZDsGCIQCNSnCxAMIggwLjA5MjY1MCoQCNyrCxAMIggwLjA5MjkxMDIQCNSiCxAMIggwLjA5MjMzMDoQCKSoCxAMIggwLjA5MjY5MEIPCKiijCgiCDQyMDQzNTQwSMt+UAFgAWgCeAGCAQ8IqKKMKCIINDIwNDM1NDCKARoI/MSP8NDiARAMIg4zODkzNTA1LjQyMTYzMA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":1095028},"materializer_epoch":1,"latest_value_trailer_hex":"000000000010b57400000000000000011d14bea68e5902a40b0b6e008a6c026d701010bb4f7ef2c73abd709bb5b0b6dd","bar_row_b64":"AAAAAAAQtXQAAAAAAAAAAR0UvqaOWQKkCwtuAIpsAm1wEBC7T37yxzq9cJu1sLbdChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQU0mY9vTXfhn1IKx96tW0ZjIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqKGJpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItMTVtLXByaW1hcnktdjJwAXgBgAHAy9n2y5mQ7BiIAeLa88PlmZDsGJAB4trzw+WZkOwYmAHi2vPD5ZmQ7BiiARsxNzkwMjUxMjAwMDAwOjE3OTAyNTIwOTk5OTmoAcGdnc+/nS2yARNxZGwtcnVzdC1jb3JlLzIuMC4wugESYmluYW5jZS11c2RtLzIuMC4wygEgm24wtx/VfT7pGLvs4x6Xz3FKL4F/HiWjzLwFyovOUUDSASdiaW5hbmNlOlVTRE06RE9HRVVTRFQ6MTVtOjE3OTAyNTEyMDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc5MDE0Mjc5NDc3NTA5OTY5OegBs/KtnrKs9+sY8AEB+AEBggIgqWcwJAy+uFuxN4Lv+/a8tZHzZbu90vsQz9pCjpC2WEeKAhDCRnKkaryiUqvvfcSzxoPr0gKnARCAgN6Vs/+P7BgYwMvZ9suZkOwYIhAI1KcLEAwiCDAuMDkyNjUwKhAI3KsLEAwiCDAuMDkyOTEwMhAI1KILEAwiCDAuMDkyMzMwOhAIpKgLEAwiCDAuMDkyNjkwQg8IqKKMKCIINDIwNDM1NDBIy35QAWABaAJ4AYIBDwiooowoIgg0MjA0MzU0MIoBGgj8xI/w0OIBEAwiDjM4OTM1MDUuNDIxNjMw","headers":{"LATEST":"{\"content_sha256\":\"1d14bea68e5902a40b0b6e008a6c026d701010bb4f7ef2c73abd709bb5b0b6dd\",\"event_id\":\"534998f6f4d77e19f520ac7dead5b466\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|15m\",\"materializer_epoch\":1,\"source\":{\"offset\":1095028,\"partition\":0,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"1d14bea68e5902a40b0b6e008a6c026d701010bb4f7ef2c73abd709bb5b0b6dd\",\"event_id\":\"534998f6f4d77e19f520ac7dead5b466\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|15m\",\"materializer_epoch\":1,\"open_time_ms\":1790251200000,\"revision\":0,\"source\":{\"offset\":1095028,\"partition\":0,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|15m","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|15m|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|15m|1790251200000|f0|1d14bea68e5902a4"},"partitions":{"1":0,"3":0,"6":0,"12":0,"48":12}},
+ {"name":"bar-30m-final-okx","synthetic":false,"tag":"bar|30m|final","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-30m-primary-v2","spool_offset":10396,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|30m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQEKI5f1D9/lyKrauGXiyhJCokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGoqb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTMwbS1wcmltYXJ5LXYycAF4AYABgODs0oHLj+wYiAG9mqPet/+P7BiQAb2ao963/4/sGJgBvZqj3rf/j+wYogEPMTc5MDI0OTQwMDAwMDoxqAGB3YaN2bZasgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBDG9reC12NS8yLjAuMMIBAQnKASDatQYSLeSVsAcaohFfpF5qeE8N76xiK1XbUCUQBMgt+NIBIDg0MGMyNjk2OGY4YjViZjcwYzQ1ODU2MDdiMmRhOTYy2AEQ4gEnb2t4LWJ1c2luZXNzLTAwMS00OC0xNzkwMjQ1MjgzMDU2OTIzODA26AEw8AEB+AEBggIg5AEbTRWZb0Ksm6MKWuYWHwhV4YXMNysmSE9UgIQ7DAWKAhCEDCaWj4tb9wxFhWB7Lali0gLDAQoDMzBtEIDg7NKBy4/sGBjA+6CVs/+P7BgiDwjskAEQCiIHMC4wOTI3MCoPCPyQARAKIgcwLjA5Mjc4Mg8IuJABEAoiBzAuMDkyNDQ6DwjmkAEQCiIHMC4wOTI2N0IRCNjVyAUQBCIINTgzODEuODhQAWABaAJ4A4IBFAjg+OKsBBACIgo1ODM4MTg4MC4wigEdCICl+K7h7vUBEBAiEDU0MDY2MzUuNTE1NjAwMDCSAREI2NXIBRAEIgg1ODM4MS44OA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":1,"offset":1102947},"materializer_epoch":2,"latest_value_trailer_hex":"000000000010d4630000000000000002322d25293a24a3478fab6ec54ca30cf8d8bd9d21ccacef6bea6f013408353ca4","bar_row_b64":"AAAAAAAQ1GMAAAAAAAAAAjItJSk6JKNHj6tuxUyjDPjYvZ0hzKzva+pvATQINTykChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQEKI5f1D9/lyKrauGXiyhJDIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUaipva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMzBtLXByaW1hcnktdjJwAXgBgAGA4OzSgcuP7BiIAb2ao963/4/sGJABvZqj3rf/j+wYmAG9mqPet/+P7BiiAQ8xNzkwMjQ5NDAwMDAwOjGoAYHdho3ZtlqyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBINq1BhIt5JWwBxqiEV+kXmp4Tw3vrGIrVdtQJRAEyC340gEgODQwYzI2OTY4ZjhiNWJmNzBjNDU4NTYwN2IyZGE5NjLYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiDkARtNFZlvQqybowpa5hYfCFXhhcw3KyZIT1SAhDsMBYoCEIQMJpaPi1v3DEWFYHstqWLSAr4BEIDg7NKBy4/sGBjA+6CVs/+P7BgiDwjskAEQCiIHMC4wOTI3MCoPCPyQARAKIgcwLjA5Mjc4Mg8IuJABEAoiBzAuMDkyNDQ6DwjmkAEQCiIHMC4wOTI2N0IRCNjVyAUQBCIINTgzODEuODhQAWABaAJ4A4IBFAjg+OKsBBACIgo1ODM4MTg4MC4wigEdCICl+K7h7vUBEBAiEDU0MDY2MzUuNTE1NjAwMDCSAREI2NXIBRAEIgg1ODM4MS44OA==","headers":{"LATEST":"{\"content_sha256\":\"322d25293a24a3478fab6ec54ca30cf8d8bd9d21ccacef6bea6f013408353ca4\",\"event_id\":\"10a2397f50fdfe5c8aadab865e2ca124\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|30m\",\"materializer_epoch\":2,\"source\":{\"offset\":1102947,\"partition\":1,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"322d25293a24a3478fab6ec54ca30cf8d8bd9d21ccacef6bea6f013408353ca4\",\"event_id\":\"10a2397f50fdfe5c8aadab865e2ca124\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|30m\",\"materializer_epoch\":2,\"open_time_ms\":1790249400000,\"revision\":0,\"source\":{\"offset\":1102947,\"partition\":1,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|30m","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|30m|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|30m|1790249400000|f0|322d25293a24a347"},"partitions":{"1":0,"3":2,"6":2,"12":2,"48":2}},
+ {"name":"bar-1w-final-binance","synthetic":false,"tag":"bar|1w|final","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/bar/binance-usdm-dogeusdt-bar-1w-primary-v2","spool_offset":157,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1w","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ3NasE/DhBXLhJdjwPOAdMSokOGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhMiBCSU5BTkNFLlVTRE0uUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgdCSU5BTkNFSgRVU0RNUglQRVJQRVRVQUxaCERPR0VVU0RUYg5CSU5BTkNFX0RJUkVDVGonYmluYW5jZS11c2RtLWRvZ2V1c2R0LWJhci0xdy1wcmltYXJ5LXYycAF4AYABwPvOsLOey+sYiAHSiKHvyp7L6xiQAdKIoe/KnsvrGJgB0oih78qey+sYogEbMTc4OTM0NDAwMDAwMDoxNzg5OTQ4Nzk5OTk5qAGBmZnwvvsjsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBILIInbedRfWXa+H8KGIopGac19QXwdS7Mkaj8OM+9G/e0gEmYmluYW5jZTpVU0RNOkRPR0VVU0RUOjF3OjE3ODkzNDQwMDAwMDDYARHiATJxZGwtdjItc3RhYmxlLWJpbmFuY2UtcmVzdC1yMS1nMTc4OTgwNjU4MzczNDc1MTU1NOgBwqKpwa7zqusY8AEB+AEBggIghDEEZf8m2ErImFz2hpvwNrBmk6whpDRTQn/dhaxT5T2KAhBIB/UC9hY4QyF/uqH5Cyve0gK7AQoCMXcQgIDo57PcweoYGMD7zrCznsvrGCIQCPCGChAMIggwLjA4MjM2MCoQCNySCxAMIggwLjA5MTMxMDIQCJDHCRAMIggwLjA3ODI4MDoQCKTTChAMIggwLjA4NzI1MEIUCNLAmtWeAiILMzg0NzU2MTYyOTdI1d6RBFABYAFoAngBggEUCNLAmtWeAiILMzg0NzU2MTYyOTeKAR4IjM3tp7jovgsQDCIRMzIzNDM1ODQ1MC4wNDE2NzA=","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":2,"offset":1110866},"materializer_epoch":3,"latest_value_trailer_hex":"000000000010f3520000000000000003e6c6e4ed605260e7737267e227f7227dcd9cb94f93e635307d7250909a0fab89","bar_row_b64":"AAAAAAAQ81IAAAAAAAAAA+bG5O1gUmDnc3Jn4if3In3NnLlPk+Y1MH1yUJCaD6uJChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ3NasE/DhBXLhJdjwPOAdMTIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJ2JpbmFuY2UtdXNkbS1kb2dldXNkdC1iYXItMXctcHJpbWFyeS12MnABeAGAAcD7zrCznsvrGIgB0oih78qey+sYkAHSiKHvyp7L6xiYAdKIoe/KnsvrGKIBGzE3ODkzNDQwMDAwMDA6MTc4OTk0ODc5OTk5OagBgZmZ8L77I7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASCyCJ23nUX1l2vh/ChiKKRmnNfUF8HUuzJGo/DjPvRv3tIBJmJpbmFuY2U6VVNETTpET0dFVVNEVDoxdzoxNzg5MzQ0MDAwMDAw2AER4gEycWRsLXYyLXN0YWJsZS1iaW5hbmNlLXJlc3QtcjEtZzE3ODk4MDY1ODM3MzQ3NTE1NTToAcKiqcGu86rrGPABAfgBAYICIIQxBGX/JthKyJhc9oab8DawZpOsIaQ0U0J/3YWsU+U9igIQSAf1AvYWOEMhf7qh+Qsr3tICtwEQgIDo57PcweoYGMD7zrCznsvrGCIQCPCGChAMIggwLjA4MjM2MCoQCNySCxAMIggwLjA5MTMxMDIQCJDHCRAMIggwLjA3ODI4MDoQCKTTChAMIggwLjA4NzI1MEIUCNLAmtWeAiILMzg0NzU2MTYyOTdI1d6RBFABYAFoAngBggEUCNLAmtWeAiILMzg0NzU2MTYyOTeKAR4IjM3tp7jovgsQDCIRMzIzNDM1ODQ1MC4wNDE2NzA=","headers":{"LATEST":"{\"content_sha256\":\"e6c6e4ed605260e7737267e227f7227dcd9cb94f93e635307d7250909a0fab89\",\"event_id\":\"dcd6ac13f0e10572e125d8f03ce01d31\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1w\",\"materializer_epoch\":3,\"source\":{\"offset\":1110866,\"partition\":2,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"e6c6e4ed605260e7737267e227f7227dcd9cb94f93e635307d7250909a0fab89\",\"event_id\":\"dcd6ac13f0e10572e125d8f03ce01d31\",\"is_final\":true,\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1w\",\"materializer_epoch\":3,\"open_time_ms\":1789344000000,\"revision\":0,\"source\":{\"offset\":1110866,\"partition\":2,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1w","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1w|floor","bar":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BAR|1w|1789344000000|f0|e6c6e4ed605260e7"},"partitions":{"1":0,"3":0,"6":0,"12":0,"48":36}},
+ {"name":"trade-binance","synthetic":false,"tag":"trade","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/trade/binance-usdm-dogeusdt-trade-primary-v2","spool_offset":16984739,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|TRADE|-","canonical_b64":"ChRxZGwubWFya2V0ZGF0YS50cmFkZRACIhA64he3+u5sQLzJruT8o73wKiQ4YWVkZDM0OS02OTk5LTU4NzQtYjBkZC0zNGM2NDUxYzBiM2EyIEJJTkFOQ0UuVVNETS5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCB0JJTkFOQ0VKBFVTRE1SCVBFUlBFVFVBTFoIRE9HRVVTRFRiDkJJTkFOQ0VfRElSRUNUaiZiaW5hbmNlLXVzZG0tZG9nZXVzZHQtdHJhZGUtcHJpbWFyeS12MnABeAGAAYCU+prjnZDsGIgBxZPip+OdkOwYkAHFk+Kn452Q7BiYAcWT4qfjnZDsGKIBCjM0ODUzNDk0NjWoAcG//bHwnS2yARNxZGwtcnVzdC1jb3JlLzIuMC4wugESYmluYW5jZS11c2RtLzIuMC4wygEgtiOo7VG2jK7FgeAAIAC29QnLx/RsU9+yyWLD9JkRi2nSASAwODYxNTQ3NmVkNzYzY2JkOGY2YjgxNGUxNzdjYTg1MtgBEeIBM2JpbmFuY2UtVVNETS1wdWJsaWMtdHJhZGUtMDAxLTUtMTc4OTgwNjExNjg5NzkxMjI3OOgBBfABAfgBAYICIACwlX9WnPqKku2M+wzucotjk0P34+Mmb/MWqL6U2yz+igIQCGFUdu12PL2Pa4FOF3yoUsICLwoKMzQ4NTM0OTQ2NRIQCKSoCxAMIggwLjA5MjY5MBoHCLABIgI4OCACMAE4AUAB","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":3,"offset":1118785},"materializer_epoch":1,"latest_value_trailer_hex":"00000000001112410000000000000001957cb5ba80f9b3e9fdca52092a449684fa38ff90b2dcb016ffea426dbb6a9380","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"957cb5ba80f9b3e9fdca52092a449684fa38ff90b2dcb016ffea426dbb6a9380\",\"event_id\":\"3ae217b7faee6c40bcc9aee4fca3bdf0\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|TRADE|-\",\"materializer_epoch\":1,\"source\":{\"offset\":1118785,\"partition\":3,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|TRADE|-","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|TRADE|-|floor"},"partitions":{"1":0,"3":1,"6":4,"12":4,"48":4}},
+ {"name":"trade-okx","synthetic":false,"tag":"trade","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/trade/okx-swap-doge-usdt-swap-trade-primary-v2","spool_offset":2331852,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","canonical_b64":"ChRxZGwubWFya2V0ZGF0YS50cmFkZRACIhAkdLbhoi2xstekVtWuxsbJKiQ2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcyHE9LWC5TV0FQLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIDT0tYSgRTV0FQUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUaihva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC10cmFkZS1wcmltYXJ5LXYycAF4AYABwL2rwNKdkOwYiAGZsZTQ0p2Q7BiQAZmxlNDSnZDsGJgBmbGU0NKdkOwYogEKMTM1MjAyMTg5OKgBwcmT9e6dLbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDKASALSrSXH6JmnaRrR4U+JQtxc3mzBb1FZVcjtg7NhSiwetIBIDNmZDRiZjQxYWUwNzA2MmQxZGRjMThkOTdjNzUwM2Qz2AEQ4gElb2t4LXB1YmxpYy0wMDItOTItMTc5MDI0MzI4MTczNjA5NjcwM+gBXPABAfgBAYICIFGzZ9k79d+g6WD8OC974npcTQ/jzozmEI0TQ6qrtx1UigIQP9S/Qa4HBi0d3BjZfHUD08ICLwoKMTM1MjAyMTg5OBIPCOqQARAKIgcwLjA5MjY5GgoIHBAEIgQwLjE0IAE4A0AB","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":4,"offset":1126704},"materializer_epoch":2,"latest_value_trailer_hex":"00000000001131300000000000000002cadf50e452ec9961285d280a7e45bdac6094c0d7d3b9147346d14b550daef774","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"cadf50e452ec9961285d280a7e45bdac6094c0d7d3b9147346d14b550daef774\",\"event_id\":\"2474b6e1a22db1b2d7a456d5aec6c6c9\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-\",\"materializer_epoch\":2,\"source\":{\"offset\":1126704,\"partition\":4,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-|floor"},"partitions":{"1":0,"3":2,"6":2,"12":2,"48":2}},
+ {"name":"quote-binance","synthetic":false,"tag":"quote","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/quote/binance-usdm-dogeusdt-quote-primary-v2","spool_offset":8948286,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|QUOTE|-","canonical_b64":"ChRxZGwubWFya2V0ZGF0YS5xdW90ZRACIhCt+KsiktFJq+qYC1VbmURNKiQ4YWVkZDM0OS02OTk5LTU4NzQtYjBkZC0zNGM2NDUxYzBiM2EyIEJJTkFOQ0UuVVNETS5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCB0JJTkFOQ0VKBFVTRE1SCVBFUlBFVFVBTFoIRE9HRVVTRFRiDkJJTkFOQ0VfRElSRUNUaiZiaW5hbmNlLXVzZG0tZG9nZXVzZHQtcXVvdGUtcHJpbWFyeS12MnABeAGAAYCtnqXknZDsGIgBm/aBsuSdkOwYkAGb9oGy5J2Q7BiYAZv2gbLknZDsGKIBDjExNjQ2MDAwMTA0ODQ3qAGBm4WK3uwYsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBIPdvnH8w3Mnj3641O/7NvX9lovmIBgMsXZy700ot6TEW0gEgY2ZiY2IxMjY2ZWI2OGJhM2RkNDcxNTA4ZTYxYTlmOTDYARHiATNiaW5hbmNlLVVTRE0tcHVibGljLXF1b3RlLTAwMS01LTE3OTAwNjY5ODg5NTU4NjEyNjXoAQXwAQH4AQGCAiBaTysB+rEx5eEWE3G39RAPQt0MtNA7QJNxLU0Z3Kw5TooCEM+8sSZutouj3UcVCOYan5DKAkMKEAikqAsQDCIIMC4wOTI2OTASDAjcghIiBjE0NzYzMBoQCLioCxAMIggwLjA5MjcwMCILCJ6RBiIFNTAyNTUoATAB","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":5,"offset":1134623},"materializer_epoch":3,"latest_value_trailer_hex":"000000000011501f00000000000000035f9cd33403b7e7786ba445890c0121e6b72cd943934251382dba50f601ae4fa2","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"5f9cd33403b7e7786ba445890c0121e6b72cd943934251382dba50f601ae4fa2\",\"event_id\":\"adf8ab2292d149abea980b555b99444d\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|QUOTE|-\",\"materializer_epoch\":3,\"source\":{\"offset\":1134623,\"partition\":5,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|QUOTE|-","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|QUOTE|-|floor"},"partitions":{"1":0,"3":0,"6":0,"12":6,"48":30}},
+ {"name":"quote-okx","synthetic":false,"tag":"quote","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/quote/okx-swap-doge-usdt-swap-quote-primary-v2","spool_offset":7620792,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|QUOTE|-","canonical_b64":"ChRxZGwubWFya2V0ZGF0YS5xdW90ZRACIhDORs7LO/MltiMwBdmRFWumKiQ2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcyHE9LWC5TV0FQLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIDT0tYSgRTV0FQUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUaihva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1xdW90ZS1wcmltYXJ5LXYycAF4AYABgPPc492dkOwYiAH8j4bx3Z2Q7BiQAfyPhvHdnZDsGJgB/I+G8d2dkOwYogELODU4NTY5NDg1NjCoAcGdrMrC0huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wygEgmURrkRgR6b0KQm1bqh0PwsJT14rnrUd2aYCKbUSORV7SASAxYjMyMzUwYTc1ODBkNjVlZmRkNjMyNTZmNTJjYjkwNtgBEOIBJm9reC1wdWJsaWMtMDAzLTEwNC0xNzkwMjQ3ODEzNjI1OTMwMjA46AFo8AEB+AEBggIgJ1uuxKIeXcpYCnc3BYOK6ZBlYKcVJp2ZR7uUoJjXG2SKAhAbMjUKdYDWXv3WMlb1LLkGygJBCg8I6pABEAoiBzAuMDkyNjkSCwjABBAEIgQyLjg4Gg0Ivg4QCCIGMC4wOTI3Ig4InLoDEAQiBjI4My4wMigBMAM=","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":6,"offset":1142542},"materializer_epoch":1,"latest_value_trailer_hex":"0000000000116f0e0000000000000001cf4b41c8ca615f19e14200102e00bb6076a22f94a0b5e051df933f9687e116a8","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"cf4b41c8ca615f19e14200102e00bb6076a22f94a0b5e051df933f9687e116a8\",\"event_id\":\"ce46cecb3bf325b6233005d991156ba6\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|QUOTE|-\",\"materializer_epoch\":1,\"source\":{\"offset\":1142542,\"partition\":6,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|QUOTE|-","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|QUOTE|-|floor"},"partitions":{"1":0,"3":2,"6":2,"12":2,"48":2}},
+ {"name":"mark_index_price-binance","synthetic":false,"tag":"mark_index_price","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/mark_index_price/binance-usdm-dogeusdt-mark_index_price-primary-v2","spool_offset":526871,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|MARK_INDEX_PRICE|-","canonical_b64":"Ch9xZGwubWFya2V0ZGF0YS5tYXJrX2luZGV4X3ByaWNlEAIiEO9Y8rCydmsNB1TiFM01CEMqJDhhZWRkMzQ5LTY5OTktNTg3NC1iMGRkLTM0YzY0NTFjMGIzYTIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIHQklOQU5DRUoEVVNETVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqMWJpbmFuY2UtdXNkbS1kb2dldXNkdC1tYXJrX2luZGV4X3ByaWNlLXByaW1hcnktdjJwAXgBgAGAkN2v5J2Q7BiIAbr6+tbknZDsGJABuvr61uSdkOwYmAG6+vrW5J2Q7BiiAYUBMTc5MDI1MjI0NDAwMDoxNzkwMjUyMjQ0MDAwOjE3OTAyNTIyNDQwODIyNzc2OTA6MTc5MDI1MjI0NDA4MjI3NzY5MDoxYjcwNjY4MGJmZWZiZDYwOWQ2MjcyY2NhZDNmYzA4NjoxYjcwNjY4MGJmZWZiZDYwOWQ2MjcyY2NhZDNmYzA4NqgB1YYZsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBEmJpbmFuY2UtdXNkbS8yLjAuMMoBINaaW6arLPY2keSRRRZEx7o21gr9pV2McTu7clPW7Xf90gEgN2U1ZGFjYjZkZDZlMmZlZDY2MzQwZDVjMjljMGZmZDLYARHiATdiaW5hbmNlLVVTRE0tbWFya2V0LW1hcmtpbmRleC0wMDEtNC0xNzg5ODA2MTE2OTE3ODAyNTM06AEE8AEB+AEBggIgdBxFAMeAaWYJAl7iY1xtYzt4Br9yU5af3k1Apj/1ZgmKAhB+Xay23W4v7WY0DVwpwP/S+gIqChMIkLzrCBAQIgowLjA5MjY5MDAwEhMI/IfsCBAQIgowLjA5MjczODU0","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":7,"offset":1150461},"materializer_epoch":2,"latest_value_trailer_hex":"0000000000118dfd00000000000000023d7a74dbae1969c6cce41e75d563bfea8c08fb70600d7ec60637a8bd46bbb6e6","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"3d7a74dbae1969c6cce41e75d563bfea8c08fb70600d7ec60637a8bd46bbb6e6\",\"event_id\":\"ef58f2b0b2766b0d0754e214cd350843\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|MARK_INDEX_PRICE|-\",\"materializer_epoch\":2,\"source\":{\"offset\":1150461,\"partition\":7,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|MARK_INDEX_PRICE|-","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|MARK_INDEX_PRICE|-|floor"},"partitions":{"1":0,"3":0,"6":3,"12":3,"48":39}},
+ {"name":"mark_index_price-okx","synthetic":false,"tag":"mark_index_price","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/mark_index_price/okx-swap-doge-usdt-swap-mark_index_price-primary-v2","spool_offset":4878580,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|MARK_INDEX_PRICE|-","canonical_b64":"Ch9xZGwubWFya2V0ZGF0YS5tYXJrX2luZGV4X3ByaWNlEAIiEN/7hDh7uxx37Y6lgEpM5HwqJDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjNzIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgNPS1hKBFNXQVBSCVBFUlBFVFVBTFoORE9HRS1VU0RULVNXQVBiCk9LWF9ESVJFQ1RqM29reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLW1hcmtfaW5kZXhfcHJpY2UtcHJpbWFyeS12MnABeAGAAcCspMvZnZDsGIgBsPbTh9qdkOwYkAGnjdj43p2Q7BiYAaeN2PjenZDsGKIBhQExNzkwMjUyMjQyNTA0OjE3OTAyNTIyNDExMDU6MTc5MDI1MjI0MjU0MjM5NzA5NToxNzkwMjUyMjQxMjMxNjA4NjI0OjM5OTI0ZjJkZmY0MzAwODdkYjhhODk0ZjQ3NDNiN2RlOjhkOGE0NTYwMTZmNGRhMzVjYTc3MDNiNTM2OGY0MWNiqAHL8LUBsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBDG9reC12NS8yLjAuMMoBIE0n6snu5LYrDj/0SRKIAPvO8I4j/KifGoeaewqYVYF70gEgOWQ2N2JmNWRmNzYxOGYzYTBkY2I3YmNmNGYwOWM5N2LYARDiASVva3gtcHVibGljLTAwNC02NC0xNzkwMjQ0MTMyODY3MjU1Mzc26AFA8AEB+AEBggIg+PgOFIN3rEI7ojMyX0yZjFeBxfSCjxVKrmUKLiISeVeKAhCdZ79d92GPOg3Le89PCcl7+gIiCg8I6JABEAoiBzAuMDkyNjgSDwjwkAEQCiIHMC4wOTI3Mg==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":8,"offset":1158380},"materializer_epoch":3,"latest_value_trailer_hex":"000000000011acec0000000000000003324e37e45a1e7a80fc28f2aad9d26c9131217eea58783a60fceb814bcf782a27","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"324e37e45a1e7a80fc28f2aad9d26c9131217eea58783a60fceb814bcf782a27\",\"event_id\":\"dffb84387bbb1c77ed8ea5804a4ce47c\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|MARK_INDEX_PRICE|-\",\"materializer_epoch\":3,\"source\":{\"offset\":1158380,\"partition\":8,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|MARK_INDEX_PRICE|-","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|MARK_INDEX_PRICE|-|floor"},"partitions":{"1":0,"3":2,"6":5,"12":11,"48":35}},
+ {"name":"book_delta-binance","synthetic":false,"tag":"book_delta","venue":"BINANCE","spool_stream":"md.canonical.v2","spool_partition_key":"8aedd349-6999-5874-b0dd-34c6451c0b3a/book/binance-usdm-dogeusdt-book-primary-v2","spool_offset":7002161,"lpk":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BOOK_DELTA|-","canonical_b64":"ChlxZGwubWFya2V0ZGF0YS5ib29rX2RlbHRhEAIiEN5ag40Hh5gJyllL9Qhs7o0qJDhhZWRkMzQ5LTY5OTktNTg3NC1iMGRkLTM0YzY0NTFjMGIzYTIgQklOQU5DRS5VU0RNLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIHQklOQU5DRUoEVVNETVIJUEVSUEVUVUFMWghET0dFVVNEVGIOQklOQU5DRV9ESVJFQ1RqJWJpbmFuY2UtdXNkbS1kb2dldXNkdC1ib29rLXByaW1hcnktdjJwAXgBgAGAoIe55Z2Q7BiIAbSZysXlnZDsGJABtJnKxeWdkOwYmAG0mcrF5Z2Q7BiiARFnNDoxMTY0NjAwMDEzODM0MKgBgYG+xvCdLbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6ARJiaW5hbmNlLXVzZG0vMi4wLjDKASCRtG9Ff1+2olBmpJxlImf/DHs2608hyVOGqWmwixsTu9IBIGZhZTQ5YWI1OTFlMDcxNTlkNzRjZDEzNjMwM2E2Mjcw2AER4gEyYmluYW5jZS1VU0RNLXB1YmxpYy1ib29rLTAwMS00LTE3ODk4MDYxMTY4Nzk0NjM2NDHoAQTwAQH4AQGCAiBHNvwrrDgxpKO3CBuzUEqRSYZNPQx8Fpvemvj9cwixFIoCEPrkmrWR4HFZ10zRNjA6YnDiAv8GCg4xMTY0NjAwMDEyNTQzMhIOMTE2NDYwMDAxMzgzNDAaDjExNjAwNDA0MzkyMTMwKiQIARIQCLiUCxAMIggwLjA5MTQyMBoMCJSpNiIGNDQ1MDAyKAEqJAgBEhAI4JQLEAwiCDAuMDkxNDQwGgwI4v03IgY0NTg2MDkoASokCAESEAjomAsQDCIIMC4wOTE3MDAaDAjMnS8iBjM4NjkxOCgBKiUIARIQCMSfCxAMIggwLjA5MjEzMBoNCOzZfiIHMTAzNzk0MigBKiYIARIQCNyhCxAMIggwLjA5MjI3MBoOCMyxsAIiBzI0OTM1NDIoASokCAESEAjwoQsQDCIIMC4wOTIyODAaDAiA1XYiBjk3MjA5NigBKiYIARIQCLijCxAMIggwLjA5MjM4MBoOCKaihwIiBzIxNTY2OTEoASomCAESEAiwpAsQDCIIMC4wOTI0NDAaDgjqqpYBIgcxMjMxNTQxKAEqJAgBEhAIwKcLEAwiCDAuMDkyNjQwGgwI1tUmIgYzMTY3NzkoASokCAESEAj8pwsQDCIIMC4wOTI2NzAaDAj6mDciBjQ1MjE1NygBKiQIARIQCKSoCxAMIggwLjA5MjY5MBoMCK65HyIGMjU3NjIzKAEqIwgCEhAIuKgLEAwiCDAuMDkyNzAwGgsI2L0GIgU1MzEwMCgBKiQIAhIQCMyoCxAMIggwLjA5MjcxMBoMCIacECIGMTMyODY3KAEqIwgCEhAI4KgLEAwiCDAuMDkyNzIwGgsI7uYJIgU4MDMxMSgBKiQIAhIQCJypCxAMIggwLjA5Mjc1MBoMCJLqKSIGMzQyNjY1KAEqJAgCEhAIsKkLEAwiCDAuMDkyNzYwGgwIjrY2IgY0NDU4MzEoASokCAISEAi8qgsQDCIIMC4wOTI4MzAaDAiq6SYiBjMxODAzNygBKiQIAhIQCKCrCxAMIggwLjA5Mjg4MBoMCOSONiIGNDQzMzE0KAEqJAgCEhAIrKwLEAwiCDAuMDkyOTUwGgwIlL44IgY0NjI3MzAoASokCAISEAikrQsQDCIIMC4wOTMwMTAaDAikwzciBjQ1NDg2NigBKiYIAhIQCICvCxAMIggwLjA5MzEyMBoOCIqR0AEiBzE3MDUwMjkoASokCAISEAiYsQsQDCIIMC4wOTMyNjAaDAjotk4iBjY0MjQ4NCgBOARAAQ==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":9,"offset":1166299},"materializer_epoch":1,"latest_value_trailer_hex":"000000000011cbdb000000000000000147cc1e61e486f34fbd3ccff161fbebd2682a4a22554d145b545e3de01c916f61","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"47cc1e61e486f34fbd3ccff161fbebd2682a4a22554d145b545e3de01c916f61\",\"event_id\":\"de5a838d07879809ca594bf5086cee8d\",\"lpk\":\"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BOOK_DELTA|-\",\"materializer_epoch\":1,\"source\":{\"offset\":1166299,\"partition\":9,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BOOK_DELTA|-","floor":"lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BOOK_DELTA|-|floor"},"partitions":{"1":0,"3":0,"6":0,"12":6,"48":18}},
+ {"name":"book_delta-okx","synthetic":false,"tag":"book_delta","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"0d522cb3-d764-5066-9e96-19f1817e84d7/book/okx-futures-eth-usd-261225-book-primary-v2","spool_offset":2902872,"lpk":"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_DELTA|-","canonical_b64":"ChlxZGwubWFya2V0ZGF0YS5ib29rX2RlbHRhEAIiEIiZrUd8PnQmhiIdDtHNzL8qJDBkNTIyY2IzLWQ3NjQtNTA2Ni05ZTk2LTE5ZjE4MTdlODRkNzIhT0tYLkZVVFVSRVMuRlVUVVJFLkVUSC1VU0QtMjYxMjI1OAFCA09LWEoHRlVUVVJFU1IGRlVUVVJFWg5FVEgtVVNELTI2MTIyNWIKT0tYX0RJUkVDVGoqb2t4LWZ1dHVyZXMtZXRoLXVzZC0yNjEyMjUtYm9vay1wcmltYXJ5LXYycAF4AYABwOTlt9udkOwYiAG5nq3G252Q7BiQAbmercbbnZDsGJgBuZ6txtudkOwYogEQZzY2Nzg1OjQ0OTAwNDkwNKgBwZGC2/u7WrIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDKASB47rnnCvdQ2YrbZL+7ZesySnTuNSVFElHhLfsd8vu1lNIBIDQ1ZGM0OWQxNjA0ZjI2NjFkYTBmMzYwMGRiZDNmNTVi2AEQ4gEob2t4LXB1YmxpYy0wMDEtNjY3ODUtMTc5MDI0MjQxMzc0OTEzOTcwM+gB4YkE8AEB+AEBggIglZhCINo9usoYcmKNALImhHM/J+IoQGqSMe19ekg9f/qKAhBF3EnRYE8mYdoPNgDb0/Vb4gJmCgk0NDkwMDQ5MDISCTQ0OTAwNDkwNBoJNDQ4NjIwMTEzKh8IARIPCJy7IBAEIgcyNjU5LjM0GgYIKCICMjAgASgDKhwIARIPCNa6IBAEIgcyNjU4Ljk5GgUIACIBMCgDOOGJBEAB","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":10,"offset":1174218},"materializer_epoch":2,"latest_value_trailer_hex":"000000000011eaca0000000000000002917d85c6b77a3501ff0c0affc4967c223c647d02d81f9c5df88cfa3611dfecec","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"917d85c6b77a3501ff0c0affc4967c223c647d02d81f9c5df88cfa3611dfecec\",\"event_id\":\"8899ad477c3e742686221d0ed1cdccbf\",\"lpk\":\"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_DELTA|-\",\"materializer_epoch\":2,\"source\":{\"offset\":1174218,\"partition\":10,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_DELTA|-","floor":"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_DELTA|-|floor"},"partitions":{"1":0,"3":1,"6":1,"12":1,"48":25}},
+ {"name":"book_snapshot-okx","synthetic":false,"tag":"book_snapshot","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"0d522cb3-d764-5066-9e96-19f1817e84d7/book/okx-futures-eth-usd-261225-book-primary-v2","spool_offset":2902827,"lpk":"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_SNAPSHOT|-","canonical_b64":"ChxxZGwubWFya2V0ZGF0YS5ib29rX3NuYXBzaG90EAIiEL8ZuGmHMrODss4XILXA2PkqJDBkNTIyY2IzLWQ3NjQtNTA2Ni05ZTk2LTE5ZjE4MTdlODRkNzIhT0tYLkZVVFVSRVMuRlVUVVJFLkVUSC1VU0QtMjYxMjI1OAFCA09LWEoHRlVUVVJFU1IGRlVUVVJFWg5FVEgtVVNELTI2MTIyNWIKT0tYX0RJUkVDVGoqb2t4LWZ1dHVyZXMtZXRoLXVzZC0yNjEyMjUtYm9vay1wcmltYXJ5LXYycAF4AYABwNKAqbSdkOwYiAGhtKW5tJ2Q7BiQAaG0pbm0nZDsGJgBobSlubSdkOwYogEQZzY2Nzg1OjQ0OTAwNDQ1OKgBwsGduPS7WrIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDKASDqVSPUG+hDrTGS/Y2X+CJbpUDnjQ3OeSNfX2x0XvTB7dIBIDJlZTM4YzUzMTQ0YTc4OWM5NjFkNGRhYzRlODViZGU32AEQ4gEob2t4LXB1YmxpYy0wMDEtNjY3ODUtMTc5MDI0MjQxMzc0OTEzOTcwM+gB4YkE8AEB+AEBggIgxCB3S3HVYjeK35+MrNTYSwPcl2+aMdLOZ/4pEpJ8bbCKAhAu44xTFEp4nJYdTaxOhb3n2gK9MwoJNDQ5MDA0NDU4Gh4IARIPCJbUIBAEIgcyNjc1LjMxGgUIAiIBMSABKAMaHggBEg8IhNQgEAQiBzI2NzUuMjIaBQgEIgEyIAEoAxodCAESDgj+oQMQAiIGMjY3NS4xGgUIAiIBMSABKAMaHggBEg8I5NMgEAQiBzI2NzUuMDYaBQgCIgExIAEoAxoeCAESDwjO0yAQBCIHMjY3NC45NRoFCAQiATIgASgDGh4IARIPCMbTIBAEIgcyNjc0LjkxGgUIAiIBMSABKAMaHwgBEg8IqNMgEAQiBzI2NzQuNzYaBgg8IgIzMCABKAMaHggBEg8IntMgEAQiBzI2NzQuNzEaBQgCIgExIAEoAxoeCAESDwiY0yAQBCIHMjY3NC42OBoFCAQiATIgASgDGh4IARIPCITTIBAEIgcyNjc0LjU4GgUIAiIBMSABKAMaHggBEg8I6tIgEAQiBzI2NzQuNDUaBQgCIgExIAEoAxoeCAESDwji0iAQBCIHMjY3NC40MRoFCAQiATIgASgDGh4IARIPCM7SIBAEIgcyNjc0LjMxGgUIAiIBMSABKAMaHggBEg8ItNIgEAQiBzI2NzQuMTgaBQgCIgExIAEoAxoeCAESDwis0iAQBCIHMjY3NC4xNBoFCAQiATIgASgDGh4IARIPCJrSIBAEIgcyNjc0LjA1GgUIAiIBMSABKAMaHggBEg8IgNIgEAQiBzI2NzMuOTIaBQgCIgExIAEoAxoeCAESDwj20SAQBCIHMjY3My44NxoFCAYiATMgAigDGiEIARIPCPTRIBAEIgcyNjczLjg2GggIlAMiAzIwMiABKAMaHggBEg8IzNEgEAQiBzI2NzMuNjYaBQgCIgExIAEoAxoeCAESDwjG0SAQBCIHMjY3My42MxoFCAQiATIgASgDGh0IARIOCOChAxACIgYyNjczLjYaBQgEIgEyIAEoAxoeCAESDwiy0SAQBCIHMjY3My41MxoFCAIiATEgASgDGh0IARIOCNyhAxACIgYyNjczLjQaBQgCIgExIAEoAxoeCAESDwiK0SAQBCIHMjY3My4zMxoFCAQiATIgASgDGh4IARIPCIbRIBAEIgcyNjczLjMxGgUIAiIBMSABKAMaIAgBEg4I2qEDEAIiBjI2NzMuMxoICJQDIgMyMDIgASgDGh4IARIPCNTQIBAEIgcyNjczLjA2GgUIBCIBMiABKAMaIAgBEg4I0KEDEAIiBjI2NzIuOBoICJQDIgMyMDIgASgDGh4IARIPCJ7QIBAEIgcyNjcyLjc5GgUIBCIBMiABKAMaIggBEg8IitAgEAQiBzI2NzIuNjkaCQi0MyIEMzI5MCADKAMaJAgBEg8IiNAgEAQiBzI2NzIuNjgaCwiAkAMiBTI1NjAwIAEoAxoeCAESDwjozyAQBCIHMjY3Mi41MhoFCAQiATIgASgDGiAIARIOCMihAxACIgYyNjcyLjQaCAiGAyIDMTk1IAEoAxohCAESDwjOzyAQBCIHMjY3Mi4zORoICJQDIgMyMDIgASgDGiEIARIPCMjPIBAEIgcyNjcyLjM2GggIlgwiAzc3OSABKAMaHggBEg8Ius8gEAQiBzI2NzIuMjkaBQgEIgEyIAEoAxoeCAESDwiyzyAQBCIHMjY3Mi4yNRoFCAQiATIgASgDGh4IARIPCPzOIBAEIgcyNjcxLjk4GgUIBCIBMiABKAMaIQgBEg8I+M4gEAQiBzI2NzEuOTYaCAiUAyIDMjAyIAEoAxoeCAESDwjGziAQBCIHMjY3MS43MRoFCAQiATIgASgDGh4IARIPCJDOIBAEIgcyNjcxLjQ0GgUIBCIBMiABKAMaIQgBEg8Igs4gEAQiBzI2NzEuMzcaCAiUAyIDMjAyIAEoAxoeCAESDwjazSAQBCIHMjY3MS4xNxoFCAQiATIgASgDGiEIARIPCLDNIBAEIgcyNjcwLjk2GggIlAMiAzIwMiABKAMaHggBEg8Irs0gEAQiBzI2NzAuOTUaBQgEIgEyIAEoAxodCAESDgiqoQMQAiIGMjY3MC45GgUIBCIBMiABKAMaIQgBEg8Ijs0gEAQiBzI2NzAuNzkaCAjCAyIDMjI1IAEoAxoiCAESDwiKzSAQBCIHMjY3MC43NxoJCMoRIgQxMTI1IAEoAxohCAESDwjYzCAQBCIHMjY3MC41MhoICJQDIgMyMDIgASgDGiQIARIPCMbMIBAEIgcyNjcwLjQzGgsIkMsBIgUxMzAwMCABKAMaIwgBEg4IoKEDEAIiBjI2NzAuNBoLCKCcASIFMTAwMDAgASgDGiIIARIPCKDMIBAEIgcyNjcwLjI0GgkIyhEiBDExMjUgASgDGiEIARIPCIrMIBAEIgcyNjcwLjEzGggI8AEiAzEyMCABKAMaIAgBEg8I8ssgEAQiBzI2NzAuMDEaBwi2ASICOTEgASgDGiEIARIPCLbLIBAEIgcyNjY5LjcxGggIlAMiAzIwMiABKAMaJAgBEg8IpssgEAQiBzI2NjkuNjMaCwiA6AciBTY0MDAwIAEoAxoeCAESDwiiyyAQBCIHMjY2OS42MRoFCAQiATIgASgDGiAIARIOCPigAxACIgYyNjY4LjQaCAi2CiIDNjY3IAEoAxoeCAESDwiWySAQBCIHMjY2OC4yNxoFCAQiATIgASgDGiQIARIPCIDIIBAEIgcyNjY3LjUyGgsIwLsBIgUxMjAwMCABKAMaHggBEg8IiscgEAQiBzI2NjYuOTMaBQgEIgEyIAEoAxokCAESDwjOxiAQBCIHMjY2Ni42MxoLCODnASIFMTQ4MzIgASgDGh4IARIPCP7EIBAEIgcyNjY1LjU5GgUIBCIBMiABKAMaJAgBEg8I+sMgEAQiBzI2NjQuOTMaCwjAuwEiBTEyMDAwIAEoAxoeCAESDwjywiAQBCIHMjY2NC4yNRoFCAQiATIgASgDGh4IARIPCObAIBAEIgcyNjYyLjkxGgUIBCIBMiABKAMaJAgBEg8I0sAgEAQiBzI2NjIuODEaCwjAuwEiBTEyMDAwIAEoAxoeCAESDwjaviAQBCIHMjY2MS41NxoFCAQiATIgASgDGh4IARIPCM68IBAEIgcyNjYwLjIzGgUIBCIBMiABKAMaJAgBEg8IvLwgEAQiBzI2NjAuMTQaCwjAuwEiBTEyMDAwIAEoAxoeCAESDwjCuiAQBCIHMjY1OC44ORoFCAQiATIgASgDGh8IARIPCPa5IBAEIgcyNjU4LjUxGgYIKCICMjAgASgDGh4IARIPCLa4IBAEIgcyNjU3LjU1GgUIBCIBMiABKAMaHggBEg8IqrYgEAQiBzI2NTYuMjEaBQgEIgEyIAEoAxogCAESDwjctCAQBCIHMjY1NS4xOBoHCLQBIgI5MCABKAMaHggBEg8InrQgEAQiBzI2NTQuODcaBQgEIgEyIAEoAxofCAESDwiGtCAQBCIHMjY1NC43NRoGCFwiAjQ2IAEoAxoeCAESDwiSsiAQBCIHMjY1My41MxoFCAQiATIgASgDGiEIARIPCLSwIBAEIgcyNjUyLjQyGggIwAIiAzE2MCABKAMaHggBEg8IhrAgEAQiBzI2NTIuMTkaBQgEIgEyIAEoAxokCAESDwiiriAQBCIHMjY1MS4wNRoLCODUAyIFMzAwMDAgASgDGh4IARIPCPqtIBAEIgcyNjUwLjg1GgUIBCIBMiABKAMaJAgBEg8I1KwgEAQiBzI2NTAuMDIaCwjg1AMiBTMwMDAwIAEoAxoeCAESDwjuqyAQBCIHMjY0OS41MRoFCAQiATIgASgDGiEIARIPCJqrIBAEIgcyNjQ5LjA5GggIzAMiAzIzMCABKAMaHggBEg8I4qkgEAQiBzI2NDguMTcaBQgEIgEyIAEoAxoeCAESDwjWpyAQBCIHMjY0Ni44MxoFCAQiATIgASgDGiEIARIPCIKmIBAEIgcyNjQ1Ljc3GggI2AQiAzMwMCABKAMaHggBEg8IyqUgEAQiBzI2NDUuNDkaBQgEIgEyIAEoAxoeCAESDwi+oyAQBCIHMjY0NC4xNRoFCAQiATIgASgDGh4IARIPCLKhIBAEIgcyNjQyLjgxGgUIBCIBMiABKAMaHggBEg8ImJwgEAQiBzI2MzkuNDgaBQgKIgE1IAEoAxobCAESCQiSKSIEMjYzMxoICNYFIgMzNjMgASgDGhsIARIJCIgpIgQyNjI4GggIjAQiAzI2MiABKAMaJAgBEg8IuoUgEAQiBzI2MjQuOTMaCwiA8QQiBTQwMDAwIAIoAxofCAESDwig4x8QBCIHMjYwMy4wNBoGCBYiAjExIAEoAxobCAESCQjQKCIEMjYwMBoICLgFIgMzNDggASgDGhsIARIJCLgoIgQyNTg4GggIoAUiAzMzNiABKAMaGwgBEgkI9iciBDI1NTUaCAjaBiIDNDI5IAEoAxoeCAISDwjU1CAQBCIHMjY3NS42MhoFCAIiATEgASgDGh4IAhIPCNbUIBAEIgcyNjc1LjYzGgUIAiIBMSABKAMaHggCEg8I8NQgEAQiBzI2NzUuNzYaBQgCIgExIAEoAxoeCAISDwiI1SAQBCIHMjY3NS44OBoFCAIiATEgASgDGh4IAhIPCKTVIBAEIgcyNjc2LjAyGgUIBiIBMyACKAMaHggCEg8IptUgEAQiBzI2NzYuMDMaBQgCIgExIAEoAxoeCAISDwjG1SAQBCIHMjY3Ni4xORoFCAIiATEgASgDGiAIAhIOCJSiAxACIgYyNjc2LjIaCAiUAyIDMjAyIAEoAxoeCAISDwja1SAQBCIHMjY3Ni4yORoFCAQiATIgASgDGh4IAhIPCJDWIBAEIgcyNjc2LjU2GgUIBiIBMyACKAMaIQgCEg8ImtYgEAQiBzI2NzYuNjEaCAiUAyIDMjAyIAEoAxoeCAISDwiu1iAQBCIHMjY3Ni43MRoFCAQiATIgASgDGh4IAhIPCMbWIBAEIgcyNjc2LjgzGgUIBCIBMiABKAMaIQgCEg8I7tYgEAQiBzI2NzcuMDMaCAiUAyIDMjAyIAEoAxodCAISDgimogMQAiIGMjY3Ny4xGgUIBCIBMiABKAMaHggCEg8IstcgEAQiBzI2NzcuMzcaBQgEIgEyIAEoAxohCAISDwjA1yAQBCIHMjY3Ny40NBoICJQDIgMyMDIgASgDGh4IAhIPCOjXIBAEIgcyNjc3LjY0GgUIBCIBMiABKAMaHwgCEg8IhNggEAQiBzI2NzcuNzgaBgh4IgI2MCABKAMaHwgCEg8IhtggEAQiBzI2NzcuNzkaBgh4IgI2MCABKAMaIAgCEg4ItKIDEAIiBjI2NzcuOBoICMQIIgM1NDYgASgDGiEIAhIPCI7YIBAEIgcyNjc3LjgzGggI1AciAzQ5MCACKAMaIggCEg8IktggEAQiBzI2NzcuODUaCQjEFiIEMTQ0MiABKAMaIQgCEg8ImNggEAQiBzI2NzcuODgaCAiUAyIDMjAyIAEoAxoeCAISDwie2CAQBCIHMjY3Ny45MRoFCAQiATIgASgDGh4IAhIPCLjYIBAEIgcyNjc4LjA0GgUIBCIBMiABKAMaHggCEg8I1NggEAQiBzI2NzguMTgaBQgEIgEyIAEoAxohCAISDwjq2CAQBCIHMjY3OC4yORoICJQDIgMyMDIgASgDGh4IAhIPCIrZIBAEIgcyNjc4LjQ1GgUIBCIBMiABKAMaIAgCEg4IxqIDEAIiBjI2NzguNxoICJQDIgMyMDIgASgDGh4IAhIPCMDZIBAEIgcyNjc4LjcyGgUIBCIBMiABKAMaIQgCEg8I8tkgEAQiBzI2NzguOTcaCAj2BSIDMzc5IAEoAxoiCAISDwj02SAQBCIHMjY3OC45OBoJCJ48IgQzODU1IAEoAxoeCAISDwj22SAQBCIHMjY3OC45ORoFCAQiATIgASgDGiAIAhIPCIbaIBAEIgcyNjc5LjA3GgcIjgEiAjcxIAEoAxoeCAISDwis2iAQBCIHMjY3OS4yNhoFCAQiATIgASgDGh4IAhIPCMLaIBAEIgcyNjc5LjM3GgUIBCIBMiABKAMaIQgCEg8I3togEAQiBzI2NzkuNTEaCAiUAyIDMjAyIAEoAxogCAISDwjM2yAQBCIHMjY4MC4wNhoHCLYBIgI5MSABKAMaIQgCEg8I4NsgEAQiBzI2ODAuMTYaCAjoASIDMTE2IAEoAxohCAISDwiA3CAQBCIHMjY4MC4zMhoICJQDIgMyMDIgASgDGiQIAhIPCJTcIBAEIgcyNjgwLjQyGgsIkMsBIgUxMzAwMCABKAMaJAgCEg8IttwgEAQiBzI2ODAuNTkaCwiAkAMiBTI1NjAwIAEoAxokCAISDwjy3CAQBCIHMjY4MC44ORoLCKCcASIFMTAwMDAgASgDGiEIAhIPCPzcIBAEIgcyNjgwLjk0GggI8AEiAzEyMCABKAMaIQgCEg8Iot0gEAQiBzI2ODEuMTMaCAiUAyIDMjAyIAEoAxogCAISDwi23SAQBCIHMjY4MS4yMxoHCI4BIgI3MSABKAMaIQgCEg8Iyt4gEAQiBzI2ODEuOTcaCAi2CiIDNjY3IAEoAxogCAISDwiO3yAQBCIHMjY4Mi4zMRoHCLoBIgI5MyABKAMaJAgCEg8I5t8gEAQiBzI2ODIuNzUaCwiA6AciBTY0MDAwIAEoAxokCAISDwi64SAQBCIHMjY4My44MRoLCMC7ASIFMTIwMDAgASgDGiIIAhIPCO7iIBAEIgcyNjg0LjcxGgkInBEiBDExMDIgASgDGiIIAhIPCKrjIBAEIgcyNjg1LjAxGgkI2A8iBDEwMDQgASgDGh8IAhIPCKbkIBAEIgcyNjg1LjYzGgYIKCICMjAgASgDGiQIAhIPCLrkIBAEIgcyNjg1LjczGgsIwLsBIgUxMjAwMCABKAMaJAgCEg8I3ucgEAQiBzI2ODcuODMaCwjAuwEiBTEyMDAwIAEoAxogCAISDwjq6SAQBCIHMjY4OS4xNxoHCLQBIgI5MCABKAMaJAgCEg8IhOwgEAQiBzI2OTAuNTgaCwjAuwEiBTEyMDAwIAEoAxohCAISDwjm7iAQBCIHMjY5Mi4zNRoICMACIgMxNjAgASgDGiEIAhIPCJb1IBAEIgcyNjk2LjQzGggIzAMiAzIzMCABKAMaJAgCEg8I7PcgEAQiBzI2OTguMTQaCwjg1AMiBTMwMDAwIAEoAxokCAISDwi++SAQBCIHMjY5OS4xORoLCODUAyIFMzAwMDAgASgDGh8IAhIPCPb5IBAEIgcyNjk5LjQ3GgYIXCICNDYgASgDGiEIAhIPCLb6IBAEIgcyNjk5Ljc5GggI2AQiAzMwMCABKAMaHggCEg8IioQhEAQiBzI3MDUuOTcaBQgEIgEyIAEoAxodCAISDgiCpwMQAiIGMjcwNy4zGgUIBCIBMiABKAMaHggCEg8InoghEAQiBzI3MDguNjMaBQgEIgEyIAEoAxoeCAISDwioiiEQBCIHMjcwOS45NhoFCAQiATIgASgDGh4IAhIPCLKMIRAEIgcyNzExLjI5GgUIBCIBMiABKAMaHggCEg8IvI4hEAQiBzI3MTIuNjIaBQgEIgEyIAEoAxoeCAISDwjGkCEQBCIHMjcxMy45NRoFCAQiATIgASgDGh4IAhIPCNCSIRAEIgcyNzE1LjI4GgUIBCIBMiABKAMaHggCEg8I2pQhEAQiBzI3MTYuNjEaBQgEIgEyIAEoAxoeCAISDwjkliEQBCIHMjcxNy45NBoFCAQiATIgASgDGh4IAhIPCO6YIRAEIgcyNzE5LjI3GgUIBCIBMiABKAMaHQgCEg4IjKkDEAIiBjI3MjAuNhoFCAQiATIgASgDGiQIAhIPCOSbIRAEIgcyNzIxLjE0GgsIgPEEIgU0MDAwMCACKAMaHggCEg8Igp0hEAQiBzI3MjEuOTMaBQgEIgEyIAEoAxoeCAISDwiMnyEQBCIHMjcyMy4yNhoFCAQiATIgASgDGh4IAhIPCJahIRAEIgcyNzI0LjU5GgUIBCIBMiABKAMaHggCEg8IoKMhEAQiBzI3MjUuOTIaBQgEIgEyIAEoAxoeCAISDwiqpSEQBCIHMjcyNy4yNRoFCAQiATIgASgDGh4IAhIPCLSnIRAEIgcyNzI4LjU4GgUIBCIBMiABKAMaHAgCEgkIiCsiBDI3NTYaCQiAFCIEMTI4MCABKAMaIQgCEg4IurIDEAIiBjI3ODAuNRoJCMYqIgQyNzIzIAEoAxoeCAISDwianiIQBCIHMjgwNC42MRoFCAQiATIgAigDGh4IAhIPCJifIhAEIgcyODA1LjI0GgUIBiIBMyADKAMaHggCEg8Isp8iEAQiBzI4MDUuMzcaBQgIIgE0IAQoAxoeCAISDwjwnyIQBCIHMjgwNS42OBoFCAIiATEgASgDGhkIAhIJCKwsIgQyODM4GgYIFCICMTAgASgDGhgIAhIJCMAsIgQyODQ4GgUICCIBNCABKAMaIQgCEg8Ilp0jEAQiBzI4ODUuODcaCAjoByIDNTAwIAEoAxoZCAISCQiMLSIEMjg4NhoGCCgiAjIwIAEoAxoiCAISDwiSoSMQBCIHMjg4OC40MRoJCMoRIgQxMTI1IAEoAxoeCAISDwiW7iMQBCIHMjkzNy43MRoFCBAiATggASgDGiIIAhIPCJ79JRAEIgczMTExLjE5GgkIyEYiBDQ1MTYgASgDGiAIAhIPCIysKhAEIgczNDY4Ljg2GgcIwAEiAjk2IAEoAyBkKOGJBDABOAE=","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":11,"offset":1182137},"materializer_epoch":3,"latest_value_trailer_hex":"00000000001209b900000000000000038a3a3dc0815198c219c8b3872c69cfdd02b4b8476405faaaf89fa80cd2761f68","bar_row_b64":null,"headers":{"LATEST":"{\"content_sha256\":\"8a3a3dc0815198c219c8b3872c69cfdd02b4b8476405faaaf89fa80cd2761f68\",\"event_id\":\"bf19b8698732b383b2ce1720b5c0d8f9\",\"lpk\":\"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_SNAPSHOT|-\",\"materializer_epoch\":3,\"source\":{\"offset\":1182137,\"partition\":11,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_SNAPSHOT|-","floor":"lpk1|paper|OKX|FUTURES|0d522cb3-d764-5066-9e96-19f1817e84d7|BOOK_SNAPSHOT|-|floor"},"partitions":{"1":0,"3":2,"6":2,"12":8,"48":32}},
+ {"name":"bar-1m-final-okx-in-progress","synthetic":true,"tag":"bar|1m|in-progress","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8yokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFtLXByaW1hcnktdjJwAXgBgAGAgLS5q5uQ7BiIAZz0u7GOnZDsGJABnPS7sY6dkOwYmAGc9Luxjp2Q7BiiAQ8xNzkwMjUyMTYwMDAwOjGoAcH+4YW90huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBIDSlMS5P0e30ayzR5ShpTbD0BDqGlumet3jTw5Gu9vED0gEgM2Y2MWU2OTY4ZWE5NTBmYmFlZDQ5ZTlhNTRiYmNmZDnYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiB1Q6AXoZCQMBfDxqlJainVSLKXLOEdB2fQefKB/P+UcIoCED9h5paOqVD7rtSemlS7z9nSArQBCgIxbRCAgLS5q5uQ7BgYwKuU+4qdkOwYIg8I6pABEAoiBzAuMDkyNjkqDwjukAEQCiIHMC4wOTI3MTIPCOCQARAKIgcwLjA5MjY0Og8I6pABEAoiBzAuMDkyNjlCDgiUzAgQBCIGNzA0LjEwYAFoAXgDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":1190056},"materializer_epoch":1,"latest_value_trailer_hex":"00000000001228a80000000000000001704a1eba38c8b83968afd4b8f6f7b50939392396c71b47344da75d7bf1671887","bar_row_b64":"AAAAAAASKKgAAAAAAAAAAXBKHro4yLg5aK/UuPb3tQk5OSOWxxtHNE2nXXvxZxiHChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICsAEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMGABaAF4A4IBEQjQv9sGEAIiCDcwNDEwMC4wigEaCMCY4KHm+wIQECIONjUyNDguOTYwMjAwMDCSAQ4IlMwIEAQiBjcwNC4xMA==","headers":{"LATEST":"{\"content_sha256\":\"704a1eba38c8b83968afd4b8f6f7b50939392396c71b47344da75d7bf1671887\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":1,\"source\":{\"offset\":1190056,\"partition\":0,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"704a1eba38c8b83968afd4b8f6f7b50939392396c71b47344da75d7bf1671887\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"is_final\":false,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":1,\"open_time_ms\":1790252160000,\"revision\":0,\"source\":{\"offset\":1190056,\"partition\":0,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|1790252160000|p"},"partitions":{"1":0,"3":1,"6":4,"12":4,"48":40}},
+ {"name":"bar-1m-final-okx-revised","synthetic":true,"tag":"bar|1m|revised","venue":"OKX","spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8yokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFtLXByaW1hcnktdjJwAXgBgAGAgLS5q5uQ7BiIAZz0u7GOnZDsGJABnPS7sY6dkOwYmAGc9Luxjp2Q7BiiAQ8xNzkwMjUyMTYwMDAwOjGoAcH+4YW90huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBIDSlMS5P0e30ayzR5ShpTbD0BDqGlumet3jTw5Gu9vED0gEgM2Y2MWU2OTY4ZWE5NTBmYmFlZDQ5ZTlhNTRiYmNmZDnYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiB1Q6AXoZCQMBfDxqlJainVSLKXLOEdB2fQefKB/P+UcIoCED9h5paOqVD7rtSemlS7z9nSArgBCgIxbRCAgLS5q5uQ7BgYwKuU+4qdkOwYIg8I6pABEAoiBzAuMDkyNjkqDwjukAEQCiIHMC4wOTI3MTIPCOCQARAKIgcwLjA5MjY0Og8I6pABEAoiBzAuMDkyNjlCDgiUzAgQBCIGNzA0LjEwUAFYAWABaAN4A4IBEQjQv9sGEAIiCDcwNDEwMC4wigEaCMCY4KHm+wIQECIONjUyNDguOTYwMjAwMDCSAQ4IlMwIEAQiBjcwNC4xMA==","source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":1,"offset":1197975},"materializer_epoch":2,"latest_value_trailer_hex":"0000000000124797000000000000000238ce01dc46de915d9f2984a70cd56c68b385eecb4e67da8909da18bd0e685408","bar_row_b64":"AAAAAAASR5cAAAAAAAAAAjjOAdxG3pFdnymEpwzVbGizhe7LTmfaiQnaGL0OaFQIChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICtAEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABWAFgAWgDeAOCAREI0L/bBhACIgg3MDQxMDAuMIoBGgjAmOCh5vsCEBAiDjY1MjQ4Ljk2MDIwMDAwkgEOCJTMCBAEIgY3MDQuMTA=","headers":{"LATEST":"{\"content_sha256\":\"38ce01dc46de915d9f2984a70cd56c68b385eecb4e67da8909da18bd0e685408\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":2,\"source\":{\"offset\":1197975,\"partition\":1,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}","BAR_REVISION":"{\"content_sha256\":\"38ce01dc46de915d9f2984a70cd56c68b385eecb4e67da8909da18bd0e685408\",\"event_id\":\"d4dedac19482dd56be423585342e0df3\",\"is_final\":true,\"lpk\":\"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m\",\"materializer_epoch\":2,\"open_time_ms\":1790252160000,\"revision\":1,\"source\":{\"offset\":1197975,\"partition\":1,\"topic_id\":\"ljfjPYApRpWQd79McfTtZg\"}}"},"keys":{"latest":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","floor":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|floor","bar":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|1790252160000|f1|38ce01dc46de915d"},"partitions":{"1":0,"3":1,"6":4,"12":4,"48":40}}
+ ],
+ "full_frames":[
+ {"record":"trade-okx","kind":"LATEST","frame_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Miwic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0KFHFkbC5tYXJrZXRkYXRhLnRyYWRlEAIiECR0tuGiLbGy16RW1a7GxskqJDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjNzIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgNPS1hKBFNXQVBSCVBFUlBFVFVBTFoORE9HRS1VU0RULVNXQVBiCk9LWF9ESVJFQ1RqKG9reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLXRyYWRlLXByaW1hcnktdjJwAXgBgAHAvavA0p2Q7BiIAZmxlNDSnZDsGJABmbGU0NKdkOwYmAGZsZTQ0p2Q7BiiAQoxMzUyMDIxODk4qAHByZP17p0tsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBDG9reC12NS8yLjAuMMoBIAtKtJcfomadpGtHhT4lC3FzebMFvUVlVyO2Ds2FKLB60gEgM2ZkNGJmNDFhZTA3MDYyZDFkZGMxOGQ5N2M3NTAzZDPYARDiASVva3gtcHVibGljLTAwMi05Mi0xNzkwMjQzMjgxNzM2MDk2NzAz6AFc8AEB+AEBggIgUbNn2Tv136DpYPw4L3vielxND+POjOYQjRNDqqu3HVSKAhA/1L9BrgcGLR3cGNl8dQPTwgIvCgoxMzUyMDIxODk4Eg8I6pABEAoiBzAuMDkyNjkaCggcEAQiBDAuMTQgATgDQAE="},
+ {"record":"bar-1m-final-okx","kind":"BAR_REVISION","frame_b64":"UUtTMQIAAAFqeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0KEnFkbC5tYXJrZXRkYXRhLmJhchACIhDU3trBlILdVr5CNYU0Lg3zKiQ2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcyHE9LWC5TV0FQLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIDT0tYSgRTV0FQUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICtgEKAjFtEICAtLmrm5DsGBjAq5T7ip2Q7BgiDwjqkAEQCiIHMC4wOTI2OSoPCO6QARAKIgcwLjA5MjcxMg8I4JABEAoiBzAuMDkyNjQ6DwjqkAEQCiIHMC4wOTI2OUIOCJTMCBAEIgY3MDQuMTBQAWABaAJ4A4IBEQjQv9sGEAIiCDcwNDEwMC4wigEaCMCY4KHm+wIQECIONjUyNDguOTYwMjAwMDCSAQ4IlMwIEAQiBjcwNC4xMA=="},
+ {"record":"bar-1m-final-okx","kind":"LEGACY_BAR","frame_b64":"UUtTMQQAAAHteyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxlZ2FjeSI6eyJzcG9vbF9sb2dpY2FsX29mZnNldCI6MjI1MDYsInNwb29sX3BhcnRpdGlvbl9rZXkiOiI2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcvYmFyL29reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLWJhci0xbS1wcmltYXJ5LXYyIiwic3Bvb2xfc3RyZWFtIjoibWQuY2Fub25pY2FsLnYyIn0sImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJwcm92ZW5hbmNlIjoibGVnYWN5X2ltcG9ydCIsInJldmlzaW9uIjowfQoScWRsLm1hcmtldGRhdGEuYmFyEAIiENTe2sGUgt1WvkI1hTQuDfMqJDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjNzIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgNPS1hKBFNXQVBSCVBFUlBFVFVBTFoORE9HRS1VU0RULVNXQVBiCk9LWF9ESVJFQ1RqKW9reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLWJhci0xbS1wcmltYXJ5LXYycAF4AYABgIC0uaubkOwYiAGc9Luxjp2Q7BiQAZz0u7GOnZDsGJgBnPS7sY6dkOwYogEPMTc5MDI1MjE2MDAwMDoxqAHB/uGFvdIbsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBDG9reC12NS8yLjAuMMIBAQnKASA0pTEuT9Ht9Gss0eUoaU2w9AQ6hpbpnrd408ORrvbxA9IBIDNmNjFlNjk2OGVhOTUwZmJhZWQ0OWU5YTU0YmJjZmQ52AEQ4gEnb2t4LWJ1c2luZXNzLTAwMS00OC0xNzkwMjQ1MjgzMDU2OTIzODA26AEw8AEB+AEBggIgdUOgF6GQkDAXw8apSWop1UiylyzhHQdn0Hnygfz/lHCKAhA/YeaWjqlQ+67UnppUu8/Z0gK2AQoCMW0QgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABYAFoAngDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw"},
+ {"record":"bar-1m-final-okx-in-progress","kind":"BAR_REVISION","frame_b64":"UUtTMQIAAAFreyJjb250ZW50X3NoYTI1NiI6IjcwNGExZWJhMzhjOGI4Mzk2OGFmZDRiOGY2ZjdiNTA5MzkzOTIzOTZjNzFiNDczNDRkYTc1ZDdiZjE2NzE4ODciLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOmZhbHNlLCJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjEsIm9wZW5fdGltZV9tcyI6MTc5MDI1MjE2MDAwMCwicmV2aXNpb24iOjAsInNvdXJjZSI6eyJvZmZzZXQiOjExOTAwNTYsInBhcnRpdGlvbiI6MCwidG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIn19ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8yokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFtLXByaW1hcnktdjJwAXgBgAGAgLS5q5uQ7BiIAZz0u7GOnZDsGJABnPS7sY6dkOwYmAGc9Luxjp2Q7BiiAQ8xNzkwMjUyMTYwMDAwOjGoAcH+4YW90huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBIDSlMS5P0e30ayzR5ShpTbD0BDqGlumet3jTw5Gu9vED0gEgM2Y2MWU2OTY4ZWE5NTBmYmFlZDQ5ZTlhNTRiYmNmZDnYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiB1Q6AXoZCQMBfDxqlJainVSLKXLOEdB2fQefKB/P+UcIoCED9h5paOqVD7rtSemlS7z9nSArQBCgIxbRCAgLS5q5uQ7BgYwKuU+4qdkOwYIg8I6pABEAoiBzAuMDkyNjkqDwjukAEQCiIHMC4wOTI3MTIPCOCQARAKIgcwLjA5MjY0Og8I6pABEAoiBzAuMDkyNjlCDgiUzAgQBCIGNzA0LjEwYAFoAXgDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw"}
+ ],
+ "floor_frames":[
+ {"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","floor_open_time_ms":0,"materializer_epoch":1,"frame_b64":"UUtTMQMAAAB3eyJmbG9vcl9vcGVuX3RpbWVfbXMiOjAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MX0=","key":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|floor"},
+ {"lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","floor_open_time_ms":1790000000000,"materializer_epoch":9223372036854775807,"frame_b64":"UUtTMQMAAACVeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6OTIyMzM3MjAzNjg1NDc3NTgwN30=","key":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m|floor"}
+ ],
+ "murmur2":[
+ {"input_hex":"3231","hash":-973932308,"source":"kafka UtilsTest.testMurmur2"},
+ {"input_hex":"666f6f626172","hash":-790332482,"source":"kafka UtilsTest.testMurmur2"},
+ {"input_hex":"612d6c6974746c652d6269742d6c6f6e672d737472696e67","hash":-985981536,"source":"kafka UtilsTest.testMurmur2"},
+ {"input_hex":"612d6c6974746c652d6269742d6c6f6e6765722d737472696e67","hash":-1486304829,"source":"kafka UtilsTest.testMurmur2"},
+ {"input_hex":"6c6b6a683233346c68396669756839307932336f697568736166756a6861646f66323239706872396831396838396838","hash":-58897971,"source":"kafka UtilsTest.testMurmur2"},
+ {"input_hex":"616263","hash":479470107,"source":"kafka UtilsTest.testMurmur2"},
+ {"input_hex":"","hash":275646681,"source":"cross-language"},
+ {"input_hex":"61","hash":-1563381124,"source":"cross-language"},
+ {"input_hex":"6162","hash":316155434,"source":"cross-language"},
+ {"input_hex":"61626331","hash":177384440,"source":"cross-language"},
+ {"input_hex":"6162636465","hash":461995741,"source":"cross-language"},
+ {"input_hex":"6c706b317c70617065727c4f4b587c535741507c787c4241527c316d","hash":757397277,"source":"cross-language"},
+ {"input_hex":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff","hash":-1948347274,"source":"cross-language"}
+ ],
+ "invalid_frames":[
+ {"name":"short_prefix","synthetic":true,"frame_b64":"UUtTMQMAAAA=","reason":"TRUNCATED","detail":""},
+ {"name":"header_past_end","synthetic":true,"frame_b64":"UUtTMQMAAACEeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"TRUNCATED","detail":""},
+ {"name":"wrong_magic","synthetic":true,"frame_b64":"UUtTMgMAAACDeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"MAGIC","detail":""},
+ {"name":"kind_zero","synthetic":true,"frame_b64":"UUtTMQAAAACDeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"KIND","detail":""},
+ {"name":"kind_five","synthetic":true,"frame_b64":"UUtTMQUAAACDeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"KIND","detail":""},
+ {"name":"header_oversized","synthetic":true,"frame_b64":"UUtTMQMAABAB","reason":"HEADER_SIZE","detail":""},
+ {"name":"header_empty","synthetic":true,"frame_b64":"UUtTMQMAAAAA","reason":"HEADER_JSON","detail":""},
+ {"name":"header_not_json","synthetic":true,"frame_b64":"UUtTMQMAAAAFe2xwa30=","reason":"HEADER_JSON","detail":""},
+ {"name":"header_array","synthetic":true,"frame_b64":"UUtTMQMAAAADWzFd","reason":"HEADER_JSON","detail":""},
+ {"name":"header_nan","synthetic":true,"frame_b64":"UUtTMQMAAACFeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6TmFOfQ==","reason":"HEADER_JSON","detail":""},
+ {"name":"header_invalid_utf8","synthetic":true,"frame_b64":"UUtTMQMAAACDeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFw/3J8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"HEADER_JSON","detail":""},
+ {"name":"header_bom","synthetic":true,"frame_b64":"UUtTMQMAAACG77u/eyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"HEADER_JSON","detail":""},
+ {"name":"header_lone_surrogate","synthetic":true,"frame_b64":"UUtTMQMAAACJeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6Ilx1ZDgwMGxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"HEADER_JSON","detail":""},
+ {"name":"header_float_overflow","synthetic":true,"frame_b64":"UUtTMQMAAACHeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MWU0MDB9","reason":"HEADER_JSON","detail":""},
+ {"name":"header_trailing_text","synthetic":true,"frame_b64":"UUtTMQMAAACEeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N314","reason":"HEADER_JSON","detail":""},
+ {"name":"header_depth_128","synthetic":true,"frame_b64":"UUtTMQMAAAFAeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6W1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW11dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV0sIm1hdGVyaWFsaXplcl9lcG9jaCI6N30=","reason":"HEADER_JSON","detail":""},
+ {"name":"header_depth_127_is_json","synthetic":true,"frame_b64":"UUtTMQMAAAE+eyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6W1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjd9","reason":"FIELD","detail":"lpk"},
+ {"name":"missing_field","synthetic":true,"frame_b64":"UUtTMQMAAABseyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSJ9","reason":"HEADER_FIELDS","detail":"header"},
+ {"name":"extra_field","synthetic":true,"frame_b64":"UUtTMQMAAACNeyJleHRyYSI6MSwiZmxvb3Jfb3Blbl90aW1lX21zIjoxNzkwMDAwMDAwMDAwLCJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjd9","reason":"HEADER_FIELDS","detail":"header"},
+ {"name":"latest_header_in_bar_frame","synthetic":true,"head_b64":"UUtTMQIAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"HEADER_FIELDS","detail":"header"},
+ {"name":"source_missing_offset","synthetic":true,"head_b64":"UUtTMQEAAAEgeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7InBhcnRpdGlvbiI6MCwidG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIn19","body_record":"trade-okx","reason":"HEADER_FIELDS","detail":"source"},
+ {"name":"legacy_extra_field","synthetic":true,"head_b64":"UUtTMQQAAAH4eyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxlZ2FjeSI6eyJvZmZzZXQiOjEsInNwb29sX2xvZ2ljYWxfb2Zmc2V0IjoyMjUwNiwic3Bvb2xfcGFydGl0aW9uX2tleSI6IjZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjNy9iYXIvb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFtLXByaW1hcnktdjIiLCJzcG9vbF9zdHJlYW0iOiJtZC5jYW5vbmljYWwudjIifSwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8QkFSfDFtIiwibWF0ZXJpYWxpemVyX2Vwb2NoIjoyLCJvcGVuX3RpbWVfbXMiOjE3OTAyNTIxNjAwMDAsInByb3ZlbmFuY2UiOiJsZWdhY3lfaW1wb3J0IiwicmV2aXNpb24iOjB9","body_record":"bar-1m-final-okx","reason":"HEADER_FIELDS","detail":"legacy"},
+ {"name":"content_hash_upper","synthetic":true,"head_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6IkNBREY1MEU0NTJFQzk5NjEyODVEMjgwQTdFNDVCREFDNjA5NEMwRDdEM0I5MTQ3MzQ2RDE0QjU1MERBRUY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"FIELD","detail":"content_sha256"},
+ {"name":"event_id_odd","synthetic":true,"head_b64":"UUtTMQEAAAEUeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6ImFiYyIsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fFRSQURFfC0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjMsInNvdXJjZSI6eyJvZmZzZXQiOjExMjY3MDQsInBhcnRpdGlvbiI6NCwidG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIn19","body_record":"trade-okx","reason":"FIELD","detail":"event_id"},
+ {"name":"event_id_empty","synthetic":true,"head_b64":"UUtTMQEAAAEReyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IiIsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fFRSQURFfC0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjMsInNvdXJjZSI6eyJvZmZzZXQiOjExMjY3MDQsInBhcnRpdGlvbiI6NCwidG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIn19","body_record":"trade-okx","reason":"FIELD","detail":"event_id"},
+ {"name":"is_final_integer","synthetic":true,"head_b64":"UUtTMQIAAAFneyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOjEsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"is_final"},
+ {"name":"open_time_float","synthetic":true,"head_b64":"UUtTMQIAAAFseyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLjAsInJldmlzaW9uIjowLCJzb3VyY2UiOnsib2Zmc2V0IjoxMDcxMjcxLCJwYXJ0aXRpb24iOjksInRvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyJ9fQ==","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"open_time_ms"},
+ {"name":"open_time_string","synthetic":true,"head_b64":"UUtTMQIAAAFseyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoiMTc5MDI1MjE2MDAwMCIsInJldmlzaW9uIjowLCJzb3VyY2UiOnsib2Zmc2V0IjoxMDcxMjcxLCJwYXJ0aXRpb24iOjksInRvcGljX2lkIjoibGpmalBZQXBScFdRZDc5TWNmVHRaZyJ9fQ==","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"open_time_ms"},
+ {"name":"open_time_bool","synthetic":true,"head_b64":"UUtTMQIAAAFheyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjp0cnVlLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"open_time_ms"},
+ {"name":"revision_above_u32","synthetic":true,"head_b64":"UUtTMQIAAAFzeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6NDI5NDk2NzI5Niwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"revision"},
+ {"name":"epoch_zero","synthetic":true,"frame_b64":"UUtTMQMAAACDeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MH0=","reason":"FIELD","detail":"materializer_epoch"},
+ {"name":"epoch_above_i63","synthetic":true,"frame_b64":"UUtTMQMAAACVeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6OTIyMzM3MjAzNjg1NDc3NTgwOH0=","reason":"FIELD","detail":"materializer_epoch"},
+ {"name":"epoch_above_u64","synthetic":true,"frame_b64":"UUtTMQMAAACWeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MTg0NDY3NDQwNzM3MDk1NTE2MTZ9","reason":"FIELD","detail":"materializer_epoch"},
+ {"name":"floor_minus_zero","synthetic":true,"frame_b64":"UUtTMQMAAAB4eyJmbG9vcl9vcGVuX3RpbWVfbXMiOi0wLCJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjd9","reason":"FIELD","detail":"floor_open_time_ms"},
+ {"name":"floor_negative","synthetic":true,"frame_b64":"UUtTMQMAAAB4eyJmbG9vcl9vcGVuX3RpbWVfbXMiOi0xLCJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjd9","reason":"FIELD","detail":"floor_open_time_ms"},
+ {"name":"source_partition_above_i31","synthetic":true,"head_b64":"UUtTMQEAAAE6eyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjoyMTQ3NDgzNjQ4LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"FIELD","detail":"source.partition"},
+ {"name":"source_offset_above_i63","synthetic":true,"head_b64":"UUtTMQEAAAE9eyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6OTIyMzM3MjAzNjg1NDc3NTgwOCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"FIELD","detail":"source.offset"},
+ {"name":"source_topic_charset","synthetic":true,"head_b64":"UUtTMQEAAAEeeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImEgYiJ9fQ==","body_record":"trade-okx","reason":"FIELD","detail":"source.topic_id"},
+ {"name":"source_not_object","synthetic":true,"head_b64":"UUtTMQEAAADweyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjpbMV19","body_record":"trade-okx","reason":"FIELD","detail":"source"},
+ {"name":"lpk_lowercase_venue","synthetic":true,"head_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxva3h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"FIELD","detail":"lpk"},
+ {"name":"lpk_wrong_version","synthetic":true,"head_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMnxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"FIELD","detail":"lpk"},
+ {"name":"provenance_wrong","synthetic":true,"head_b64":"UUtTMQQAAAHpeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxlZ2FjeSI6eyJzcG9vbF9sb2dpY2FsX29mZnNldCI6MjI1MDYsInNwb29sX3BhcnRpdGlvbl9rZXkiOiI2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcvYmFyL29reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLWJhci0xbS1wcmltYXJ5LXYyIiwic3Bvb2xfc3RyZWFtIjoibWQuY2Fub25pY2FsLnYyIn0sImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Miwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJwcm92ZW5hbmNlIjoiY2Fub25pY2FsIiwicmV2aXNpb24iOjB9","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"provenance"},
+ {"name":"legacy_offset_negative","synthetic":true,"head_b64":"UUtTMQQAAAHqeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxlZ2FjeSI6eyJzcG9vbF9sb2dpY2FsX29mZnNldCI6LTEsInNwb29sX3BhcnRpdGlvbl9rZXkiOiI2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcvYmFyL29reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLWJhci0xbS1wcmltYXJ5LXYyIiwic3Bvb2xfc3RyZWFtIjoibWQuY2Fub25pY2FsLnYyIn0sImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Miwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJwcm92ZW5hbmNlIjoibGVnYWN5X2ltcG9ydCIsInJldmlzaW9uIjowfQ==","body_record":"bar-1m-final-okx","reason":"FIELD","detail":"legacy.spool_logical_offset"},
+ {"name":"header_whitespace","synthetic":true,"frame_b64":"UUtTMQMAAACFeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsICJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCAibWF0ZXJpYWxpemVyX2Vwb2NoIjo3fQ==","reason":"NON_CANONICAL","detail":""},
+ {"name":"header_unsorted","synthetic":true,"frame_b64":"UUtTMQMAAACDeyJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjcsImZsb29yX29wZW5fdGltZV9tcyI6MTc5MDAwMDAwMDAwMH0=","reason":"NON_CANONICAL","detail":""},
+ {"name":"header_duplicate_key","synthetic":true,"frame_b64":"UUtTMQMAAACaeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6NywibWF0ZXJpYWxpemVyX2Vwb2NoIjo3fQ==","reason":"NON_CANONICAL","detail":""},
+ {"name":"header_escaped_char","synthetic":true,"frame_b64":"UUtTMQMAAACIeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cFx1MDA2MXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8QkFSfDFtIiwibWF0ZXJpYWxpemVyX2Vwb2NoIjo3fQ==","reason":"NON_CANONICAL","detail":""},
+ {"name":"floor_with_body","synthetic":true,"frame_b64":"UUtTMQMAAACDeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6N30A","reason":"BODY","detail":""},
+ {"name":"latest_without_body","synthetic":true,"frame_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","reason":"BODY","detail":""},
+ {"name":"body_tampered","synthetic":true,"frame_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0KFHFkbC5tYXJrZXRkYXRhLnRyYWRlEAIiECR0tuGiLbGy16RW1a7GxskqJDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjNzIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBQgNPS1hKBFNXQVBSCVBFUlBFVFVBTFoORE9HRS1VU0RULVNXQVBiCk9LWF9ESVJFQ1RqKG9reC1zd2FwLWRvZ2UtdXNkdC1zd2FwLXRyYWRlLXByaW1hcnktdjJwAXgBgAHAvavA0p2Q7BiIAZmxlNDSnZDsGJABmbGU0NKdkOwYmAGZsZTQ0p2Q7BiiAQoxMzUyMDIxODk4qAHByZP17p0tsgETcWRsLXJ1c3QtY29yZS8yLjAuMLoBDG9reC12NS8yLjAuMMoBIAtKtJcfomadpGtHhT4lC3FzebMFvUVlVyO2Ds2FKLB60gEgM2ZkNGJmNDFhZTA3MDYyZDFkZGMxOGQ5N2M3NTAzZDPYARDiASVva3gtcHVibGljLTAwMi05Mi0xNzkwMjQzMjgxNzM2MDk2NzAz6AFc8AEB+AEBggIgUbNn2Tv136DpYPw4L3vielxND+POjOYQjRNDqqu3HVSKAhA/1L9BrgcGLR3cGNl8dQPTwgIvCgoxMzUyMDIxODk4Eg8I6pABEAoiBzAuMDkyNjkaCggcEAQiBDAuMTQgATgDQAA=","reason":"CONTENT_HASH","detail":""},
+ {"name":"body_not_protobuf","synthetic":true,"frame_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImFkOTUxMzFiYzBiNzk5YzBiMWFmNDc3ZmIxNGZjZjI2YTZhOWY3NjA3OWU0OGJmMDkwYWNiN2U4MzY3YmZkMGUiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX3/////","reason":"ENVELOPE","detail":""},
+ {"name":"bar_frame_trade_body","synthetic":true,"head_b64":"UUtTMQIAAAFqeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"NOT_BAR","detail":""},
+ {"name":"latest_other_uid","synthetic":true,"head_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjI0NzRiNmUxYTIyZGIxYjJkN2E0NTZkNWFlYzZjNmM5IiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"PRODUCT_MISMATCH","detail":"instrument_uid"},
+ {"name":"bar_other_interval","synthetic":true,"head_b64":"UUtTMQIAAAFqeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnw3bSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"bar-1m-final-okx","reason":"PRODUCT_MISMATCH","detail":"qualifier"},
+ {"name":"floor_not_bar_product","synthetic":true,"frame_b64":"UUtTMQMAAACEeyJmbG9vcl9vcGVuX3RpbWVfbXMiOjE3OTAwMDAwMDAwMDAsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fFRSQURFfC0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjd9","reason":"PRODUCT_MISMATCH","detail":"feed"},
+ {"name":"open_time_not_whole_ms","synthetic":true,"frame_b64":"UUtTMQIAAAFqeyJjb250ZW50X3NoYTI1NiI6IjYzYjZjNTI0NmQ2ZTM2NjJkZjZhOWNlMzlmNjBkMDRmYzJiMjY2MWI4YzU0YmNmZTIxNDNlZTUyMGQ0NTQ4YWEiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0KEnFkbC5tYXJrZXRkYXRhLmJhchACIhDU3trBlILdVr5CNYU0Lg3zKiQ2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcyHE9LWC5TV0FQLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIDT0tYSgRTV0FQUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICtgEKAjFtEIGAtLmrm5DsGBjAq5T7ip2Q7BgiDwjqkAEQCiIHMC4wOTI2OSoPCO6QARAKIgcwLjA5MjcxMg8I4JABEAoiBzAuMDkyNjQ6DwjqkAEQCiIHMC4wOTI2OUIOCJTMCBAEIgY3MDQuMTBQAWABaAJ4A4IBEQjQv9sGEAIiCDcwNDEwMC4wigEaCMCY4KHm+wIQECIONjUyNDguOTYwMjAwMDCSAQ4IlMwIEAQiBjcwNC4xMA==","reason":"OPEN_TIME","detail":""},
+ {"name":"event_id_mismatch","synthetic":true,"head_b64":"UUtTMQEAAAExeyJjb250ZW50X3NoYTI1NiI6ImNhZGY1MGU0NTJlYzk5NjEyODVkMjgwYTdlNDViZGFjNjA5NGMwZDdkM2I5MTQ3MzQ2ZDE0YjU1MGRhZWY3NzQiLCJldmVudF9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwibHBrIjoibHBrMXxwYXBlcnxPS1h8U1dBUHw2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzd8VFJBREV8LSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6Mywic291cmNlIjp7Im9mZnNldCI6MTEyNjcwNCwicGFydGl0aW9uIjo0LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"trade-okx","reason":"HEADER_MISMATCH","detail":"event_id"},
+ {"name":"open_time_mismatch","synthetic":true,"head_b64":"UUtTMQIAAAFqeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMjIwMDAwLCJyZXZpc2lvbiI6MCwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"bar-1m-final-okx","reason":"HEADER_MISMATCH","detail":"open_time_ms"},
+ {"name":"revision_mismatch","synthetic":true,"head_b64":"UUtTMQIAAAFqeyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOnRydWUsImxwayI6ImxwazF8cGFwZXJ8T0tYfFNXQVB8NmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3fEJBUnwxbSIsIm1hdGVyaWFsaXplcl9lcG9jaCI6MSwib3Blbl90aW1lX21zIjoxNzkwMjUyMTYwMDAwLCJyZXZpc2lvbiI6MSwic291cmNlIjp7Im9mZnNldCI6MTA3MTI3MSwicGFydGl0aW9uIjo5LCJ0b3BpY19pZCI6ImxqZmpQWUFwUnBXUWQ3OU1jZlR0WmcifX0=","body_record":"bar-1m-final-okx","reason":"HEADER_MISMATCH","detail":"revision"},
+ {"name":"is_final_mismatch","synthetic":true,"head_b64":"UUtTMQIAAAFreyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOmZhbHNlLCJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjEsIm9wZW5fdGltZV9tcyI6MTc5MDI1MjE2MDAwMCwicmV2aXNpb24iOjAsInNvdXJjZSI6eyJvZmZzZXQiOjEwNzEyNzEsInBhcnRpdGlvbiI6OSwidG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIn19","body_record":"bar-1m-final-okx","reason":"HEADER_MISMATCH","detail":"is_final"},
+ {"name":"legacy_is_final_mismatch","synthetic":true,"head_b64":"UUtTMQQAAAHueyJjb250ZW50X3NoYTI1NiI6ImMwZDVmNzIyMmQ5OTY1ZDVkMzMyMzJiZDJhMmY1YTFjOGRmYTllZWMzY2RmNTU4NDUzMWVkYzBkNGZkNDhjM2YiLCJldmVudF9pZCI6ImQ0ZGVkYWMxOTQ4MmRkNTZiZTQyMzU4NTM0MmUwZGYzIiwiaXNfZmluYWwiOmZhbHNlLCJsZWdhY3kiOnsic3Bvb2xfbG9naWNhbF9vZmZzZXQiOjIyNTA2LCJzcG9vbF9wYXJ0aXRpb25fa2V5IjoiNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3L2Jhci9va3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MiIsInNwb29sX3N0cmVhbSI6Im1kLmNhbm9uaWNhbC52MiJ9LCJscGsiOiJscGsxfHBhcGVyfE9LWHxTV0FQfDZjN2M5MjU2LTI5MDUtNWM3NS1hMTQ5LWZhMGFjMzZiYmJjN3xCQVJ8MW0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjIsIm9wZW5fdGltZV9tcyI6MTc5MDI1MjE2MDAwMCwicHJvdmVuYW5jZSI6ImxlZ2FjeV9pbXBvcnQiLCJyZXZpc2lvbiI6MH0=","body_record":"bar-1m-final-okx","reason":"HEADER_MISMATCH","detail":"is_final"},
+ {"name":"latest_other_feed","synthetic":true,"head_b64":"UUtTMQEAAAE1eyJjb250ZW50X3NoYTI1NiI6IjVmOWNkMzM0MDNiN2U3Nzg2YmE0NDU4OTBjMDEyMWU2YjcyY2Q5NDM5MzQyNTEzODJkYmE1MGY2MDFhZTRmYTIiLCJldmVudF9pZCI6ImFkZjhhYjIyOTJkMTQ5YWJlYTk4MGI1NTViOTk0NDRkIiwibHBrIjoibHBrMXxwYXBlcnxCSU5BTkNFfFVTRE18OGFlZGQzNDktNjk5OS01ODc0LWIwZGQtMzRjNjQ1MWMwYjNhfFRSQURFfC0iLCJtYXRlcmlhbGl6ZXJfZXBvY2giOjMsInNvdXJjZSI6eyJvZmZzZXQiOjExMzQ2MjMsInBhcnRpdGlvbiI6NSwidG9waWNfaWQiOiJsamZqUFlBcFJwV1FkNzlNY2ZUdFpnIn19","body_record":"quote-binance","reason":"PRODUCT_MISMATCH","detail":"feed"}
+ ],
+ "invalid_bar_rows":[
+ {"name":"row_short","synthetic":true,"row_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw=","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"TRUNCATED","detail":""},
+ {"name":"row_epoch_zero","synthetic":true,"row_b64":"AAAAAAAQWKcAAAAAAAAAAMDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICsgEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABYAFoAngDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"TRAILER","detail":""},
+ {"name":"row_offset_above_i63","synthetic":true,"row_b64":"gAAAAAAAAAAAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICsgEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABYAFoAngDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"TRAILER","detail":""},
+ {"name":"row_body_not_protobuf","synthetic":true,"row_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw//////w==","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"ENVELOPE","detail":""},
+ {"name":"row_trade_body","synthetic":true,"head_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/","body_record":"trade-okx","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"NOT_BAR","detail":""},
+ {"name":"row_unstripped_canonical","synthetic":true,"head_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/","body_record":"bar-1m-final-okx","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"NON_CANONICAL","detail":""},
+ {"name":"row_other_product","synthetic":true,"row_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICsgEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABYAFoAngDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEw","lpk":"lpk1|paper|OKX|SWAP|00000000-0000-0000-0000-000000000000|BAR|1m","reason":"CONTENT_HASH","detail":""},
+ {"name":"row_body_tampered","synthetic":true,"row_b64":"AAAAAAAQWKcAAAAAAAAAAcDV9yItmWXV0zIyvSovWhyN+p7sPN9VhFMe3A1P1Iw/ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8zIcT0tYLlNXQVAuUEVSUEVUVUFMLkRPR0UtVVNEVDgBUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUailva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC1iYXItMW0tcHJpbWFyeS12MnABeAGAAYCAtLmrm5DsGIgBnPS7sY6dkOwYkAGc9Luxjp2Q7BiYAZz0u7GOnZDsGKIBDzE3OTAyNTIxNjAwMDA6MagBwf7hhb3SG7IBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDCAQEJygEgNKUxLk/R7fRrLNHlKGlNsPQEOoaW6Z63eNPDka728QPSASAzZjYxZTY5NjhlYTk1MGZiYWVkNDllOWE1NGJiY2ZkOdgBEOIBJ29reC1idXNpbmVzcy0wMDEtNDgtMTc5MDI0NTI4MzA1NjkyMzgwNugBMPABAfgBAYICIHVDoBehkJAwF8PGqUlqKdVIspcs4R0HZ9B58oH8/5RwigIQP2Hmlo6pUPuu1J6aVLvP2dICsgEQgIC0uaubkOwYGMCrlPuKnZDsGCIPCOqQARAKIgcwLjA5MjY5Kg8I7pABEAoiBzAuMDkyNzEyDwjgkAEQCiIHMC4wOTI2NDoPCOqQARAKIgcwLjA5MjY5Qg4IlMwIEAQiBjcwNC4xMFABYAFoAngDggERCNC/2wYQAiIINzA0MTAwLjCKARoIwJjgoeb7AhAQIg42NTI0OC45NjAyMDAwMJIBDgiUzAgQBCIGNzA0LjEx","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","reason":"CONTENT_HASH","detail":""}
+ ],
+ "invalid_latest_values":[
+ {"name":"value_short","synthetic":true,"value_b64":"AAAAAAAAAAUAAA==","reason":"TRUNCATED","detail":""},
+ {"name":"value_epoch_zero","synthetic":true,"value_b64":"AAAAAAAAAAUAAAAAAAAAAMrfUORS7JlhKF0oCn5FvaxglMDX07kUc0bRS1UNrvd0ChRxZGwubWFya2V0ZGF0YS50cmFkZRACIhAkdLbhoi2xstekVtWuxsbJKiQ2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcyHE9LWC5TV0FQLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIDT0tYSgRTV0FQUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUaihva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC10cmFkZS1wcmltYXJ5LXYycAF4AYABwL2rwNKdkOwYiAGZsZTQ0p2Q7BiQAZmxlNDSnZDsGJgBmbGU0NKdkOwYogEKMTM1MjAyMTg5OKgBwcmT9e6dLbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDKASALSrSXH6JmnaRrR4U+JQtxc3mzBb1FZVcjtg7NhSiwetIBIDNmZDRiZjQxYWUwNzA2MmQxZGRjMThkOTdjNzUwM2Qz2AEQ4gElb2t4LXB1YmxpYy0wMDItOTItMTc5MDI0MzI4MTczNjA5NjcwM+gBXPABAfgBAYICIFGzZ9k79d+g6WD8OC974npcTQ/jzozmEI0TQ6qrtx1UigIQP9S/Qa4HBi0d3BjZfHUD08ICLwoKMTM1MjAyMTg5OBIPCOqQARAKIgcwLjA5MjY5GgoIHBAEIgQwLjE0IAE4A0AB","reason":"TRAILER","detail":""},
+ {"name":"value_without_body","synthetic":true,"value_b64":"AAAAAAAAAAUAAAAAAAAAAcrfUORS7JlhKF0oCn5FvaxglMDX07kUc0bRS1UNrvd0","reason":"BODY","detail":""},
+ {"name":"value_tampered","synthetic":true,"value_b64":"AAAAAAAAAAUAAAAAAAAAAcrfUORS7JlhKF0oCn5FvaxglMDX07kUc0bRS1UNrvd0ChRxZGwubWFya2V0ZGF0YS50cmFkZRACIhAkdLbhoi2xstekVtWuxsbJKiQ2YzdjOTI1Ni0yOTA1LTVjNzUtYTE0OS1mYTBhYzM2YmJiYzcyHE9LWC5TV0FQLlBFUlBFVFVBTC5ET0dFLVVTRFQ4AUIDT0tYSgRTV0FQUglQRVJQRVRVQUxaDkRPR0UtVVNEVC1TV0FQYgpPS1hfRElSRUNUaihva3gtc3dhcC1kb2dlLXVzZHQtc3dhcC10cmFkZS1wcmltYXJ5LXYycAF4AYABwL2rwNKdkOwYiAGZsZTQ0p2Q7BiQAZmxlNDSnZDsGJgBmbGU0NKdkOwYogEKMTM1MjAyMTg5OKgBwcmT9e6dLbIBE3FkbC1ydXN0LWNvcmUvMi4wLjC6AQxva3gtdjUvMi4wLjDKASALSrSXH6JmnaRrR4U+JQtxc3mzBb1FZVcjtg7NhSiwetIBIDNmZDRiZjQxYWUwNzA2MmQxZGRjMThkOTdjNzUwM2Qz2AEQ4gElb2t4LXB1YmxpYy0wMDItOTItMTc5MDI0MzI4MTczNjA5NjcwM+gBXPABAfgBAYICIFGzZ9k79d+g6WD8OC974npcTQ/jzozmEI0TQ6qrtx1UigIQP9S/Qa4HBi0d3BjZfHUD08ICLwoKMTM1MjAyMTg5OBIPCOqQARAKIgcwLjA5MjY5GgoIHBAEIgQwLjE0IAE4A0AA","reason":"CONTENT_HASH","detail":""}
+ ],
+ "refused_encodes":[
+ {"name":"bar_row_trade","synthetic":true,"op":"bar_row","canonical_record":"trade-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"NOT_BAR","detail":""},
+ {"name":"bar_row_other_uid","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|00000000-0000-0000-0000-000000000000|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"PRODUCT_MISMATCH","detail":"instrument_uid"},
+ {"name":"bar_row_other_interval","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|7m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"PRODUCT_MISMATCH","detail":"qualifier"},
+ {"name":"bar_row_feed_trade","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"PRODUCT_MISMATCH","detail":"feed"},
+ {"name":"bar_row_epoch_zero","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":0,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"TRAILER","detail":""},
+ {"name":"bar_row_offset_above_i63","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":9223372036854775808,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"TRAILER","detail":""},
+ {"name":"bar_row_garbage","synthetic":true,"op":"bar_row","canonical_b64":"/////w==","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"ENVELOPE","detail":""},
+ {"name":"bar_row_unknown_field","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"b83e01","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"ENVELOPE_NOT_CANONICAL","detail":""},
+ {"name":"bar_row_repeated_scalar","synthetic":true,"op":"bar_row","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"1800","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"ENVELOPE_NOT_CANONICAL","detail":""},
+ {"name":"latest_value_empty","synthetic":true,"op":"latest_value","canonical_b64":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"BODY","detail":""},
+ {"name":"latest_value_epoch_above_i63","synthetic":true,"op":"latest_value","canonical_record":"trade-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":9223372036854775808,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"TRAILER","detail":""},
+ {"name":"latest_frame_empty","synthetic":true,"op":"LATEST","canonical_b64":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":5},"reason":"BODY","detail":""},
+ {"name":"latest_frame_other_venue","synthetic":true,"op":"LATEST","canonical_record":"trade-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|DERIBIT|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":5},"reason":"PRODUCT_MISMATCH","detail":"venue"},
+ {"name":"latest_frame_partition_above_i31","synthetic":true,"op":"LATEST","canonical_record":"trade-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":2147483648,"offset":5},"reason":"FIELD","detail":"source.partition"},
+ {"name":"latest_frame_epoch_zero","synthetic":true,"op":"LATEST","canonical_record":"trade-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":0,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":5},"reason":"FIELD","detail":"materializer_epoch"},
+ {"name":"bar_frame_trade","synthetic":true,"op":"BAR_REVISION","canonical_record":"trade-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":5},"reason":"NOT_BAR","detail":""},
+ {"name":"bar_frame_unaligned_open","synthetic":true,"op":"BAR_REVISION","canonical_b64":"ChJxZGwubWFya2V0ZGF0YS5iYXIQAiIQ1N7awZSC3Va+QjWFNC4N8yokNmM3YzkyNTYtMjkwNS01Yzc1LWExNDktZmEwYWMzNmJiYmM3MhxPS1guU1dBUC5QRVJQRVRVQUwuRE9HRS1VU0RUOAFCA09LWEoEU1dBUFIJUEVSUEVUVUFMWg5ET0dFLVVTRFQtU1dBUGIKT0tYX0RJUkVDVGopb2t4LXN3YXAtZG9nZS11c2R0LXN3YXAtYmFyLTFtLXByaW1hcnktdjJwAXgBgAGAgLS5q5uQ7BiIAZz0u7GOnZDsGJABnPS7sY6dkOwYmAGc9Luxjp2Q7BiiAQ8xNzkwMjUyMTYwMDAwOjGoAcH+4YW90huyARNxZGwtcnVzdC1jb3JlLzIuMC4wugEMb2t4LXY1LzIuMC4wwgEBCcoBIDSlMS5P0e30ayzR5ShpTbD0BDqGlumet3jTw5Gu9vED0gEgM2Y2MWU2OTY4ZWE5NTBmYmFlZDQ5ZTlhNTRiYmNmZDnYARDiASdva3gtYnVzaW5lc3MtMDAxLTQ4LTE3OTAyNDUyODMwNTY5MjM4MDboATDwAQH4AQGCAiB1Q6AXoZCQMBfDxqlJainVSLKXLOEdB2fQefKB/P+UcIoCED9h5paOqVD7rtSemlS7z9nSArYBCgIxbRCBgLS5q5uQ7BgYwKuU+4qdkOwYIg8I6pABEAoiBzAuMDkyNjkqDwjukAEQCiIHMC4wOTI3MTIPCOCQARAKIgcwLjA5MjY0Og8I6pABEAoiBzAuMDkyNjlCDgiUzAgQBCIGNzA0LjEwUAFgAWgCeAOCAREI0L/bBhACIgg3MDQxMDAuMIoBGgjAmOCh5vsCEBAiDjY1MjQ4Ljk2MDIwMDAwkgEOCJTMCBAEIgY3MDQuMTA=","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"source":{"topic_id":"ljfjPYApRpWQd79McfTtZg","partition":0,"offset":5},"reason":"OPEN_TIME","detail":""},
+ {"name":"legacy_frame_market","synthetic":true,"op":"LEGACY_BAR","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SPOT|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"PRODUCT_MISMATCH","detail":"market"},
+ {"name":"legacy_frame_bad_stream","synthetic":true,"op":"LEGACY_BAR","canonical_record":"bar-1m-final-okx","canonical_suffix_hex":"","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md canonical","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"reason":"FIELD","detail":"legacy.spool_stream"},
+ {"name":"floor_trade_product","synthetic":true,"op":"RETENTION_FLOOR","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"floor_open_time_ms":0,"reason":"PRODUCT_MISMATCH","detail":"feed"},
+ {"name":"floor_epoch_zero","synthetic":true,"op":"RETENTION_FLOOR","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":0,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"floor_open_time_ms":0,"reason":"FIELD","detail":"materializer_epoch"},
+ {"name":"floor_above_i63","synthetic":true,"op":"RETENTION_FLOOR","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"floor_open_time_ms":9223372036854775808,"reason":"FIELD","detail":"floor_open_time_ms"},
+ {"name":"partition_count_zero","synthetic":true,"op":"partition","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"partitions":0,"reason":"PARTITIONS","detail":""},
+ {"name":"partition_count_above_i31","synthetic":true,"op":"partition","lpk":"lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BAR|1m","source_offset":5,"materializer_epoch":1,"spool_stream":"md.canonical.v2","spool_partition_key":"6c7c9256-2905-5c75-a149-fa0ac36bbbc7/bar/okx-swap-doge-usdt-swap-bar-1m-primary-v2","spool_offset":22506,"partitions":2147483648,"reason":"PARTITIONS","detail":""}
+ ]
+}
diff --git a/contracts/golden/kn_v220/state_contract.json b/contracts/golden/kn_v220/state_contract.json
new file mode 100644
index 00000000..1157eb18
--- /dev/null
+++ b/contracts/golden/kn_v220/state_contract.json
@@ -0,0 +1,663 @@
+{
+ "bar_revision": [
+ {
+ "current": null,
+ "decision": "APPLY",
+ "incoming": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "empty_row"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "STALE_IN_PROGRESS",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 11,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "final_not_replaced_by_in_progress"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "APPLY",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 0,
+ "source": {
+ "offset": 11,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "in_progress_finalized"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "APPLY",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 11,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "in_progress_newer_offset"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "STALE",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 9,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "in_progress_older_offset"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "NOT_COMPARABLE",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": false,
+ "revision": 0,
+ "source": {
+ "offset": 11,
+ "partition": 4,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "in_progress_other_partition"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "APPLY",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 5000,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "late_repair_higher_revision"
+ },
+ {
+ "current": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 5000,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "STALE_REVISION",
+ "incoming": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 0,
+ "source": {
+ "offset": 5001,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "lower_revision_after_repair"
+ },
+ {
+ "current": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 5000,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "DUPLICATE",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 5002,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "equal_revision_same_content"
+ },
+ {
+ "current": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 5000,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "CONFLICT",
+ "incoming": {
+ "content_sha256": "2e7d2c03a9507ae265ecf5b5356885a53393a2029d241394997265a1a25aefc6",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 5003,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "equal_revision_other_content"
+ },
+ {
+ "current": {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 4294967294,
+ "source": {
+ "offset": 1,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "decision": "APPLY",
+ "incoming": {
+ "content_sha256": "3e23e8160039594a33894f6564e1b1348bbd7a0088d42c4acb73eeaed59c009d",
+ "is_final": true,
+ "revision": 4294967295,
+ "source": {
+ "offset": 2,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ "name": "max_uint32_revision"
+ }
+ ],
+ "bar_states_invalid": [
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": 1,
+ "revision": 1,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": "true",
+ "revision": 1,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": true,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 1.0,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 4294967296,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": -1,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb\n",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "CA978112CA1BBDCAFAC231B39A23DC4DA786EFF8147C4E72B9807785AFEE48BB",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48b",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 10,
+ "partition": 3,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ },
+ {
+ "content_sha256": "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "is_final": true,
+ "revision": 1,
+ "source": {
+ "offset": 1,
+ "partition": true,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ }
+ }
+ ],
+ "cache_read_state": [
+ {
+ "entry_generation": 7,
+ "name": "no_generation",
+ "ready_generation": null,
+ "state": "NOT_READY_NO_GENERATION"
+ },
+ {
+ "entry_generation": null,
+ "name": "missing_entry",
+ "ready_generation": 7,
+ "state": "NOT_READY_MISSING"
+ },
+ {
+ "entry_generation": 6,
+ "name": "other_generation",
+ "ready_generation": 7,
+ "state": "NOT_READY_OTHER_GENERATION"
+ },
+ {
+ "entry_generation": 7,
+ "name": "ready",
+ "ready_generation": 7,
+ "state": "READY"
+ }
+ ],
+ "changelog_coordinates_invalid": [
+ {
+ "materializer_epoch": 0,
+ "offset": 0,
+ "partition": 0,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": true,
+ "offset": 0,
+ "partition": 0,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": 1.0,
+ "offset": 0,
+ "partition": 0,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": 1,
+ "offset": 0,
+ "partition": 0,
+ "topic": ""
+ },
+ {
+ "materializer_epoch": 1,
+ "offset": 0,
+ "partition": 1.5,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": 1,
+ "offset": -1,
+ "partition": 0,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": 1,
+ "offset": 0,
+ "partition": 2147483648,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": 1,
+ "offset": 0,
+ "partition": 0,
+ "topic": 7
+ }
+ ],
+ "changelog_coordinates_valid": [
+ {
+ "materializer_epoch": 1,
+ "offset": 0,
+ "partition": 0,
+ "topic": "md.latest.v2"
+ },
+ {
+ "materializer_epoch": 9223372036854775807,
+ "offset": 9223372036854775807,
+ "partition": 2147483647,
+ "topic": "md.bars.v2"
+ }
+ ],
+ "latest_apply": [
+ {
+ "current": null,
+ "decision": "APPLY",
+ "incoming": {
+ "offset": 5,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "name": "empty"
+ },
+ {
+ "current": {
+ "offset": 5,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "decision": "APPLY",
+ "incoming": {
+ "offset": 6,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "name": "newer"
+ },
+ {
+ "current": {
+ "offset": 9223372036854775807,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "decision": "DUPLICATE",
+ "incoming": {
+ "offset": 9223372036854775807,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "name": "duplicate"
+ },
+ {
+ "current": {
+ "offset": 9007199254740993,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "decision": "STALE",
+ "incoming": {
+ "offset": 9007199254740992,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "name": "older"
+ },
+ {
+ "current": {
+ "offset": 5,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "decision": "NOT_COMPARABLE",
+ "incoming": {
+ "offset": 6,
+ "partition": 1,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "name": "other_partition"
+ },
+ {
+ "current": {
+ "offset": 5,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ "decision": "NOT_COMPARABLE",
+ "incoming": {
+ "offset": 6,
+ "partition": 0,
+ "topic_id": "OTHERTOPICIDxxxxxxxxxx"
+ },
+ "name": "recreated_topic"
+ }
+ ],
+ "logical_product_keys": [
+ {
+ "key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-",
+ "name": "okx_swap_btc_trade",
+ "product": {
+ "environment": "paper",
+ "feed": "TRADE",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": null,
+ "market": "SWAP",
+ "venue": "OKX"
+ }
+ },
+ {
+ "key": "lpk1|paper|BINANCE|USDM|a953e16e-7138-5562-b5e8-c337a44d0b65|TRADE|-",
+ "name": "binance_usdm_btc_trade",
+ "product": {
+ "environment": "paper",
+ "feed": "TRADE",
+ "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65",
+ "interval": null,
+ "market": "USDM",
+ "venue": "BINANCE"
+ }
+ },
+ {
+ "key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|BAR|1m",
+ "name": "okx_swap_btc_bar_1m",
+ "product": {
+ "environment": "paper",
+ "feed": "BAR",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": "1m",
+ "market": "SWAP",
+ "venue": "OKX"
+ }
+ },
+ {
+ "key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|BOOK_SNAPSHOT|-",
+ "name": "okx_swap_btc_book_snapshot",
+ "product": {
+ "environment": "paper",
+ "feed": "BOOK_SNAPSHOT",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": null,
+ "market": "SWAP",
+ "venue": "OKX"
+ }
+ },
+ {
+ "key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|BOOK_DELTA|-",
+ "name": "okx_swap_btc_book_delta",
+ "product": {
+ "environment": "paper",
+ "feed": "BOOK_DELTA",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "interval": null,
+ "market": "SWAP",
+ "venue": "OKX"
+ }
+ }
+ ],
+ "logical_product_keys_invalid": [
+ "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE",
+ "lpk2|paper|OKX|SWAP|x|TRADE|-",
+ "lpk1|paper|okx|SWAP|x|TRADE|-",
+ "lpk1|paper|OKX|SWAP|x|TRADE|1 m",
+ "lpk1||OKX|SWAP|x|TRADE|-",
+ "lpk1|paper|OKX|SWAP|x|TRADE|-\n",
+ "lpk1|paper\n|OKX|SWAP|x|TRADE|-",
+ "lpk1|paper|OKX|SWAP|x|TRADE\n|-"
+ ],
+ "schema": "qdl.kn.v220.golden.state-contract.v1",
+ "source_coordinates_invalid": [
+ {
+ "offset": 1,
+ "partition": true,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 1,
+ "partition": 1.0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 1,
+ "partition": "3",
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 1.0,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": false,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": -1,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 9223372036854775808,
+ "partition": 0,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 1,
+ "partition": 2147483648,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 1,
+ "partition": -1,
+ "topic_id": "ljfjPYApRpWQd79McfTtZg"
+ },
+ {
+ "offset": 1,
+ "partition": 0,
+ "topic_id": ""
+ },
+ {
+ "offset": 1,
+ "partition": 0,
+ "topic_id": 5
+ }
+ ]
+}
diff --git a/contracts/v2/kn-v220-contracts.md b/contracts/v2/kn-v220-contracts.md
new file mode 100644
index 00000000..d7244237
--- /dev/null
+++ b/contracts/v2/kn-v220-contracts.md
@@ -0,0 +1,246 @@
+# KN V2.2.0 Frozen Contracts (KN-1 K1.3)
+
+Normative spec for the Kafka-native Rust-first read plane. Implementations:
+`qdl/replay/cursor_v3.py`, `qdl/projection/state_contract.py` (Python) and
+`rust/qdl-contracts/src/{cursor_v3,state_contract,requirement}.rs` (Rust). Oracle:
+`contracts/golden/kn_v220/*.json`, read by `tests/test_kn_v220_contracts.py`
+and the Rust unit tests. Design context: guide section 18.4-18.5
+(`upgrade/DATA_LAYER_V2_KAFKA_NATIVE_ARCHITECTURE_REVIEW.md#kn-contracts-and-correctness`).
+Public HTTP/gRPC field shapes do not change; the token stays opaque.
+
+## 1. Cursor v3
+
+**Encoding.** `token = b64url(body) "." b64url(HMAC-SHA256(key[key_id], body))`,
+base64url without padding and with canonical trailing bits. `body` is a JSON
+object: keys sorted by byte value, no whitespace, `,` and `:` separators;
+every value is either a string matching `[A-Za-z0-9._:/@|+=-]{1,256}` (never
+escaped) or a decimal unsigned integer `0..2^63-1` (never a float or bool).
+Verification uses the received body bytes; a validly signed body that does
+not re-encode byte-for-byte is `NON_CANONICAL`. Every pattern in this document is a
+**full match** of the whole string (Python `fullmatch`, never `match` with
+`$`, which also accepts a trailing `\n`).
+
+**Claims** (all required, no others): `schema="qdl.handoff-cursor.v3"`,
+`key_id`, `environment`, `consumer_id`, `requirement_digest` (64 lowercase
+hex), `schema_major`, `stream`, `product_key` (section 3), `snapshot_id`,
+`source_topic_id`, `source_partition`, `source_offset` (last canonical offset
+applied to the snapshot view; replay starts strictly after it),
+`partition_plan_epoch`, `source_policy_revision`, `catalog_revision`,
+`route_generation`, `issued_at_ns`, `expires_at_ns` (> issued).
+
+**Verification order and outcomes** (first failure wins, identical in both
+languages):
+
+| Step | Failure | Outcome |
+|---|---|---|
+| shape: one `.`, <= 4096 bytes, both parts canonical base64url, UTF-8 JSON object, no NaN/Infinity | `ENCODING` | INVALID |
+| `schema` is v1/v2 (spool offsets) | `LEGACY_SCHEMA` | **EXPIRED** |
+| `schema` is anything else but v3, including a non-string (array, object, number) | `SCHEMA` | INVALID |
+| `key_id` unknown | `UNKNOWN_KEY` | INVALID |
+| HMAC mismatch | `SIGNATURE` | INVALID |
+| field set not exact | `FIELDS` | INVALID |
+| per field, dataclass order: integer type/range, string charset; digest hex; expiry > issue | `FIELD_RANGE` / `FIELD_CHARSET` | INVALID |
+| body not canonical | `NON_CANONICAL` | INVALID |
+| consumer != authenticated consumer | `CONSUMER` | INVALID |
+| environment != request and replica | `ENVIRONMENT` | INVALID |
+| digest != request requirement digest | `REQUIREMENT` | INVALID |
+| schema major, stream, topic id, plan epoch, source-policy, catalog, route generation (in this order) | `SCHEMA_MAJOR` ... `ROUTE_GENERATION` | **EXPIRED** |
+| `now >= expires_at_ns` | `EXPIRED` | **EXPIRED** |
+
+**Replay (no requirement).** `ReplayRequest` carries no requirement, so
+Replay verifies with the same order minus the digest comparison
+(`verify_scope`) and then binds the claims' `product_key` to a catalog binding
+and the consumer's feed scope (`require_feed_scope`), as the Python Replay
+does; Subscribe always compares the digest.
+
+EXPIRED is gRPC `OUT_OF_RANGE` and the SDK answers it with a fresh snapshot
+(`qdl_sdk/client.py` `CursorExpiredError`). INVALID is `INVALID_ARGUMENT`, on
+which the SDK raises; a normal migration or rollback must never produce it.
+Only the active key signs; any configured key verifies (rotation).
+
+**First-record bootstrap (Astra KN-2 R2).** Offset zero is a valid canonical
+record and a valid snapshot watermark. Cursor v3 is a *snapshot handoff*, not
+an archive iterator with a before-first position: the snapshot/warmup must
+already include the state through its claimed source offset, including zero.
+Only then may it issue a cursor at zero; Subscribe/Replay return offsets
+strictly greater than zero. Empty or insufficient product state returns typed
+`DATA_NOT_READY` without a cursor, never a manufactured empty snapshot at zero.
+A new partition follows the same rule. Archive recovery may read Kafka from
+offset zero internally; it must not invent a public negative/shifted offset.
+No genesis record is required, and a data record at zero is not corruption.
+KN-2 tests this boundary with a fixture ReadView; actual persisted snapshot
+coverage and SDK handoff remain the already planned KN-3/KN-4 integration.
+
+**Requirement digest.** SHA-256 over UTF-8 lines joined by `\n`:
+`qdl.requirement-digest.v1`, then `name=value` for `instrument_uid`, `feed`,
+`interval`, `consumer_grade`, `source_policy_id`, `max_freshness_ms`,
+`event_recency_policy`, `max_session_liveness_ms`, `require_full_coverage`,
+`require_final_bars`, `stale_policy`, `gap_policy`, `recovery`,
+`bar_revision_policy`. Enum names drop the proto prefix; absent/zero optional
+values are empty; booleans are `true`/`false`. The warmup horizon is excluded.
+Rust derives it from the proto exactly as `requirement_from_proto` does,
+and only for a requirement that passed the validation below.
+
+**Requirement validation.** A requirement is validated before it is digested
+or served, in the Python order: proto enums (unknown wire number ->
+`ENUM_UNKNOWN`, then UNSPECIFIED for feed, grade, stale, gap, recovery,
+revision; `event_recency_policy` UNSPECIFIED means absent), warmup horizon and
+interval-source policy, `WarmupTimeRange`, `WarmupSpecification` bounds, then
+`DataRequirement.__post_init__` (blank = Python `str.strip`, which includes
+U+001C..U+001F). Each refusal has a stable rule code;
+`contracts/golden/kn_v220/requirement_validation.json` holds every rule,
+numeric edges on both sides and multi-violation `order_*` cases that pin which
+rule is reported first, produced by the Python server path; both languages
+assert the rule and the message prefix (`rule_messages`). Refusal is
+`INVALID_ARGUMENT` with the Python message.
+
+## 2. Coordinates
+
+- **Source coordinate** `(topic_id, partition, offset)`: the committed
+ canonical record a state derives from. Only this appears in cursors and
+ watermarks.
+- **Changelog coordinate** `(topic, partition, offset, materializer_epoch)`:
+ where a derived state record sits. Delivery metadata, never a cursor.
+- Decoding is strict in both languages: exactly the named fields; integers
+ are JSON integers (never `true`, never `1.0`, never a string); partition
+ `0..2^31-1`, offsets `0..2^63-1`, `materializer_epoch >= 1`; topic names are
+ non-empty strings. A BAR state's `is_final` is a boolean, `revision` a
+ uint32 and `content_sha256` 64 lowercase hex.
+- Offsets compare only inside one `(topic_id, partition)`; across topic
+ identities or partitions the result is `NOT_COMPARABLE` and the sink fence
+ decides. Offset gaps from filtering or transaction markers are valid; source
+ gaps are proven from source sequence, never from `offset == previous + 1`.
+
+## 3. Logical product key
+
+`lpk1|environment|VENUE|MARKET|instrument_uid|FEED|qualifier`; fields match
+`[A-Za-z0-9._:-]{1,96}`; venue, market and feed are upper-case enum names;
+qualifier is the interval, or `-`. BOOK_SNAPSHOT and BOOK_DELTA are distinct
+products even though they share one physical Kafka key.
+
+## 4. State rules
+
+**Latest apply (stage B):** empty -> APPLY; higher offset -> APPLY; equal ->
+DUPLICATE; lower -> STALE; other topic/partition -> NOT_COMPARABLE.
+
+**BAR revision** (per product and open time): empty -> APPLY; final then
+in-progress -> STALE_IN_PROGRESS; in-progress then final -> APPLY; two
+in-progress -> latest-apply by source coordinate; two final: higher revision
+-> APPLY, lower -> STALE_REVISION, equal and same canonical payload hash ->
+DUPLICATE, equal and different -> CONFLICT (never last-write-wins). Revision
+facts are append-only; the current index holds one row per open time.
+
+**BAR cache row** (current index, one row per open time): the canonical
+EventEnvelope bytes without the LPK-derived fields (instrument uid, venue,
+market, bar interval), behind a 48-byte trailer (source offset u64,
+materializer epoch u64, SHA-256 of the canonical bytes). Decoding restores
+those four fields from the product's LPK and must reproduce the canonical
+bytes whose hash is stored; any other field (schema version, provider, source
+id/role, symbol, instrument id/revision, provenance) may differ between rows of
+one product and is always kept in the row. A row whose uid/venue/market/
+interval differ from its key is refused.
+
+**Cache read state:** no published ready generation ->
+NOT_READY_NO_GENERATION; entry missing -> NOT_READY_MISSING; entry from
+another generation -> NOT_READY_OTHER_GENERATION; else READY. Missing data is
+typed, never a default value.
+
+## 5. Rebuild epoch and read consistency (binding on KN-3/KN-4)
+
+Frozen after Astra review R2 (2026-09-24): the ready generation is **per
+product**, not global. Guide 18.4.4 allows it because every public read is
+coherent per product and no read promises a cross-product snapshot.
+
+- **Per-product ready pointer and fence.** Each logical product key has one
+ ready pointer `(generation, fence)`. A rebuild of a product allocates a new
+ generation, captures that product's committed canonical boundary, restores
+ latest state / BAR retention floor from the state topics, tails to the
+ boundary, verifies coverage, then publishes the pointer atomically (one
+ compare-and-set on the pointer; the fence increases monotonically). A whole
+ cache rebuild is a sequence of product swaps, one product in staging at a
+ time.
+- **Stale writers are rejected.** Every cache write carries the product's
+ generation and fence; a write whose fence is lower than the pointer's, or
+ whose generation is not the pointer's staging/ready generation, is refused
+ (typed, counted). A writer never re-publishes a pointer it did not hold.
+- **No mixed view.** Payload, quality, watermark and generation of one product
+ are read from one versioned view. A multi-page warmup pins the product's
+ generation; if the pointer changes, it detects the change and retries
+ within a bound (at most the warmup deadline, <= 120 s), else fails typed. It
+ never merges rows of two generations. `require_all` batches keep per-item
+ watermarks; they are not an atomic global snapshot, and during a full
+ rebuild different products may be at different generations.
+- **Memory is counted until reclaimed.** A superseded product generation is
+ deleted after its swap and counted against the cache budget until its
+ memory is physically reclaimed; the next product's staging starts only
+ after that. Peak = steady + two largest products (budget `market_cache`).
+- **Cache generation is not the cursor generation.** A cache generation or
+ fence never enters a public cursor; a rebuild does not reset consumers whose
+ cursor contract is still valid, and cursor v3 validity never depends on it.
+- Readiness is per product: a global flag never hides a missing key.
+
+## 6. Stream delivery policy (binding on KN-2 and every materializer)
+
+`contracts/golden/kn_v220/delivery_policy.json`, produced from
+`qdl.ingestion.contracts.delivery_policy`: TRADE, BOOK_SNAPSHOT and
+BOOK_DELTA are LOSSLESS; BAR is LOSSLESS when FINAL, REVISED or CANCELLED and
+LIFECYCLE_COALESCE when IN_PROGRESS (a BAR without a lifecycle is refused by the
+domain and treated as LOSSLESS); every other public feed is LATEST_STATE.
+Invariant 27 adds: a record may be dropped only when **the record right
+after it** in the product's delivery sequence has the same lifecycle key (BAR
+open time; the product for latest-state feeds) and the same lifecycle
+signature (sorted quality flags, authority revision, source id/role,
+provider, source session, connection generation, lease epoch), and only under
+buffer pressure. Coalescing therefore stays inside one contiguous run and
+keeps its last record: `A B A B` is four transitions and never reduces to
+`A B` (KN-2 R1 F5; "any later matching record" was wrong). A quality-state or
+source-authority transition changes the signature and is never coalesced
+away. The earlier Python stream's coalescing of BOOK_SNAPSHOT is not ported.
+
+## 7. Stream failure outcomes (binding on KN-2)
+
+- **Replay bounds are per request** and checked before a record is emitted:
+ records scanned in the request's own range (`CURSOR_EXPIRED:REPLAY_SCAN_LIMIT`),
+ payload bytes scanned (`CURSOR_EXPIRED:REPLAY_BYTE_LIMIT`), matched records
+ (`CURSOR_EXPIRED` backlog) - all `OUT_OF_RANGE`, resnapshot; wall time is
+ `RESOURCE_EXHAUSTED RATE_LIMITED:REPLAY_TIME_LIMIT` (retryable, the token
+ has advanced through everything delivered).
+- **A committed record that does not decode is never skipped.** Every stream
+ or Replay whose range holds it on that physical key ends
+ `DATA_LOSS DATA_INTEGRITY:committed record : ...`; other
+ keys in the same shared pass continue. Ring, reader and live paths agree.
+- **Revocation is effective at every point** of a stream (admission, replay,
+ catch-up, a blocked send, LIVE) and of a Replay page: the stream binds the
+ authority generation it was admitted under and ends `UNAUTHENTICATED` (or
+ `PERMISSION_DENIED`) once a reload withdraws its key, manifest revision,
+ permission or entitlement. At most the two responses already handed to the
+ transport can precede the status. Additive rotation keeps streams.
+- **Every held record is inside one replica byte budget**, charged once
+ (`raw + 8 x payload`, an empirical decoded-size allowance) from the moment it
+ enters a queue, replay channel or ring replay until the transport takes it.
+ Concurrent Replay RPCs are admitted per replica and per consumer (manifest
+ `max_streams`); refusal is `RESOURCE_EXHAUSTED RATE_LIMITED`.
+ The factor eight exceeds the largest measured ratio (7.28) in the retained
+ capture; it is not a proof for arbitrary protobuf payloads or a guarantee
+ against OOM. The byte-credit ceiling is enforced; process RSS, transport,
+ decoder temporaries and allocator overhead must also fit the measured
+ reserve. New payload shapes/depths require remeasurement before promotion.
+ Replay and Subscribe have separate per-consumer counters, each capped by
+ `max_streams`; Replay also has a separate replica cap of 32. Successful
+ payload/cursor semantics do not change; overload is typed and retryable,
+ never silently truncated or reinterpreted as an empty successful page.
+
+
+### KN-5 Derived BAR Diagnostic Index
+
+The Rust market-cache writer also maintains `bd:::`.
+Fields are exact BAR opens in milliseconds; values are `N` (no sequence flag)
+or `G` (canonical SEQUENCE_GAP_BEFORE, including an empty
+sequence). Index and BAR row, correction, retention floor and partition
+checkpoint are one Lua transaction. Reclaim removes both bucket keys.
+This is additive, disposable cache state, not a new Kafka event or authority.
+The reader compares exact BAR/index open sets and generation, floor and source
+watermark before/after reading. Missing/partial old-writer indexes use the
+verified bounded row scanner; corruption and races never mean gap-free.
+Diagnostic scans use this small index, not the OHLC protobuf history. Query
+history still verifies every payload hash/open/product and is not weakened.
diff --git a/contracts/v2/openapi.snapshot.json b/contracts/v2/openapi.snapshot.json
index 1309e95c..f47c6f68 100644
--- a/contracts/v2/openapi.snapshot.json
+++ b/contracts/v2/openapi.snapshot.json
@@ -791,6 +791,16 @@
"GapListResponse": {
"additionalProperties": false,
"properties": {
+ "coverage": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/GapScanCoverage"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"items": {
"items": {
"$ref": "#/components/schemas/GapView"
@@ -820,6 +830,147 @@
"title": "GapPolicy",
"type": "string"
},
+ "GapProductCoverage": {
+ "additionalProperties": false,
+ "properties": {
+ "binding_id": {
+ "title": "Binding Id",
+ "type": "string"
+ },
+ "feed": {
+ "$ref": "#/components/schemas/FeedType"
+ },
+ "first_open_ns": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "First Open Ns"
+ },
+ "instrument_uid": {
+ "title": "Instrument Uid",
+ "type": "string"
+ },
+ "interval": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Interval"
+ },
+ "last_open_ns": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Last Open Ns"
+ },
+ "reason": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Reason"
+ },
+ "retained_rows": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Retained Rows"
+ },
+ "state": {
+ "enum": [
+ "SCANNED",
+ "EXCLUDED",
+ "UNAVAILABLE"
+ ],
+ "title": "State",
+ "type": "string"
+ }
+ },
+ "required": [
+ "binding_id",
+ "instrument_uid",
+ "feed",
+ "interval",
+ "state",
+ "retained_rows",
+ "first_open_ns",
+ "last_open_ns"
+ ],
+ "title": "GapProductCoverage",
+ "type": "object"
+ },
+ "GapScanCoverage": {
+ "additionalProperties": false,
+ "properties": {
+ "history_complete": {
+ "title": "History Complete",
+ "type": "null"
+ },
+ "leading_coverage": {
+ "const": "NOT_ASSESSED",
+ "title": "Leading Coverage",
+ "type": "string"
+ },
+ "materialization_complete": {
+ "title": "Materialization Complete",
+ "type": "boolean"
+ },
+ "products": {
+ "items": {
+ "$ref": "#/components/schemas/GapProductCoverage"
+ },
+ "title": "Products",
+ "type": "array"
+ },
+ "scan_complete": {
+ "title": "Scan Complete",
+ "type": "boolean"
+ },
+ "scope": {
+ "const": "RETAINED_WINDOW",
+ "title": "Scope",
+ "type": "string"
+ },
+ "trailing_coverage": {
+ "const": "NOT_ASSESSED",
+ "title": "Trailing Coverage",
+ "type": "string"
+ }
+ },
+ "required": [
+ "scope",
+ "scan_complete",
+ "materialization_complete",
+ "leading_coverage",
+ "trailing_coverage",
+ "products"
+ ],
+ "title": "GapScanCoverage",
+ "type": "object"
+ },
"GapView": {
"additionalProperties": false,
"properties": {
@@ -1382,6 +1533,16 @@
"title": "Detail",
"type": "string"
},
+ "diagnostics": {
+ "anyOf": [
+ {
+ "$ref": "#/components/schemas/ProblemDiagnostics"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
"instrument_uid": {
"anyOf": [
{
@@ -1448,6 +1609,128 @@
"title": "ProblemDetails",
"type": "object"
},
+ "ProblemDiagnostics": {
+ "additionalProperties": false,
+ "description": "Quality as Query evaluated it for the refused request (KN-4 review):\nthe same non-secret metadata a served item carries, taken at the refusal,\nso a failure is never diagnosed from a status read seconds later.",
+ "properties": {
+ "complete": {
+ "title": "Complete",
+ "type": "boolean"
+ },
+ "evaluated_at_ns": {
+ "minimum": 0.0,
+ "title": "Evaluated At Ns",
+ "type": "integer"
+ },
+ "event_recency_state": {
+ "maxLength": 64,
+ "title": "Event Recency State",
+ "type": "string"
+ },
+ "execution_eligible": {
+ "title": "Execution Eligible",
+ "type": "boolean"
+ },
+ "freshness_ms": {
+ "minimum": 0.0,
+ "title": "Freshness Ms",
+ "type": "integer"
+ },
+ "gap_open": {
+ "title": "Gap Open",
+ "type": "boolean"
+ },
+ "observed_at_ns": {
+ "anyOf": [
+ {
+ "minimum": 0.0,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Observed At Ns"
+ },
+ "provider_session_liveness_ms": {
+ "anyOf": [
+ {
+ "minimum": 0.0,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Provider Session Liveness Ms"
+ },
+ "provider_session_state": {
+ "maxLength": 64,
+ "title": "Provider Session State",
+ "type": "string"
+ },
+ "reason_codes": {
+ "items": {
+ "type": "string"
+ },
+ "maxItems": 32,
+ "title": "Reason Codes",
+ "type": "array"
+ },
+ "received_at_ns": {
+ "anyOf": [
+ {
+ "minimum": 0.0,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Received At Ns"
+ },
+ "source_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Source Id"
+ },
+ "state": {
+ "maxLength": 64,
+ "title": "State",
+ "type": "string"
+ },
+ "watermark_offset": {
+ "anyOf": [
+ {
+ "minimum": 0.0,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Watermark Offset"
+ }
+ },
+ "required": [
+ "evaluated_at_ns",
+ "state",
+ "freshness_ms",
+ "event_recency_state",
+ "provider_session_state",
+ "execution_eligible",
+ "gap_open",
+ "complete"
+ ],
+ "title": "ProblemDiagnostics",
+ "type": "object"
+ },
"QualityView": {
"additionalProperties": false,
"properties": {
@@ -2957,6 +3240,18 @@
"/v2/data-quality/gaps": {
"get": {
"operationId": "data_quality_gaps_v2_data_quality_gaps_get",
+ "parameters": [
+ {
+ "in": "query",
+ "name": "include_coverage",
+ "required": false,
+ "schema": {
+ "default": false,
+ "title": "Include Coverage",
+ "type": "boolean"
+ }
+ }
+ ],
"responses": {
"200": {
"content": {
@@ -2967,6 +3262,16 @@
}
},
"description": "Successful Response"
+ },
+ "422": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/HTTPValidationError"
+ }
+ }
+ },
+ "description": "Validation Error"
}
},
"security": [
diff --git a/docker-compose.v2-stable.yml b/docker-compose.v2-stable.yml
index a0b22472..d02cd847 100644
--- a/docker-compose.v2-stable.yml
+++ b/docker-compose.v2-stable.yml
@@ -300,8 +300,15 @@ services:
query_v2_1:
<<: *python
- # DL-V2 R1.5 measured allocation: 22% of its 0.75 ceiling.
- cpus: 1.00
+ # v2.1.1 Phase-3 A/B (same image, same stage-5 workload, 2026-09-23): 1.00
+ # was throttled 2-4 s per 100 s at 0.2-0.4 CPU average; 1.50 cut that to
+ # 0.4 s and turned L2/MARK_INDEX/TS gates green. Retained per the
+ # contract's selective Query ceiling (1.5).
+ cpus: 1.50
+ # v2.1.1 Phase-3 final stage 50 (2026-09-23): the start-up warmup storm
+ # OOM-killed query_v2_1 at 512 MiB (kernel memcg, anon-rss 517 MB); at 1 GiB
+ # the same run completed with no restart. The contract's Query ceiling.
+ mem_limit: 1g
command: [python, -m, app.entrypoints.query_v2_stable]
networks:
stable_internal: {}
@@ -332,7 +339,8 @@ services:
query_v2_2:
<<: *python
# DL-V2 R1.5 measured allocation: 1% measured, kept equal to query_v2_1 because the shared qdl-v2-query alias can send either reader all of the traffic.
- cpus: 1.00
+ cpus: 1.50 # see query_v2_1
+ mem_limit: 1g # see query_v2_1
command: [python, -m, app.entrypoints.query_v2_stable]
networks:
stable_internal: {}
@@ -787,7 +795,12 @@ services:
# 2026-09-18 while rust_core was pinned at its own. This cut pays for that
# raise, same size, same step, and it held the drain criterion for a full
# window at 0.50 drawing 9%.
- cpus: 0.50
+ # KN-4 D42 (owner-approved, 2026-09-25): 1.0. Under the afternoon input
+ # burst it was throttled on 55-70% of its periods at 0.50 with raw_age up
+ # to 31 s; raised live with `docker update` (no recreate) and carried here so
+ # a recreate cannot return it to 0.50. Ceiling sum of the running roles
+ # 22.0 -> 22.5 vCPU (owner-approved addition, not resource-neutral).
+ cpus: 1.00
entrypoint: [/usr/local/bin/qdl-realtime-core]
command: [/runtime/core-002.json]
environment:
diff --git a/docs/runbooks/consumer-endpoint-benchmark.md b/docs/runbooks/consumer-endpoint-benchmark.md
new file mode 100644
index 00000000..22df95fe
--- /dev/null
+++ b/docs/runbooks/consumer-endpoint-benchmark.md
@@ -0,0 +1,144 @@
+# External Consumer Endpoint Benchmark
+
+Plan: [Reusable benchmark task](../../DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md#consumer-endpoint-benchmark-20260922).
+Tool: [benchmark_consumer_endpoints.py](../../scripts/benchmark_consumer_endpoints.py).
+Profile template: [consumer-endpoint-benchmark.json](../../config/examples/consumer-endpoint-benchmark.json).
+
+## Current Safety Finding
+
+**2026-09-22: the first real run exposed query OOM on the global gap diagnostic.**
+Both `/v2/data-quality/gaps` calls timed out; kernel logs confirm the respective
+query processes were OOM-killed and automatically restarted. The implementation
+scans/parses spool records for every catalog binding synchronously. A read-only
+endpoint is not necessarily cheap or operationally harmless.
+
+The runner now marks this operation `SAFETY_BLOCKED` and does not call it, even
+if selected in an operation filter. There is no bypass flag. This must be
+repaired/verified server-side before lifting the guard. All-operation results
+remain `INCOMPLETE`, not a green all-endpoint certificate. This task does not
+silently modify the production endpoint, raise memory limits or roll services.
+Original failed evidence remains available; successful samples during that
+incident are not a steady-state baseline. No additional live measurements were
+run after the OOM cause was confirmed.
+
+## Run
+
+The host needs Python 3 and access to Docker. Use an existing immutable Data
+Layer Python image containing the released SDK. The launcher resolves its
+digest locally; it never builds or pulls an image. Store the profile outside
+Git. It contains file paths and public JWT metadata, never secret values.
+
+```bash
+python3 -B /home/bobby/data_layer/scripts/benchmark_consumer_endpoints.py inventory \
+ --profile /home/bobby/.local/state/qdl-endpoint-benchmark/profile.json \
+ --output /home/bobby/.local/state/qdl-endpoint-benchmark/inventory-$(date -u +%Y%m%dT%H%M%SZ)
+
+python3 -B /home/bobby/data_layer/scripts/benchmark_consumer_endpoints.py run \
+ --profile /home/bobby/.local/state/qdl-endpoint-benchmark/profile.json \
+ --output /home/bobby/.local/state/qdl-endpoint-benchmark/run-$(date -u +%Y%m%dT%H%M%SZ)
+```
+
+`inventory` uses `--network none`, needs no private-file mounts and performs
+no provider/service calls. `run` starts one disposable consumer container per
+selected identity, sequentially. Results are `report.json`, `report.csv` and
+`report.md` in the new output directory. Exit 1 means failure/incomplete evidence;
+an HTTP 200 with invalid data does not count as successful usable latency.
+
+Select identities already present in `stable-v2-release-routing.yaml`:
+`trading-system.paper.stable`, `alpha.binance.paper.stable`,
+`alpha.okx.paper.stable`, `monitoring.multivenue.stable`. Each needs its own
+registered TLS/JWT files and public key ID; never substitute another identity.
+Subject, environment, revision, requirements, policy and quotas come from the
+exact versioned manifest. A missing V2 scope or mismatched release fails closed.
+
+## Coverage
+
+Current TS scope: **30 products per venue / 60 total**, not 60 different HTTP
+URLs. Current four-consumer release scope: **299 products**. The tool enumerates
+all selected V2 products; there is no two-symbol/per-feed sample limit.
+
+| Operation | Product use / measurement |
+|---|---|
+| GET snapshot | Every canonical or pass-through product: BAR, TRADE, QUOTE, L2, etc. |
+| GET warmup | BAR with the manifest's exact warmup window |
+| GET history | Same governed BAR requirement via the distinct history URL |
+| POST warmup:batch | BAR batches; wall time of the whole batch, not divided by items |
+| POST reference:batch | Every on-demand product individually, plus batches: funding, OI, long/short, taker, mark/index, basis, metadata |
+| GET feed status | Every non-on-demand product; diagnostic validity, not price eligibility |
+| GET instruments | One bounded page (500); explicitly reports whether another page exists |
+| GET instrument | Every distinct demanded instrument UID; venue/native identity validated |
+| GET readiness | Consumer-authorized runtime diagnostic |
+| POST readiness:check | Exact requirements, typed per-item status and strict batch shape |
+| GET gaps | Inventoried; currently SAFETY_BLOCKED due to the global spool-scan OOM |
+| gRPC Subscribe | Optional every durable binding: signed handoff, first validated event and cursor acknowledgment |
+
+The 11 REST operations are checked against the frozen public OpenAPI. A new
+unhandled operation fails coverage validation. Legacy V1, internal producer,
+admin/write endpoints and orders are explicitly excluded. No fallback, direct
+venue connection or authority mutation is performed. Reference reads may warm
+ordinary server caches. A provider endpoint's coverage is not a websocket
+subscription, and a snapshot is not a full historical archive.
+
+## Limits And Streams
+
+Default: 3 rounds, 1 request/s, batch 8, one in-flight request, 30s timeout,
+1800s overall per identity, streams disabled. Pacing uses the smaller of the
+profile rate and 10% of manifest request quota. It does not reserve spare quota:
+a busy real consumer can still cause a reported `RATE_LIMITED` result. Quotas
+and policies are not increased for the test. Batches are capped by the manifest.
+The SDK's existing single idle-connection retry remains; the harness does not
+retry failed cases until they pass.
+
+Set `stream_seconds` to e.g. `3` for a bounded first-event test on every durable
+binding. This is **not** a full reconnect/fallback/C2 certification. It measures
+warmup/query + gRPC handoff + wait for the first validated event, not just wire
+delivery. A quiet long-interval BAR may legitimately have no new event. The
+report records `NO_EVENT`, not a zero-latency success; overall evidence is then
+incomplete. Max one test stream is open; no forced disconnect of the provider
+or production consumers. Signed cursors remain only in ephemeral client memory.
+
+For an explicitly scoped diagnostic run, the profile may contain e.g.
+`"operations": ["reference_batch"]`. Every other operation remains in the
+report as `NOT_MEASURED_OPERATION_FILTER`. Omit this field for all operations.
+Unfinished cases at the overall deadline remain `NOT_MEASURED_DEADLINE`.
+
+## Reading Results Honestly
+
+- `response_ms`: caller starts SDK transport -> HTTP body received/decoded.
+ Includes connection/TLS when opened, signing and network/server work.
+- `usable_ms`: same starting point -> SDK schema + exact product/domain quality
+ validation completed. It excludes strategy calculation and order submission.
+ Diagnostic operations use `meaning=diagnostic_validated`: a valid STALE
+ status can return quickly, without making its price executable.
+- `elapsed_ms`: includes failed calls; failed samples are excluded from usable
+ percentiles but retain typed error code and bounded per-item diagnostics.
+- Quality/source event age, session liveness, gap, completeness, execution
+ eligibility and policy hash are separate from request latency. Original
+ timestamps are preserved. No prices, key material, signed cursor or bearer
+ token is written to evidence.
+- First request on each replica and round-zero vs subsequent reads are labelled.
+ This does not evict server caches: "first" is client-side, not provider cold
+ storage. Whole-batch latency is labelled `batch_wall` and never presented as
+ individual item latency.
+- Per-binding samples are kept, not just a feed average. Small-sample p95 is
+ descriptive, not an SLA; p99 is absent below 100 samples **for that case**.
+- `PASS_SELECTED_READS` certifies only measured read validity in that run.
+ Check explicit exclusions, diagnostic availability and sample counts. It is
+ not a release certificate, capacity claim, or prediction about mainnet orders.
+- Same-host Docker networking measures a separate consumer process/container,
+ not AWS-to-another-region latency. To measure a remote host, run the same
+ client where that consumer actually lives with approved DNS/network/identity.
+
+## Safety And Cleanup
+
+The client has a read-only root filesystem, 1 CPU/512 MiB cap, no capabilities,
+no Docker socket, bounded tmpfs and PID limit. Only its script, public
+ config/contracts and four exact identity files are mounted. Each run records
+image digest, tool hash, source SHA, manifest hashes/revisions and timestamps.
+The host launcher verifies deletion of its exact `qdl-endpoint-bench-*` container
+even on timeout/interruption. A cleanup error is surfaced. It never prunes
+images/volumes or touches production containers, Kafka, Redis or SQLite.
+SIGKILL/host loss cannot execute a Python `finally`: inspect only that run's
+named test container before manually stopping/removing it. No image build cache
+is created. Keep compact evidence; remove only the known test output directory
+when no longer needed.
diff --git a/docs/runbooks/kn5-paired-cutover.md b/docs/runbooks/kn5-paired-cutover.md
new file mode 100644
index 00000000..22772e23
--- /dev/null
+++ b/docs/runbooks/kn5-paired-cutover.md
@@ -0,0 +1,135 @@
+# KN-5 Paired Cutover And Rollback
+
+Status: PAIRED HANDOFF / ROLLBACK-RETURN / PRODUCTION LOAD PASS (2026-09-27).
+Old writer/read roles stopped; runtime/clean artifacts accepted, publication pending. Governing plan:
+[KN-5](../../DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md#kn5-predeploy-gap-closure).
+No additional phase. This runbook is not a deployment authorization.
+
+## Artifact Freeze
+
+- Build Python reader/BAR edge and Rust runtime from one committed tree; package
+ `qdl-projector` and `qdl-stream-gateway` INSIDE the Rust image, not host mounts.
+ Build standalone SDK from the same tree. Record image IDs, labels, wheel hash,
+ source commit and affected test receipts. Do not retag an old binary as new.
+- SDK2.0.5 is installed in the accepted TS reader. It includes offset0 cursor
+ support and bounded off-loop durable ACK. Verify the exact wheel hash against
+ the release certificate before deployment; a version string alone does not
+ identify an unpublished candidate. A built wheel does not update a consumer.
+ No TS executor/risk/portfolio or strategy behavior change is included.
+- If locked upstream packages are unavailable, `Dockerfile` accepts
+ `QDL_DEPENDENCY_IMAGE=@sha256:`. It verifies active main-lock
+ versions and installed RECORD hashes before copying only `/opt/venv`; the
+ receipt is embedded at `/opt/qdl/dependency-receipt.json`. No source from the
+ dependency image is reused. Keep that immutable dependency artifact available
+ for reproducibility; do not silently update VN packages or use a mutable tag.
+ A local unpublished digest can be supplied with Buildx named context
+ `@sha256:=oci-layout://@sha256:` after
+ verifying its exported OCI blobs. Remote CI needs that same OCI artifact or
+ an approved registry copy; a local daemon tag is not a remote build input.
+- Candidate source: catalog11/712 bindings, acquisition19, promotion scope10,
+ release routing27, alpha manifests14/14, TS10, research6. Compile gateway
+ bundle with `scripts/kn_gateway_bundle.py`; verify routing hashes using the
+ existing `StableReleaseRoutePlan` loader. JWT revisions must match manifests.
+- Retired four research book requirements retain instrument metadata; new
+ successor futures require provider metadata and separate demand, not guessing.
+- Snapshot exact current role image IDs, runtime-directory mounts, configuration
+ hashes and restart counts immediately before handoff. Keep source and runtime
+ revisions separate. Never regenerate keys over the live runtime directory.
+
+## Production Packet
+
+- Reuse the three canonical brokers, native producers, quota/provider Redis and
+ TLS network. Provision only `md.latest.v2` / `md.bars.v2` plus exact KN ACLs
+ with `scripts/kn_state_topics_packet.py` review/verify/apply. Use the previously
+ approved dedicated `User:kn-projector`, not `phase8-consumer`. Its client CA
+ must be added alongside existing trust before activation; exact broker trust
+ paths/reload or roll and old-client continuity must be in the runtime packet.
+ The offline topic/ACL packet does not itself install that identity. Preserve canonical
+ partition plan/offsets. Verify segment and retention policies, RF3/minISR2.
+- Add one dedicated market cache (`noeviction`, listpack128/2048, no AOF/save),
+ candidate maxmemory8,000,000,000 B / container9GiB. This is a measured padded
+ allocator envelope, not permission to allocate unbounded RAM. Measure native
+ replay peak, output buffers and whole stack during actual candidate operation.
+- Two native projector replicas own Stage A/B through the existing fenced
+ consumer groups. Two native Stream replicas and existing two Python Query
+ roles use ONE versioned bundle/topic identity/cursor-key/route generation.
+ Query selects `QDL_STABLE_QUERY_BACKEND=kn3`; it must not mount/read SQLite.
+- The retired catalog9/216 is not the active KN catalog11/712. New daily-universe BARs need
+ producer/acquisition registration and real BAR bootstrap through the existing
+ edge/core, not just an entitlement change. Compile/diff native maps and sealed
+ BAR checkpoint migration before deciding the exact producer-config roll list.
+ Keep valid current authority; do not reset offsets or invent another writer.
+- Use retained Kafka canonical/state history and bounded vendor BAR bootstrap;
+ no production spool import. Provider historical overlap remains explicitly
+ unavailable for strict full history; never interpolate or relabel it FULL.
+- Start watcher BEFORE candidate setup. Include all three brokers, all native
+ producers, edge, native projectors, Query/Stream, market cache AND existing
+ quota/provider Redis in same-window CPU/memory/lag measurements. The early
+ composed receipt omitted that Redis and remains incomplete. The final production
+ resource receipt includes it: 4.668721 vCPU over 374.414891 seconds; do not
+ substitute the early receipt for this matched full-stack measurement.
+
+## Handoff And Exit
+
+1. Fast per-binding/replica readiness, exact requested history coverage and
+ `gaps?include_coverage=true`: disabled/absent products are explicit. Check
+ expiry, schema, component eligibility and source watermark. Diagnostic
+ retained-window success is never a listing-to-now history certificate.
+2. Move the versioned Query/Stream target pair, never DNS aliases alone. Bound
+ persistent-channel drain/reconnect and incompatible cursor resnapshot. Test
+ old/new JWT revisions and both replicas. No order/signal/sizing mutation.
+3. Paired rollback to old V2 and return to KN. Old V2 does NOT serve the expanded
+ catalog automatically. New universe/reference products stay BLOCKED during
+ rollback unless explicitly proven available there. V1 is only the approved
+ Binance TRADE/legacy policy fallback, not a universal substitute for L2/BAR.
+4. Run one final 300s no-order acceptance after fast matrices pass; report actual
+ TS Redis ACK/readback and alpha call-to-usable milliseconds, all denominators,
+ execution refusals, recovery, lag and full-stack resources. No SLA relaxation.
+5. Only after handoff/rollback-return pass: stop six old SQLite projectors and
+ old Stream writer. Assert no process still writes the spool. Keep exact old
+ state/images/config for a bounded rollback window; recompute the last safe
+ rollback time from broker retention and committed offsets, not a guessed TTL.
+6. Preserve old state; no Redis flush, SQLite deletion or volume removal. After
+ approved remote feature->dev CI->main release, publish immutable2.2.0 and
+ clean exact disposable images/worktrees. Keep one named rollback set only.
+
+## Executed Packet
+
+Runtime state: `/home/bobby/.local/state/qdl-v2/releases/v2.2.0-02cd827`.
+Evidence: `/home/bobby/.local/state/qdl-v2/kn5-close-20260927`.
+TS query alias `qdl-v2-query:8200` and stream pair `qdl-v2-stream-a/b:8210`
+on `executor_network` now resolve only to KN roles. Actual market-data reader
+SDK2.0.5; binding/JWT10 unchanged. Rollback/return and final50 passed.
+
+The authoritative TS reader packet is `ts-release-reader.compose.json` (image
+`sha256:7e7e2d026a9f301db0c32237063b4f518a6503e986e6206ad9a7e1a79b01ceea`).
+Its immediate image-only rollback is `ts-release-reader-rollback.compose.json`
+(`sha256:5b66c2cd68459cda3c0273256e7cf1ad9c5a0560875e57b88559056d35b6213e`),
+with the same KN targets, environment, mounts and revision10. Historical
+`ts-candidate.compose.json` and `ts-sdk205-*.compose.json` are archived trial
+packets, NOT deployment defaults. Do not replay them for a routine restart.
+The two current packets are private mode0600 outside Git.
+
+Final reader acceptance: 300.000849s,29/29 samples60/60 READY, zero fallback,
+82,522 streamed events, zero overflow/reconnect and final queue zero. See
+[certificate](../../upgrade/evidence/releases/v2.2.0/certificate.json) and
+[endpoint report](../../upgrade/evidence/releases/v2.2.0/endpoint-report.json).
+
+Ten old roles are STOPPED (not removed): `projector_v2`, `_2`..`_6`,
+`query_v2_1/2`, `stream_v2_active/passive`. The old
+`qdl-v2-stable-boot-recovery.service` is DISABLED; do not run its spool rebuild
+against the native architecture. Exact unit, Compose and inspect backup live at
+`legacy-retirement-backup` inside the runtime packet. Native Docker restart and
+Kafka-state cache rebuild own recovery. Old SQLite/Redis/offsets were not deleted.
+
+Before old-path rollback, verify retained canonical offsets are still readable;
+expired retention requires an explicit history rebuild and is not instant rollback.
+Start exact old role images with the additive union catalog from the packet,
+catch up, stop the TS reader before reversing aliases, then use the exact old
+TS image/config. Do not attach two generations to the same aliases concurrently.
+Restore the old boot unit only with old-architecture ownership, never by default.
+
+The initial dependency-preserving build option above is NOT permission to use a
+quarantined package. Owner approved excluding vnstock/vnai from new KN images;
+DNSE/Vietnam remain served by unchanged V1 until a separate migration. No GHCR
+token change is required. New release packaging must build from the clean lock.
diff --git a/generated/rust/qdl.query.v2.tonic.rs b/generated/rust/qdl.query.v2.tonic.rs
new file mode 100644
index 00000000..26c47d0f
--- /dev/null
+++ b/generated/rust/qdl.query.v2.tonic.rs
@@ -0,0 +1,560 @@
+// @generated
+/// Generated client implementations.
+pub mod market_data_stream_service_client {
+ #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
+ use tonic::codegen::*;
+ use tonic::codegen::http::Uri;
+ ///
+ #[derive(Debug, Clone)]
+ pub struct MarketDataStreamServiceClient {
+ inner: tonic::client::Grpc,
+ }
+ impl MarketDataStreamServiceClient {
+ /// Attempt to create a new client by connecting to a given endpoint.
+ pub async fn connect(dst: D) -> Result
+ where
+ D: TryInto,
+ D::Error: Into,
+ {
+ let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
+ Ok(Self::new(conn))
+ }
+ }
+ impl MarketDataStreamServiceClient
+ where
+ T: tonic::client::GrpcService,
+ T::Error: Into,
+ T::ResponseBody: Body + Send + 'static,
+ ::Error: Into + Send,
+ {
+ pub fn new(inner: T) -> Self {
+ let inner = tonic::client::Grpc::new(inner);
+ Self { inner }
+ }
+ pub fn with_origin(inner: T, origin: Uri) -> Self {
+ let inner = tonic::client::Grpc::with_origin(inner, origin);
+ Self { inner }
+ }
+ pub fn with_interceptor(
+ inner: T,
+ interceptor: F,
+ ) -> MarketDataStreamServiceClient>
+ where
+ F: tonic::service::Interceptor,
+ T::ResponseBody: Default,
+ T: tonic::codegen::Service<
+ http::Request,
+ Response = http::Response<
+ >::ResponseBody,
+ >,
+ >,
+ ,
+ >>::Error: Into + Send + Sync,
+ {
+ MarketDataStreamServiceClient::new(
+ InterceptedService::new(inner, interceptor),
+ )
+ }
+ /// Compress requests with the given encoding.
+ ///
+ /// This requires the server to support it otherwise it might respond with an
+ /// error.
+ #[must_use]
+ pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
+ self.inner = self.inner.send_compressed(encoding);
+ self
+ }
+ /// Enable decompressing responses.
+ #[must_use]
+ pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
+ self.inner = self.inner.accept_compressed(encoding);
+ self
+ }
+ /// Limits the maximum size of a decoded message.
+ ///
+ /// Default: `4MB`
+ #[must_use]
+ pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
+ self.inner = self.inner.max_decoding_message_size(limit);
+ self
+ }
+ /// Limits the maximum size of an encoded message.
+ ///
+ /// Default: `usize::MAX`
+ #[must_use]
+ pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
+ self.inner = self.inner.max_encoding_message_size(limit);
+ self
+ }
+ ///
+ pub async fn subscribe(
+ &mut self,
+ request: impl tonic::IntoRequest,
+ ) -> std::result::Result<
+ tonic::Response>,
+ tonic::Status,
+ > {
+ self.inner
+ .ready()
+ .await
+ .map_err(|e| {
+ tonic::Status::new(
+ tonic::Code::Unknown,
+ format!("Service was not ready: {}", e.into()),
+ )
+ })?;
+ let codec = tonic::codec::ProstCodec::default();
+ let path = http::uri::PathAndQuery::from_static(
+ "/qdl.query.v2.MarketDataStreamService/Subscribe",
+ );
+ let mut req = request.into_request();
+ req.extensions_mut()
+ .insert(
+ GrpcMethod::new("qdl.query.v2.MarketDataStreamService", "Subscribe"),
+ );
+ self.inner.server_streaming(req, path, codec).await
+ }
+ ///
+ pub async fn replay(
+ &mut self,
+ request: impl tonic::IntoRequest,
+ ) -> std::result::Result<
+ tonic::Response>,
+ tonic::Status,
+ > {
+ self.inner
+ .ready()
+ .await
+ .map_err(|e| {
+ tonic::Status::new(
+ tonic::Code::Unknown,
+ format!("Service was not ready: {}", e.into()),
+ )
+ })?;
+ let codec = tonic::codec::ProstCodec::default();
+ let path = http::uri::PathAndQuery::from_static(
+ "/qdl.query.v2.MarketDataStreamService/Replay",
+ );
+ let mut req = request.into_request();
+ req.extensions_mut()
+ .insert(
+ GrpcMethod::new("qdl.query.v2.MarketDataStreamService", "Replay"),
+ );
+ self.inner.server_streaming(req, path, codec).await
+ }
+ ///
+ pub async fn get_snapshot(
+ &mut self,
+ request: impl tonic::IntoRequest,
+ ) -> std::result::Result<
+ tonic::Response,
+ tonic::Status,
+ > {
+ self.inner
+ .ready()
+ .await
+ .map_err(|e| {
+ tonic::Status::new(
+ tonic::Code::Unknown,
+ format!("Service was not ready: {}", e.into()),
+ )
+ })?;
+ let codec = tonic::codec::ProstCodec::default();
+ let path = http::uri::PathAndQuery::from_static(
+ "/qdl.query.v2.MarketDataStreamService/GetSnapshot",
+ );
+ let mut req = request.into_request();
+ req.extensions_mut()
+ .insert(
+ GrpcMethod::new(
+ "qdl.query.v2.MarketDataStreamService",
+ "GetSnapshot",
+ ),
+ );
+ self.inner.unary(req, path, codec).await
+ }
+ ///
+ pub async fn get_feed_status(
+ &mut self,
+ request: impl tonic::IntoRequest,
+ ) -> std::result::Result<
+ tonic::Response,
+ tonic::Status,
+ > {
+ self.inner
+ .ready()
+ .await
+ .map_err(|e| {
+ tonic::Status::new(
+ tonic::Code::Unknown,
+ format!("Service was not ready: {}", e.into()),
+ )
+ })?;
+ let codec = tonic::codec::ProstCodec::default();
+ let path = http::uri::PathAndQuery::from_static(
+ "/qdl.query.v2.MarketDataStreamService/GetFeedStatus",
+ );
+ let mut req = request.into_request();
+ req.extensions_mut()
+ .insert(
+ GrpcMethod::new(
+ "qdl.query.v2.MarketDataStreamService",
+ "GetFeedStatus",
+ ),
+ );
+ self.inner.unary(req, path, codec).await
+ }
+ }
+}
+/// Generated server implementations.
+pub mod market_data_stream_service_server {
+ #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)]
+ use tonic::codegen::*;
+ /// Generated trait containing gRPC methods that should be implemented for use with MarketDataStreamServiceServer.
+ #[async_trait]
+ pub trait MarketDataStreamService: Send + Sync + 'static {
+ /// Server streaming response type for the Subscribe method.
+ type SubscribeStream: tonic::codegen::tokio_stream::Stream<
+ Item = std::result::Result,
+ >
+ + Send
+ + 'static;
+ ///
+ async fn subscribe(
+ &self,
+ request: tonic::Request,
+ ) -> std::result::Result, tonic::Status>;
+ /// Server streaming response type for the Replay method.
+ type ReplayStream: tonic::codegen::tokio_stream::Stream<
+ Item = std::result::Result,
+ >
+ + Send
+ + 'static;
+ ///
+ async fn replay(
+ &self,
+ request: tonic::Request,
+ ) -> std::result::Result, tonic::Status>;
+ ///
+ async fn get_snapshot(
+ &self,
+ request: tonic::Request,
+ ) -> std::result::Result<
+ tonic::Response,
+ tonic::Status,
+ >;
+ ///
+ async fn get_feed_status(
+ &self,
+ request: tonic::Request,
+ ) -> std::result::Result<
+ tonic::Response,
+ tonic::Status,
+ >;
+ }
+ ///
+ #[derive(Debug)]
+ pub struct MarketDataStreamServiceServer {
+ inner: Arc,
+ accept_compression_encodings: EnabledCompressionEncodings,
+ send_compression_encodings: EnabledCompressionEncodings,
+ max_decoding_message_size: Option,
+ max_encoding_message_size: Option,
+ }
+ impl MarketDataStreamServiceServer {
+ pub fn new(inner: T) -> Self {
+ Self::from_arc(Arc::new(inner))
+ }
+ pub fn from_arc(inner: Arc) -> Self {
+ Self {
+ inner,
+ accept_compression_encodings: Default::default(),
+ send_compression_encodings: Default::default(),
+ max_decoding_message_size: None,
+ max_encoding_message_size: None,
+ }
+ }
+ pub fn with_interceptor(
+ inner: T,
+ interceptor: F,
+ ) -> InterceptedService
+ where
+ F: tonic::service::Interceptor,
+ {
+ InterceptedService::new(Self::new(inner), interceptor)
+ }
+ /// Enable decompressing requests with the given encoding.
+ #[must_use]
+ pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
+ self.accept_compression_encodings.enable(encoding);
+ self
+ }
+ /// Compress responses with the given encoding, if the client supports it.
+ #[must_use]
+ pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
+ self.send_compression_encodings.enable(encoding);
+ self
+ }
+ /// Limits the maximum size of a decoded message.
+ ///
+ /// Default: `4MB`
+ #[must_use]
+ pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
+ self.max_decoding_message_size = Some(limit);
+ self
+ }
+ /// Limits the maximum size of an encoded message.
+ ///
+ /// Default: `usize::MAX`
+ #[must_use]
+ pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
+ self.max_encoding_message_size = Some(limit);
+ self
+ }
+ }
+ impl tonic::codegen::Service>
+ for MarketDataStreamServiceServer
+ where
+ T: MarketDataStreamService,
+ B: Body + Send + 'static,
+ B::Error: Into + Send + 'static,
+ {
+ type Response = http::Response;
+ type Error = std::convert::Infallible;
+ type Future = BoxFuture;
+ fn poll_ready(
+ &mut self,
+ _cx: &mut Context<'_>,
+ ) -> Poll> {
+ Poll::Ready(Ok(()))
+ }
+ fn call(&mut self, req: http::Request) -> Self::Future {
+ match req.uri().path() {
+ "/qdl.query.v2.MarketDataStreamService/Subscribe" => {
+ #[allow(non_camel_case_types)]
+ struct SubscribeSvc(pub Arc);
+ impl<
+ T: MarketDataStreamService,
+ > tonic::server::ServerStreamingService
+ for SubscribeSvc {
+ type Response = super::SubscribeResponse;
+ type ResponseStream = T::SubscribeStream;
+ type Future = BoxFuture<
+ tonic::Response,
+ tonic::Status,
+ >;
+ fn call(
+ &mut self,
+ request: tonic::Request,
+ ) -> Self::Future {
+ let inner = Arc::clone(&self.0);
+ let fut = async move {
+ ::subscribe(&inner, request)
+ .await
+ };
+ Box::pin(fut)
+ }
+ }
+ let accept_compression_encodings = self.accept_compression_encodings;
+ let send_compression_encodings = self.send_compression_encodings;
+ let max_decoding_message_size = self.max_decoding_message_size;
+ let max_encoding_message_size = self.max_encoding_message_size;
+ let inner = self.inner.clone();
+ let fut = async move {
+ let method = SubscribeSvc(inner);
+ let codec = tonic::codec::ProstCodec::default();
+ let mut grpc = tonic::server::Grpc::new(codec)
+ .apply_compression_config(
+ accept_compression_encodings,
+ send_compression_encodings,
+ )
+ .apply_max_message_size_config(
+ max_decoding_message_size,
+ max_encoding_message_size,
+ );
+ let res = grpc.server_streaming(method, req).await;
+ Ok(res)
+ };
+ Box::pin(fut)
+ }
+ "/qdl.query.v2.MarketDataStreamService/Replay" => {
+ #[allow(non_camel_case_types)]
+ struct ReplaySvc(pub Arc);
+ impl<
+ T: MarketDataStreamService,
+ > tonic::server::ServerStreamingService
+ for ReplaySvc {
+ type Response = super::ReplayResponse;
+ type ResponseStream = T::ReplayStream;
+ type Future = BoxFuture<
+ tonic::Response,
+ tonic::Status,
+ >;
+ fn call(
+ &mut self,
+ request: tonic::Request,
+ ) -> Self::Future {
+ let inner = Arc::clone(&self.0);
+ let fut = async move {
+ ::replay(&inner, request)
+ .await
+ };
+ Box::pin(fut)
+ }
+ }
+ let accept_compression_encodings = self.accept_compression_encodings;
+ let send_compression_encodings = self.send_compression_encodings;
+ let max_decoding_message_size = self.max_decoding_message_size;
+ let max_encoding_message_size = self.max_encoding_message_size;
+ let inner = self.inner.clone();
+ let fut = async move {
+ let method = ReplaySvc(inner);
+ let codec = tonic::codec::ProstCodec::default();
+ let mut grpc = tonic::server::Grpc::new(codec)
+ .apply_compression_config(
+ accept_compression_encodings,
+ send_compression_encodings,
+ )
+ .apply_max_message_size_config(
+ max_decoding_message_size,
+ max_encoding_message_size,
+ );
+ let res = grpc.server_streaming(method, req).await;
+ Ok(res)
+ };
+ Box::pin(fut)
+ }
+ "/qdl.query.v2.MarketDataStreamService/GetSnapshot" => {
+ #[allow(non_camel_case_types)]
+ struct GetSnapshotSvc(pub Arc);
+ impl<
+ T: MarketDataStreamService,
+ > tonic::server::UnaryService
+ for GetSnapshotSvc {
+ type Response = super::GetSnapshotResponse;
+ type Future = BoxFuture<
+ tonic::Response,
+ tonic::Status,
+ >;
+ fn call(
+ &mut self,
+ request: tonic::Request,
+ ) -> Self::Future {
+ let inner = Arc::clone(&self.0);
+ let fut = async move {
+ ::get_snapshot(
+ &inner,
+ request,
+ )
+ .await
+ };
+ Box::pin(fut)
+ }
+ }
+ let accept_compression_encodings = self.accept_compression_encodings;
+ let send_compression_encodings = self.send_compression_encodings;
+ let max_decoding_message_size = self.max_decoding_message_size;
+ let max_encoding_message_size = self.max_encoding_message_size;
+ let inner = self.inner.clone();
+ let fut = async move {
+ let method = GetSnapshotSvc(inner);
+ let codec = tonic::codec::ProstCodec::default();
+ let mut grpc = tonic::server::Grpc::new(codec)
+ .apply_compression_config(
+ accept_compression_encodings,
+ send_compression_encodings,
+ )
+ .apply_max_message_size_config(
+ max_decoding_message_size,
+ max_encoding_message_size,
+ );
+ let res = grpc.unary(method, req).await;
+ Ok(res)
+ };
+ Box::pin(fut)
+ }
+ "/qdl.query.v2.MarketDataStreamService/GetFeedStatus" => {
+ #[allow(non_camel_case_types)]
+ struct GetFeedStatusSvc(pub Arc);
+ impl<
+ T: MarketDataStreamService,
+ > tonic::server::UnaryService
+ for GetFeedStatusSvc {
+ type Response = super::GetFeedStatusResponse;
+ type Future = BoxFuture<
+ tonic::Response,
+ tonic::Status,
+ >;
+ fn call(
+ &mut self,
+ request: tonic::Request,
+ ) -> Self::Future {
+ let inner = Arc::clone(&self.0);
+ let fut = async move {
+ ::get_feed_status(
+ &inner,
+ request,
+ )
+ .await
+ };
+ Box::pin(fut)
+ }
+ }
+ let accept_compression_encodings = self.accept_compression_encodings;
+ let send_compression_encodings = self.send_compression_encodings;
+ let max_decoding_message_size = self.max_decoding_message_size;
+ let max_encoding_message_size = self.max_encoding_message_size;
+ let inner = self.inner.clone();
+ let fut = async move {
+ let method = GetFeedStatusSvc(inner);
+ let codec = tonic::codec::ProstCodec::default();
+ let mut grpc = tonic::server::Grpc::new(codec)
+ .apply_compression_config(
+ accept_compression_encodings,
+ send_compression_encodings,
+ )
+ .apply_max_message_size_config(
+ max_decoding_message_size,
+ max_encoding_message_size,
+ );
+ let res = grpc.unary(method, req).await;
+ Ok(res)
+ };
+ Box::pin(fut)
+ }
+ _ => {
+ Box::pin(async move {
+ Ok(
+ http::Response::builder()
+ .status(200)
+ .header("grpc-status", tonic::Code::Unimplemented as i32)
+ .header(
+ http::header::CONTENT_TYPE,
+ tonic::metadata::GRPC_CONTENT_TYPE,
+ )
+ .body(empty_body())
+ .unwrap(),
+ )
+ })
+ }
+ }
+ }
+ }
+ impl Clone for MarketDataStreamServiceServer {
+ fn clone(&self) -> Self {
+ let inner = self.inner.clone();
+ Self {
+ inner,
+ accept_compression_encodings: self.accept_compression_encodings,
+ send_compression_encodings: self.send_compression_encodings,
+ max_decoding_message_size: self.max_decoding_message_size,
+ max_encoding_message_size: self.max_encoding_message_size,
+ }
+ }
+ }
+ impl tonic::server::NamedService
+ for MarketDataStreamServiceServer {
+ const NAME: &'static str = "qdl.query.v2.MarketDataStreamService";
+ }
+}
diff --git a/poetry.lock b/poetry.lock
index 74221ad3..60109378 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -130,29 +130,6 @@ async_timeout = {version = ">=4.0.3", markers = "python_version < \"3.11.0\""}
[package.extras]
gssauth = ["gssapi ; platform_system != \"Windows\"", "sspilib ; platform_system == \"Windows\""]
-[[package]]
-name = "beautifulsoup4"
-version = "4.14.3"
-description = "Screen-scraping library"
-optional = false
-python-versions = ">=3.7.0"
-groups = ["main"]
-files = [
- {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"},
- {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"},
-]
-
-[package.dependencies]
-soupsieve = ">=1.6.1"
-typing-extensions = ">=4.0.0"
-
-[package.extras]
-cchardet = ["cchardet"]
-chardet = ["chardet"]
-charset-normalizer = ["charset-normalizer"]
-html5lib = ["html5lib"]
-lxml = ["lxml"]
-
[[package]]
name = "certifi"
version = "2026.4.22"
@@ -172,6 +149,7 @@ description = "Foreign Function Interface for Python calling C code."
optional = false
python-versions = ">=3.9"
groups = ["main"]
+markers = "platform_python_implementation != \"PyPy\""
files = [
{file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"},
{file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"},
@@ -494,177 +472,6 @@ schemaregistry = ["attrs (>=21.2.0)", "authlib (>=1.0.0)", "cachetools (>=5.5.0)
soaktest = ["opentelemetry-distro", "opentelemetry-exporter-otlp", "psutil"]
tests = ["async-timeout", "attrs", "attrs (>=21.2.0)", "authlib (>=1.0.0)", "avro (>=1.11.1,<2)", "azure-identity", "azure-keyvault-keys", "black (>=24.0.0)", "boto3 (>=1.35)", "boto3 (>=1.42.25)", "cachetools (>=5.5.0)", "cel-python (>=0.4.0)", "certifi", "fastavro (>=1.5.4,<1.8.0) ; python_version == \"3.7\"", "fastavro (>=1.5.4,<2) ; python_version > \"3.7\"", "flake8", "google-api-core", "google-auth", "google-cloud-kms", "google-re2 (<1.1.20251105)", "googleapis-common-protos", "hkdf (==0.0.3)", "httpx (>=0.26)", "hvac", "isort (>=5.13.0)", "jsonata-python", "jsonschema (>=4.18.0)", "mypy", "pluggy (<1.6.0)", "protobuf", "pytest", "pytest-asyncio", "pytest-timeout", "pytest_cov", "pyyaml (>=6.0.0)", "requests", "requests-mock", "respx", "tink", "types-cachetools", "types-requests", "urllib3 (<3)"]
-[[package]]
-name = "contourpy"
-version = "1.3.2"
-description = "Python library for calculating contours of 2D quadrilateral grids"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-markers = "python_version == \"3.10\""
-files = [
- {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"},
- {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"},
- {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d"},
- {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9"},
- {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512"},
- {file = "contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631"},
- {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f"},
- {file = "contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2"},
- {file = "contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0"},
- {file = "contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a"},
- {file = "contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445"},
- {file = "contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773"},
- {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1"},
- {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43"},
- {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab"},
- {file = "contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7"},
- {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83"},
- {file = "contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd"},
- {file = "contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f"},
- {file = "contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878"},
- {file = "contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2"},
- {file = "contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15"},
- {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92"},
- {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87"},
- {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415"},
- {file = "contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe"},
- {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441"},
- {file = "contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e"},
- {file = "contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912"},
- {file = "contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73"},
- {file = "contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb"},
- {file = "contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08"},
- {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c"},
- {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f"},
- {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85"},
- {file = "contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841"},
- {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422"},
- {file = "contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef"},
- {file = "contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f"},
- {file = "contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9"},
- {file = "contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f"},
- {file = "contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739"},
- {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823"},
- {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5"},
- {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532"},
- {file = "contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b"},
- {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52"},
- {file = "contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd"},
- {file = "contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1"},
- {file = "contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69"},
- {file = "contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c"},
- {file = "contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16"},
- {file = "contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad"},
- {file = "contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0"},
- {file = "contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5"},
- {file = "contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5"},
- {file = "contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54"},
-]
-
-[package.dependencies]
-numpy = ">=1.23"
-
-[package.extras]
-bokeh = ["bokeh", "selenium"]
-docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
-mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", "types-Pillow"]
-test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
-test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"]
-
-[[package]]
-name = "contourpy"
-version = "1.3.3"
-description = "Python library for calculating contours of 2D quadrilateral grids"
-optional = false
-python-versions = ">=3.11"
-groups = ["main"]
-markers = "python_version >= \"3.11\""
-files = [
- {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"},
- {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"},
- {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"},
- {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"},
- {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"},
- {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"},
- {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"},
- {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"},
- {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"},
- {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"},
- {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"},
- {file = "contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb"},
- {file = "contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6"},
- {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7"},
- {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8"},
- {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea"},
- {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1"},
- {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7"},
- {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411"},
- {file = "contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69"},
- {file = "contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b"},
- {file = "contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc"},
- {file = "contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5"},
- {file = "contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1"},
- {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286"},
- {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5"},
- {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67"},
- {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9"},
- {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659"},
- {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7"},
- {file = "contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d"},
- {file = "contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263"},
- {file = "contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9"},
- {file = "contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d"},
- {file = "contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216"},
- {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae"},
- {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20"},
- {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99"},
- {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b"},
- {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a"},
- {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e"},
- {file = "contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3"},
- {file = "contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8"},
- {file = "contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301"},
- {file = "contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"},
- {file = "contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77"},
- {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5"},
- {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4"},
- {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36"},
- {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3"},
- {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b"},
- {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36"},
- {file = "contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d"},
- {file = "contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd"},
- {file = "contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339"},
- {file = "contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772"},
- {file = "contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77"},
- {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13"},
- {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe"},
- {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f"},
- {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0"},
- {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4"},
- {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f"},
- {file = "contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae"},
- {file = "contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc"},
- {file = "contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b"},
- {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"},
- {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"},
- {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"},
- {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"},
- {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"},
- {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"},
-]
-
-[package.dependencies]
-numpy = ">=1.25"
-
-[package.extras]
-bokeh = ["bokeh", "selenium"]
-docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
-mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", "types-Pillow"]
-test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
-test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"]
-
[[package]]
name = "cryptography"
version = "50.0.0"
@@ -728,34 +535,6 @@ typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.
[package.extras]
ssh = ["bcrypt (>=3.1.5)"]
-[[package]]
-name = "cycler"
-version = "0.12.1"
-description = "Composable style cycles"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
- {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
-]
-
-[package.extras]
-docs = ["ipython", "matplotlib", "numpydoc", "sphinx"]
-tests = ["pytest", "pytest-cov", "pytest-xdist"]
-
-[[package]]
-name = "et-xmlfile"
-version = "2.0.0"
-description = "An implementation of lxml.xmlfile for the standard library"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"},
- {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"},
-]
-
[[package]]
name = "exceptiongroup"
version = "1.3.1"
@@ -799,79 +578,6 @@ all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>
standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "fastar (>=0.9.0)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
-[[package]]
-name = "fonttools"
-version = "4.62.1"
-description = "Tools to manipulate font files"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "fonttools-4.62.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad5cca75776cd453b1b035b530e943334957ae152a36a88a320e779d61fc980c"},
- {file = "fonttools-4.62.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3ae47e8636156a9accff64c02c0924cbebad62854c4a6dbdc110cd5b4b341a"},
- {file = "fonttools-4.62.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b9e288b4da2f64fd6180644221749de651703e8d0c16bd4b719533a3a7d6e3"},
- {file = "fonttools-4.62.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bca7a1c1faf235ffe25d4f2e555246b4750220b38de8261d94ebc5ce8a23c23"},
- {file = "fonttools-4.62.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4e0fcf265ad26e487c56cb12a42dffe7162de708762db951e1b3f755319507d"},
- {file = "fonttools-4.62.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d850f66830a27b0d498ee05adb13a3781637b1826982cd7e2b3789ef0cc71ae"},
- {file = "fonttools-4.62.1-cp310-cp310-win32.whl", hash = "sha256:486f32c8047ccd05652aba17e4a8819a3a9d78570eb8a0e3b4503142947880ed"},
- {file = "fonttools-4.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:5a648bde915fba9da05ae98856987ca91ba832949a9e2888b48c47ef8b96c5a9"},
- {file = "fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7"},
- {file = "fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14"},
- {file = "fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7"},
- {file = "fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b"},
- {file = "fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1"},
- {file = "fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416"},
- {file = "fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53"},
- {file = "fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2"},
- {file = "fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974"},
- {file = "fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9"},
- {file = "fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936"},
- {file = "fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392"},
- {file = "fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04"},
- {file = "fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d"},
- {file = "fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c"},
- {file = "fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42"},
- {file = "fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79"},
- {file = "fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe"},
- {file = "fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68"},
- {file = "fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1"},
- {file = "fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069"},
- {file = "fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9"},
- {file = "fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24"},
- {file = "fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056"},
- {file = "fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca"},
- {file = "fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca"},
- {file = "fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782"},
- {file = "fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae"},
- {file = "fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7"},
- {file = "fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a"},
- {file = "fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800"},
- {file = "fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e"},
- {file = "fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82"},
- {file = "fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260"},
- {file = "fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4"},
- {file = "fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b"},
- {file = "fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87"},
- {file = "fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c"},
- {file = "fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a"},
- {file = "fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e"},
- {file = "fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd"},
- {file = "fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d"},
-]
-
-[package.extras]
-all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"]
-graphite = ["lz4 (>=1.7.4.2)"]
-interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""]
-lxml = ["lxml (>=4.0)"]
-pathops = ["skia-pathops (>=0.5.0)"]
-plot = ["matplotlib"]
-repacker = ["uharfbuzz (>=0.45.0)"]
-symfont = ["sympy"]
-type1 = ["xattr ; sys_platform == \"darwin\""]
-unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""]
-woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"]
-
[[package]]
name = "grpcio"
version = "1.83.0"
@@ -1170,236 +876,6 @@ files = [
[package.extras]
all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
-[[package]]
-name = "importlib-metadata"
-version = "9.0.0"
-description = "Read metadata from Python packages"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7"},
- {file = "importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc"},
-]
-
-[package.dependencies]
-zipp = ">=3.20"
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.14)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=3.4)"]
-perf = ["ipython"]
-test = ["packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
-type = ["pytest-mypy (>=1.0.1) ; platform_python_implementation != \"PyPy\""]
-
-[[package]]
-name = "kiwisolver"
-version = "1.5.0"
-description = "A fast implementation of the Cassowary constraint solver"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374"},
- {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd"},
- {file = "kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476"},
- {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22"},
- {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b"},
- {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e"},
- {file = "kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb"},
- {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537"},
- {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4"},
- {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c"},
- {file = "kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede"},
- {file = "kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2"},
- {file = "kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875"},
- {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c"},
- {file = "kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb"},
- {file = "kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac"},
- {file = "kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27"},
- {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398"},
- {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db"},
- {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc"},
- {file = "kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679"},
- {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309"},
- {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2"},
- {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c"},
- {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08"},
- {file = "kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4"},
- {file = "kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b"},
- {file = "kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac"},
- {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9"},
- {file = "kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588"},
- {file = "kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819"},
- {file = "kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f"},
- {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf"},
- {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d"},
- {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083"},
- {file = "kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6"},
- {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1"},
- {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0"},
- {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15"},
- {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314"},
- {file = "kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9"},
- {file = "kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384"},
- {file = "kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7"},
- {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09"},
- {file = "kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3"},
- {file = "kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd"},
- {file = "kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3"},
- {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96"},
- {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099"},
- {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8"},
- {file = "kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87"},
- {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23"},
- {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859"},
- {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902"},
- {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167"},
- {file = "kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0"},
- {file = "kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276"},
- {file = "kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2"},
- {file = "kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53"},
- {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615"},
- {file = "kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02"},
- {file = "kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e"},
- {file = "kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac"},
- {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05"},
- {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd"},
- {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a"},
- {file = "kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554"},
- {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581"},
- {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303"},
- {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9"},
- {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79"},
- {file = "kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796"},
- {file = "kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e"},
- {file = "kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681"},
- {file = "kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57"},
- {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797"},
- {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203"},
- {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7"},
- {file = "kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57"},
- {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4"},
- {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca"},
- {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f"},
- {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed"},
- {file = "kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc"},
- {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232"},
- {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a"},
- {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737"},
- {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16"},
- {file = "kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1"},
- {file = "kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a"},
-]
-
-[[package]]
-name = "matplotlib"
-version = "3.10.9"
-description = "Python plotting package"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217"},
- {file = "matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b"},
- {file = "matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37"},
- {file = "matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294"},
- {file = "matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65"},
- {file = "matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda"},
- {file = "matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb"},
- {file = "matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb"},
- {file = "matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb"},
- {file = "matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9"},
- {file = "matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb"},
- {file = "matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f"},
- {file = "matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80"},
- {file = "matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1"},
- {file = "matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320"},
- {file = "matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285"},
- {file = "matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2"},
- {file = "matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf"},
- {file = "matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6"},
- {file = "matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42"},
- {file = "matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f"},
- {file = "matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e"},
- {file = "matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f"},
- {file = "matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838"},
- {file = "matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2"},
- {file = "matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921"},
- {file = "matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8"},
- {file = "matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9"},
- {file = "matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4"},
- {file = "matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc"},
- {file = "matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99"},
- {file = "matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d"},
- {file = "matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8"},
- {file = "matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38"},
- {file = "matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d"},
- {file = "matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f"},
- {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b"},
- {file = "matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2"},
- {file = "matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716"},
- {file = "matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f"},
- {file = "matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456"},
- {file = "matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe"},
- {file = "matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6"},
- {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c"},
- {file = "matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4"},
- {file = "matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf"},
- {file = "matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39"},
- {file = "matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c"},
- {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b"},
- {file = "matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f"},
- {file = "matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585"},
- {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20"},
- {file = "matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba"},
- {file = "matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4"},
- {file = "matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358"},
-]
-
-[package.dependencies]
-contourpy = ">=1.0.1"
-cycler = ">=0.10"
-fonttools = ">=4.22.0"
-kiwisolver = ">=1.3.1"
-numpy = ">=1.23"
-packaging = ">=20.0"
-pillow = ">=8"
-pyparsing = ">=3"
-python-dateutil = ">=2.7"
-
-[package.extras]
-dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7,<10)"]
-
[[package]]
name = "msgpack"
version = "1.2.1"
@@ -1522,21 +998,6 @@ files = [
{file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
]
-[[package]]
-name = "openpyxl"
-version = "3.1.5"
-description = "A Python library to read/write Excel 2010 xlsx/xlsm files"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"},
- {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"},
-]
-
-[package.dependencies]
-et-xmlfile = "*"
-
[[package]]
name = "orjson"
version = "3.11.9"
@@ -1858,41 +1319,6 @@ files = [
{file = "protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135"},
]
-[[package]]
-name = "psutil"
-version = "7.2.2"
-description = "Cross-platform lib for process and system monitoring."
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"},
- {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"},
- {file = "psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63"},
- {file = "psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312"},
- {file = "psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b"},
- {file = "psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9"},
- {file = "psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00"},
- {file = "psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9"},
- {file = "psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a"},
- {file = "psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf"},
- {file = "psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1"},
- {file = "psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841"},
- {file = "psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486"},
- {file = "psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979"},
- {file = "psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9"},
- {file = "psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e"},
- {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8"},
- {file = "psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc"},
- {file = "psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988"},
- {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"},
- {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"},
-]
-
-[package.extras]
-dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""]
-test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""]
-
[[package]]
name = "pyarrow"
version = "23.0.1"
@@ -1960,7 +1386,7 @@ description = "C parser in Python"
optional = false
python-versions = ">=3.10"
groups = ["main"]
-markers = "implementation_name != \"PyPy\""
+markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""
files = [
{file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"},
{file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"},
@@ -2140,21 +1566,6 @@ typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
[package.extras]
crypto = ["cryptography (>=3.4.0)"]
-[[package]]
-name = "pyparsing"
-version = "3.3.2"
-description = "pyparsing - Classes and methods to define and execute parsing grammars"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"},
- {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"},
-]
-
-[package.extras]
-diagrams = ["jinja2", "railroad-diagrams"]
-
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
@@ -2322,28 +1733,6 @@ urllib3 = ">=1.26,<3"
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"]
-[[package]]
-name = "seaborn"
-version = "0.13.2"
-description = "Statistical data visualization"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"},
- {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"},
-]
-
-[package.dependencies]
-matplotlib = ">=3.4,<3.6.1 || >3.6.1"
-numpy = ">=1.20,<1.24.0 || >1.24.0"
-pandas = ">=1.2"
-
-[package.extras]
-dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"]
-docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"]
-stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"]
-
[[package]]
name = "six"
version = "1.17.0"
@@ -2368,18 +1757,6 @@ files = [
{file = "soupsieve-2.9.2.tar.gz", hash = "sha256:4a55d8cf158a9c2e587fa4922f1bbb91d68ac829e2d6f25403a85747c71daf74"},
]
-[[package]]
-name = "squarify"
-version = "0.4.4"
-description = "Pure Python implementation of the squarify treemap layout algorithm"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "squarify-0.4.4-py3-none-any.whl", hash = "sha256:d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11"},
- {file = "squarify-0.4.4.tar.gz", hash = "sha256:b8a110c8dc5f1cd1402ca12d79764a081e90bfc445346cfa166df929753ecb46"},
-]
-
[[package]]
name = "starlette"
version = "1.6.0"
@@ -2399,22 +1776,6 @@ typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""
[package.extras]
full = ["httpx (>=0.27.0,<0.29.0)", "httpx2 (>=2.0.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
-[[package]]
-name = "tenacity"
-version = "9.1.4"
-description = "Retry code until it succeeds"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55"},
- {file = "tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a"},
-]
-
-[package.extras]
-doc = ["reno", "sphinx"]
-test = ["pytest", "tornado (>=4.5)", "typeguard"]
-
[[package]]
name = "tomli"
version = "2.4.1"
@@ -2622,75 +1983,6 @@ dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"]
docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx_rtd_theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"]
test = ["aiohttp (>=3.10.5)", "flake8 (>=6.1,<7.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=25.3.0,<25.4.0)", "pycodestyle (>=2.11.0,<2.12.0)"]
-[[package]]
-name = "vnai"
-version = "2.4.8"
-description = "Vnstock Analytics Interface"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "vnai-2.4.8-py3-none-any.whl", hash = "sha256:5961dfcda65e705f7587a8b2d16854106fb8cd021606a5a42cf28da8d0ae79fe"},
- {file = "vnai-2.4.8.tar.gz", hash = "sha256:881a15643ae349ba4bcbfe6c42bf1943b9faf5e2b4f918d2d12aa104daaf38bb"},
-]
-
-[package.dependencies]
-cffi = ">=1.17.1"
-psutil = ">=5.8.0"
-requests = ">=2.25.0"
-
-[package.extras]
-dev = ["pytest (>=6.0.0)"]
-
-[[package]]
-name = "vnstock"
-version = "4.0.2"
-description = "A beginner-friendly yet powerful Python toolkit for financial analysis and automation — built to make modern investing accessible to everyone"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "vnstock-4.0.2-py3-none-any.whl", hash = "sha256:4a32c169b934bc130dcb0267ffd01635d3e7e3f12cf485c82909e38a9cdf9489"},
- {file = "vnstock-4.0.2.tar.gz", hash = "sha256:a60052f1a8b2566e375c538456199c4d1d6e58fdd32e6e2ff790b51aece84041"},
-]
-
-[package.dependencies]
-beautifulsoup4 = "*"
-importlib-metadata = ">=1.0"
-openpyxl = "*"
-packaging = ">=20.0"
-pandas = "*"
-psutil = "*"
-pydantic = "*"
-pytz = "*"
-requests = "*"
-seaborn = "*"
-tenacity = "*"
-vnai = ">=2.4.8"
-vnstock_ezchart = ">=0.0.3"
-
-[package.extras]
-test = ["pytest (>=7.0)", "pytest-cov (>=4.0)", "pytest-timeout"]
-
-[[package]]
-name = "vnstock-ezchart"
-version = "0.0.3"
-description = "A comprehensive wrapper for Matplotlib, Seaborn which designed to provide a fast, simple, and efficient user experience for routine data visualization tasks"
-optional = false
-python-versions = ">=3.10"
-groups = ["main"]
-files = [
- {file = "vnstock_ezchart-0.0.3-py3-none-any.whl", hash = "sha256:cd060e7feabd255820f070c365c102325bf86e35f23865dcab3416d093e6bf32"},
- {file = "vnstock_ezchart-0.0.3.tar.gz", hash = "sha256:e91c36babdd083dbf490a2c3905a687fae2ae054a3d10a26f105f6d6513a6a52"},
-]
-
-[package.dependencies]
-openpyxl = "*"
-requests = "*"
-squarify = "*"
-vnstock = ">=3.2.7"
-wordcloud = "*"
-
[[package]]
name = "watchfiles"
version = "1.1.1"
@@ -2901,99 +2193,7 @@ files = [
{file = "websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5"},
]
-[[package]]
-name = "wordcloud"
-version = "1.9.6"
-description = "A little word cloud generator"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "wordcloud-1.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:41dfe1c6b30f731225ce67697b0589df5539032b82a4c334f94ead3151d589aa"},
- {file = "wordcloud-1.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c4677c4b70e800ce3ff84b904db2ab9a30a6ad03898c668a71507da9ce14ad7"},
- {file = "wordcloud-1.9.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b200b26bc746fa97c52dc8eba2bdca95c95366ddca51df167bd35a16c48a678"},
- {file = "wordcloud-1.9.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:682fd4bfc2f0c262c1ccf2bbc0ed503361f40c3dcd2e3dbe9ec3c233916cada6"},
- {file = "wordcloud-1.9.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f41dcda0ca3a5b3c220ee9a928db7fe3b6bcfc534e5b9fcdac8afebb59a18f1"},
- {file = "wordcloud-1.9.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d63b1dcd3bc3c5f68ef591f454cae13c0d613a91b86db3d62f5f420b333fbedb"},
- {file = "wordcloud-1.9.6-cp310-cp310-win32.whl", hash = "sha256:5746286fb0506fd9731ec35c25046e6437db9f1e85155cdba113ac184625b3f8"},
- {file = "wordcloud-1.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:2c9702fa654c9305d1bff86043147ee19661da145218e7b0114cb4f6d1459462"},
- {file = "wordcloud-1.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6eab5eb4caa4bda125dd3acc8f71697617c26c2a2203d8fcdaf2a92a7d12a4a8"},
- {file = "wordcloud-1.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bc9ac1ad23ef76c1d1fbbeafbfb6125d2d63a9346bac642ca201cbc457da8f8a"},
- {file = "wordcloud-1.9.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33e3c214381244043d5921ba653ccf7e7407c3f97915dc99c639ebc4acd47dce"},
- {file = "wordcloud-1.9.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1c31741b7612d9f408551434d4164e75d2e6b8542b59ec53ea77f773286713a"},
- {file = "wordcloud-1.9.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec394e02202e84550f50ab88cba5683f54775f89998dd46b8e41e297a9f1735c"},
- {file = "wordcloud-1.9.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dc80e742a95af65bae9556b5ec77837a104b12aeadb4772dedbd352f9dfc3e7a"},
- {file = "wordcloud-1.9.6-cp311-cp311-win32.whl", hash = "sha256:c96ba0b5d7194322e88bc2bfbaf653cd3de9a5dbe3f78e07ea365ac40cd2f987"},
- {file = "wordcloud-1.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:8a1b3b15509e05c1c3322a205108f7da31ca06bbcf979c104e1a7b9b9b76fff2"},
- {file = "wordcloud-1.9.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e51ebaeb6ce337b26ce4ba7e5eb3359981a8a648713301a252f49dbab5fe56cb"},
- {file = "wordcloud-1.9.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba607e25f7ab78085e6c7a9b3d9cb5eb637e73560e5a8b4f6924705d64a76b0e"},
- {file = "wordcloud-1.9.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fce2f0fb0469623db85e1e974ea64f51e78758c4d8e84ed0b4344530d1ba8ab"},
- {file = "wordcloud-1.9.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f534204038811676890bc91c10bcca0b04c6933011c250b4b09323d2a0b0a8c1"},
- {file = "wordcloud-1.9.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:dfea5803c6e2b540da04f9693da93fd90d9babeed284950ab720487eb7b44942"},
- {file = "wordcloud-1.9.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11b55fbcb2fa5db7e876887858fdf6480f21300b4384ff610c3aa9c0ef420ae9"},
- {file = "wordcloud-1.9.6-cp312-cp312-win32.whl", hash = "sha256:1200af0c9be744c9e70fd7305c80d4b317fbcb1d41cf9b72a24d648e70ad598c"},
- {file = "wordcloud-1.9.6-cp312-cp312-win_amd64.whl", hash = "sha256:7977a1727e059d6ba0a679dacbab57a966ab28913fc1764079efdfdc67f8e4d2"},
- {file = "wordcloud-1.9.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:706d19a085170151b1deade56fcc1b367e809b4ebea76f2ee39ecb95d45b2fcc"},
- {file = "wordcloud-1.9.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec02d1a44040d32a21acdeaf3fe7d1c4f4ad6d42fd417b13c7c60b41403c6978"},
- {file = "wordcloud-1.9.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:122d01c617cac7a6620acdcf182ff117df1e08dc31d1947ac669c5af1946c9bf"},
- {file = "wordcloud-1.9.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cad69c24ae6b3f33eae5ebff012ad6c5dd7e79c0f6f768646676722281acf8f"},
- {file = "wordcloud-1.9.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7f5fef15420e4fd1c3ba18766cd7225f6310a780602798cdd35046b004e6adb8"},
- {file = "wordcloud-1.9.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b82ee3bf54d1f324346c7eebe4d0146748b913e790ddb661679d7559fcc0769"},
- {file = "wordcloud-1.9.6-cp313-cp313-win32.whl", hash = "sha256:3a245498f429b4b37e909e5410887da8aed697f1d8b70c0a6d7f37ac7188654d"},
- {file = "wordcloud-1.9.6-cp313-cp313-win_amd64.whl", hash = "sha256:3d3c5b0b5f66a385300dacb5ba2c2dba67c18c332b934fdac08261c1c7ee7d7a"},
- {file = "wordcloud-1.9.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5cd785127483b835d22c7e7a235fbd925d01fcd2846c2eacf45d715e32775563"},
- {file = "wordcloud-1.9.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f9bfe99fde048e109343858a7a866bdccd95f70cabe171aa7fd9fb7609bff12b"},
- {file = "wordcloud-1.9.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bfc67c14d5af51a8ddf2a36be85f4ef017c835f3f37a11ab7ef1a898c950f8b4"},
- {file = "wordcloud-1.9.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2998a9a6ea9dc18c81a980403d03ed97822c971bd971b2faa3b5ee2da047f237"},
- {file = "wordcloud-1.9.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e11c048f9056a9dda20627c29c578cb34f6778b152d0f0eb0dd33581faf03f65"},
- {file = "wordcloud-1.9.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:aaaebdc056052fc3f21e3aebc6653fc76ee6c4fdcd5785a9991ce186eb15a776"},
- {file = "wordcloud-1.9.6-cp314-cp314-win32.whl", hash = "sha256:eabd94c69435b19163991da8e71310bb4873e31982e54ff4cf62317f0e1223b0"},
- {file = "wordcloud-1.9.6-cp314-cp314-win_amd64.whl", hash = "sha256:8549f85a93626f5d03c06e63106ce228910008becd1e1f3b49693d13e33a5873"},
- {file = "wordcloud-1.9.6-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a4070ef896396d3fbb7a71c775c08138d61b85ea4d414e86b4e132f8736f20f6"},
- {file = "wordcloud-1.9.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:436b99261ef31369019b989137a940835de887de52dce5b63786ef13fb82e18a"},
- {file = "wordcloud-1.9.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4804bee501b85b6f6015c434879a3e9ef2795b97c00aec387a0d6adfcaa2ca5"},
- {file = "wordcloud-1.9.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:33a4b3dcbd9095a968dd3201bc6667d9788ec7b949f6d8356985a8fc64a0590b"},
- {file = "wordcloud-1.9.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74c9e5cb52c35aa822ff7f3251a633aa52b830ba206be275c1da743de255a15c"},
- {file = "wordcloud-1.9.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:337b73155c60fc536cab8a998bd8312f81c99524716c86e3e43f3b6408f42bdc"},
- {file = "wordcloud-1.9.6-cp314-cp314t-win32.whl", hash = "sha256:32f93e42b44dca992eb5f692ddd258f043465f49d9a53e6aa3d4853fca615e23"},
- {file = "wordcloud-1.9.6-cp314-cp314t-win_amd64.whl", hash = "sha256:22cf91490bcc0fa23585acbab1906a44a438fa7dd4d9a2b2663f39c8650634a6"},
- {file = "wordcloud-1.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4548f339110e56b4fb198e765869cab2ed9005acedf4055a5f880543b3810bdc"},
- {file = "wordcloud-1.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fe9ef0567b98be19b32802ef9167821c5e49d0873620926a2ba2cfef05931591"},
- {file = "wordcloud-1.9.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:154b2e526c5d1df57dfbf53865f41dc00f2903a58ad23b5012254c3866fc225e"},
- {file = "wordcloud-1.9.6-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:db98e5a406365bfd452fe4f4f9eaedb2dd9ea882d27c4807d2231e335a2b718b"},
- {file = "wordcloud-1.9.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:15b11da41fd256c0ea171a6078347ab24061d6ee13284f70f7870881c700f119"},
- {file = "wordcloud-1.9.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:261e14fe754c8688ccd5999aa30ffe3c5dcd206874a2f162c526b0e0c3470e35"},
- {file = "wordcloud-1.9.6-cp39-cp39-win32.whl", hash = "sha256:36069df9d64217a734f360f2f9587c34b4c26925d3d39ed62cdd85221013b2ff"},
- {file = "wordcloud-1.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ad4bac1d74ab98fd36bc7c71567b99fc4f3935c4e11f413d314102a78d151147"},
- {file = "wordcloud-1.9.6.tar.gz", hash = "sha256:df17c468ff903bd0aba4f87c6540745d13a4931220dd4937cb363ad85a4771b9"},
-]
-
-[package.dependencies]
-matplotlib = "*"
-numpy = ">=1.19.3"
-pillow = "*"
-
-[[package]]
-name = "zipp"
-version = "3.23.1"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc"},
- {file = "zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110"},
-]
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
-type = ["pytest-mypy"]
-
[metadata]
lock-version = "2.1"
python-versions = "^3.10"
-content-hash = "314c2146b1f37132fb355d47a05654b7ac385e49852f581b36363bef0f62a724"
+content-hash = "d0af8c4e1e251205cfa52599fd30362e0136cdbc0c66ddbe8d342c3faaac1692"
diff --git a/pyproject.toml b/pyproject.toml
index 485c81d4..a33bd2e2 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,11 +14,11 @@ dependencies = [
"redis (>=5.0.0,<6.0.0)",
"hiredis (>=2.3.0,<3.0.0)",
"pandas (>=2.3.0,<3.0.0)",
+ "packaging (>=26.2,<27.0.0)",
"pyarrow (>=23.0.1,<24.0.0)",
"pyyaml (>=6.0.2,<7.0.0)",
"websocket-client (>=1.8.0,<2.0.0)",
"requests (>=2.32.4,<3.0.0)",
- "vnstock (>=3.0.0)",
"numpy (>=1.26.0,<2.0.0)",
"python-dotenv (>=1.0.1,<2.0.0)",
"orjson (>=3.10.0,<4.0.0)",
diff --git a/qdl/adapters/binance/admitted_klines.py b/qdl/adapters/binance/admitted_klines.py
new file mode 100644
index 00000000..ddf897fd
--- /dev/null
+++ b/qdl/adapters/binance/admitted_klines.py
@@ -0,0 +1,120 @@
+"""Binance kline REST behind the Rust provider admission (KN-4 D47-2).
+
+Purpose: the BAR edge's venue history and final-bar reads must not spend the
+host IP's shared Binance budget blindly. A drop-in ``fetcher`` for
+``qdl.adapters.binance.bar_edge`` (same call shape as
+``app.providers.binance.rest.fetch_klines``) that:
+
+* holds a Rust grant per page, costing the documented request weight of the
+ page size (USD-M ``/fapi/v1/klines``: limit <100 -> 1, <500 -> 2, <=1000 -> 5,
+ >1000 -> 10; Spot ``/api/v3/klines``: 2);
+* uses one pooled HTTP session;
+* turns HTTP 418/429 or code -1003 into ``ProviderRateLimited`` after relaying
+ it (with ``Retry-After``) to Rust - never retried here;
+* reads ``X-MBX-USED-WEIGHT-1M`` (the whole IP's usage, production included):
+ BATCH work (history) above ``ip_share`` of the IP limit waits for the next
+ minute window, so realtime reads keep the rest.
+
+Boundary: public market data only; no key; no budget of its own (Rust owns it).
+"""
+from __future__ import annotations
+
+import time
+from typing import Any, Callable
+
+import requests
+
+from app.providers.binance.rest import BinanceProviderError, normalize_interval
+from qdl.admission.contracts import AdmissionPriority, ProviderLane
+from qdl.admission.edge import BlockingProviderAdmission
+
+_URLS = {"usdm": "https://fapi.binance.com/fapi/v1/klines", "spot": "https://api.binance.com/api/v3/klines"}
+# Documented request-weight limits per IP per minute.
+IP_WEIGHT_LIMIT_1M = {"usdm": 2400, "spot": 6000}
+
+
+def binance_klines_weight(market: str, limit: int) -> int:
+ if market == "spot":
+ return 2
+ if limit < 100:
+ return 1
+ if limit < 500:
+ return 2
+ if limit <= 1000:
+ return 5
+ return 10
+
+
+def _market(value: str) -> str:
+ market = str(value or "").lower().strip()
+ market = "usdm" if market in {"usdm", "futures"} else market
+ if market not in _URLS:
+ raise ValueError(f"admitted Binance klines need an explicit market, not {value!r}")
+ return market
+
+
+class AdmittedBinanceKlines:
+ def __init__(self, admission: BlockingProviderAdmission, *, priority: AdmissionPriority,
+ session: Any | None = None, ip_share: float = 0.5, timeout_s: float = 10.0,
+ clock: Callable[[], float] = time.time, sleep: Callable[[float], None] = time.sleep) -> None:
+ if not 0 < ip_share <= 1:
+ raise ValueError("ip_share must be within (0, 1]")
+ self._admission = admission
+ self._priority = priority
+ self._session = session or requests.Session()
+ self._ip_share = ip_share
+ self._timeout_s = timeout_s
+ self._clock = clock
+ self._sleep = sleep
+
+ def __call__(self, symbol: str, *, interval: str, limit: int, end_time: int | None = None,
+ start_time: int | None = None, market: str = "usdm") -> dict:
+ market = _market(market)
+ lane = ProviderLane("BINANCE", "USDM" if market == "usdm" else "SPOT", "KLINES")
+ params: dict[str, Any] = {"symbol": symbol.upper().strip(), "interval": normalize_interval(interval),
+ "limit": int(limit)}
+ if start_time is not None:
+ params["startTime"] = start_time
+ if end_time is not None:
+ params["endTime"] = end_time
+ with self._admission.lease(lane, f"klines:{params['symbol']}:{params['interval']}",
+ priority=self._priority, token_cost=binance_klines_weight(market, limit)):
+ response = self._session.get(_URLS[market], params=params, timeout=self._timeout_s)
+ used = _int_header(response, "X-MBX-USED-WEIGHT-1M")
+ if response.status_code == 200:
+ data = response.json()
+ if (self._priority is AdmissionPriority.BATCH and used is not None
+ and used >= self._ip_share * IP_WEIGHT_LIMIT_1M[market]):
+ # The whole IP (production included) is past its share: history waits.
+ now = self._clock()
+ self._sleep(max(0.0, 60.0 - (now % 60.0)) + 0.5)
+ return {"provider": "binance", "market": market, "symbol": params["symbol"],
+ "requested_interval": params["interval"], "provider_interval": params["interval"],
+ "params": params, "data": data, "used_weight_1m": used}
+ code = _provider_code(response)
+ if response.status_code in {418, 429} or code == -1003:
+ retry_after_s = _int_header(response, "Retry-After")
+ raise self._admission.rate_limited(
+ lane, http_status=response.status_code if response.status_code in {418, 429} else None,
+ provider_code=-1003 if code == -1003 else None,
+ retry_after_ms=retry_after_s * 1000 if retry_after_s else None)
+ raise BinanceProviderError(
+ f"Binance klines failed for {params['symbol']}",
+ attempts=[{"market": market, "status_code": response.status_code, "provider_code": code}])
+
+
+def _int_header(response: Any, name: str) -> int | None:
+ value = (getattr(response, "headers", None) or {}).get(name)
+ try:
+ return int(value) if value is not None else None
+ except (TypeError, ValueError):
+ return None
+
+
+def _provider_code(response: Any) -> int | None:
+ try:
+ payload = response.json()
+ except ValueError:
+ return None
+ code = payload.get("code") if isinstance(payload, dict) else None
+ return code if isinstance(code, int) else None
diff --git a/qdl/adapters/binance/bar_edge.py b/qdl/adapters/binance/bar_edge.py
index b0e979aa..a68513a6 100644
--- a/qdl/adapters/binance/bar_edge.py
+++ b/qdl/adapters/binance/bar_edge.py
@@ -7,7 +7,7 @@
from typing import Callable
from app.providers.binance.rest import BinanceProviderError, fetch_klines
-from qdl.adapters.intervals import canonical_interval_ms, latest_closed_boundary_ms
+from qdl.adapters.intervals import BarHistoryGapError, canonical_interval_ms, latest_closed_boundary_ms
from qdl.provider.v1 import raw_provider_pb2
from qdl.raw.capture import capture_exact_frame
@@ -194,7 +194,15 @@ def fetch_closed_bar_history_raw_envelopes(
fetcher: Callable = fetch_klines,
sleep: Callable[[float], None] = time.sleep,
test_provenance: bool = False,
+ allow_short: bool = False,
) -> tuple[raw_provider_pb2.RawProviderEnvelope, ...]:
+ """Walk back ``limit`` closed bars page by page.
+
+ ``allow_short`` (KN-4 D47-3): a page with fewer closed rows than asked is
+ accepted as the venue's first bars only when one more row older than it
+ does not exist (a new listing); the shorter, still contiguous window is
+ returned and the caller reports it. Otherwise a short page stays an error.
+ """
if limit < 1 or limit > _MAX_HISTORY_ROWS:
raise ValueError(
f"Binance history limit must be between 1 and {_MAX_HISTORY_ROWS}"
@@ -228,11 +236,17 @@ def fetch_closed_bar_history_raw_envelopes(
observed_ms=observed_ms,
interval_ms=interval_ms,
)
+ exhausted = False
if len(closed) != page_limit:
- raise RuntimeError(
- "Binance closed-bar history page is incomplete "
- f"requested={page_limit} observed={len(closed)}"
- )
+ if not (allow_short and len(closed) < page_limit and _provider_exhausted_before(
+ binding, closed, page_end_ms=page_end_ms, observed_ms=observed_ms, interval_ms=interval_ms,
+ attempts=attempts, fetcher=fetcher, sleep=sleep,
+ )):
+ raise RuntimeError(
+ "Binance closed-bar history page is incomplete "
+ f"requested={page_limit} observed={len(closed)}"
+ )
+ exhausted = True
if any(int(row[6]) > page_end_ms for row in closed):
raise RuntimeError(
"Binance closed-bar history page exceeds requested end boundary"
@@ -245,6 +259,8 @@ def fetch_closed_bar_history_raw_envelopes(
"Binance history pages conflict for one open time"
)
selected_by_open[open_time] = row
+ if exhausted or not closed:
+ break
earliest_open_ms = min(int(row[0]) for row in closed)
next_page_end_ms = earliest_open_ms - 1
if next_page_end_ms >= page_end_ms:
@@ -255,13 +271,14 @@ def fetch_closed_bar_history_raw_envelopes(
remaining -= page_limit
selected = tuple(selected_by_open[key] for key in sorted(selected_by_open))
- if len(selected) != limit:
+ if len(selected) != limit and not (allow_short and len(selected) < limit):
raise RuntimeError(
f"Binance closed-bar history is incomplete requested={limit} observed={len(selected)}"
)
opens = [int(row[0]) for row in selected]
- if any(current - previous != interval_ms for previous, current in zip(opens, opens[1:])):
- raise RuntimeError("Binance closed-bar history contains a time gap")
+ for previous, current in zip(opens, opens[1:]):
+ if current - previous != interval_ms:
+ raise BarHistoryGapError("Binance", binding.native_symbol, binding.interval, previous, current)
received_at_ns = time.time_ns()
return tuple(
_capture_row(
@@ -275,6 +292,28 @@ def fetch_closed_bar_history_raw_envelopes(
)
+def _provider_exhausted_before(
+ binding: BinanceBarRawBinding,
+ closed: tuple,
+ *,
+ page_end_ms: int,
+ observed_ms: int,
+ interval_ms: int,
+ attempts: int,
+ fetcher: Callable,
+ sleep: Callable[[float], None],
+) -> bool:
+ """True when no closed bar exists before this page (the venue's first bars)."""
+
+ before_ms = (min(int(row[0]) for row in closed) if closed else page_end_ms + 1) - 1
+ older = _closed_rows(
+ _fetch_rows(binding, end_time_ms=before_ms, limit=1, attempts=attempts, fetcher=fetcher, sleep=sleep),
+ observed_ms=observed_ms,
+ interval_ms=interval_ms,
+ )
+ return not [row for row in older if int(row[6]) <= before_ms]
+
+
def fetch_settled_closed_bar_raw_envelope(
binding: BinanceBarRawBinding,
*,
diff --git a/qdl/adapters/intervals.py b/qdl/adapters/intervals.py
index f053059e..ad7ff6a1 100644
--- a/qdl/adapters/intervals.py
+++ b/qdl/adapters/intervals.py
@@ -11,6 +11,19 @@
from __future__ import annotations
+class BarHistoryGapError(RuntimeError):
+ """Provider returned a discontinuous closed history, not an IP/rate failure."""
+
+ def __init__(self, provider: str, symbol: str, interval: str, previous: int, current: int):
+ self.provider, self.symbol, self.interval = provider, symbol, interval
+ self.previous, self.current = previous, current
+ self.kind = ("OVERLAPPING_PROVIDER_WINDOWS"
+ if current - previous < canonical_interval_ms(interval)
+ else "MISSING_PROVIDER_WINDOW")
+ super().__init__(f"{provider} closed-bar history discontinuity kind={self.kind} "
+ f"symbol={symbol} interval={interval} previous_ms={previous} current_ms={current}")
+
+
_UNIT_MS = {
"s": 1_000,
"m": 60_000,
diff --git a/qdl/adapters/okx/admitted_rest.py b/qdl/adapters/okx/admitted_rest.py
new file mode 100644
index 00000000..bc767c8e
--- /dev/null
+++ b/qdl/adapters/okx/admitted_rest.py
@@ -0,0 +1,187 @@
+"""OKX public REST behind the Rust provider admission (KN-4 D47-2).
+
+Purpose: ``OkxRestClient`` keeps a process-local token bucket per client
+instance, and the BAR edge built a new client for every history call, so no
+budget crossed calls; it also retried a rate-limit reply like any error. This
+subclass is the drop-in client for ``OkxHistoricalClient`` in the edge: one
+shared instance, one pooled session, one Rust grant per request (cost 1; OKX
+market endpoints are limited per IP per endpoint), and HTTP 429 or code
+``50011`` relayed to Rust and raised as ``ProviderRateLimited`` - never
+retried here. Other transient errors keep the parent's bounded retries.
+
+Contract statistics can use the same lease path via REFERENCE_CONTRACT_STATISTICS
+lanes. They also keep the shared client's conservative endpoint/instrument pacing.
+Wiring those lanes into a deployed reference runtime/policy is separately required.
+Boundary: public market data only; Rust owns shared admission.
+"""
+from __future__ import annotations
+
+import asyncio
+import random
+from collections.abc import Mapping
+from typing import Any
+
+import requests
+
+from qdl.admission import AdmissionContractError, AdmissionTransportError
+from qdl.admission.contracts import (
+ AdmissionDisposition, AdmissionPriority, AdmissionRequest, ProviderAdmissionRuntime, ProviderLane,
+)
+from qdl.admission.edge import BlockingProviderAdmission, ProviderRateLimited, request_id
+from qdl.adapters.okx.client import (
+ OKX_CONTRACT_STATISTICS_LIMITS, OKX_REST_BASE, OkxRestClient,
+ OkxStatisticsRateLimited, statistics_retry_after_ms,
+)
+
+from qdl.reference.contracts import ReferenceProviderExhausted
+
+_FAMILIES = {
+ "/api/v5/market/history-candles": "HISTORY_CANDLES",
+ "/api/v5/market/candles": "CANDLES",
+}
+
+
+class AdmittedOkxRestClient(OkxRestClient):
+ def __init__(self, admission: BlockingProviderAdmission, *, priority: AdmissionPriority,
+ session: Any | None = None, base_url: str = OKX_REST_BASE, timeout_seconds: float = 10.0) -> None:
+ super().__init__(base_url=base_url, timeout_seconds=timeout_seconds)
+ self._admission = admission
+ self._priority = priority
+ self._session = session or requests.Session()
+
+ @staticmethod
+ def lane_for(path: str, params: Mapping[str, str]) -> ProviderLane:
+ if path in OKX_CONTRACT_STATISTICS_LIMITS:
+ inst = str(params.get("instId") or "").upper()
+ parts = inst.split("-")
+ if len(parts) != 3 or not all(parts):
+ raise ValueError("admitted OKX statistics requires one exact SWAP/FUTURES instId")
+ if parts[-1] == "SWAP":
+ market = "SWAP"
+ elif len(parts[-1]) == 6 and parts[-1].isascii() and parts[-1].isdigit():
+ market = "FUTURES"
+ else:
+ raise ValueError("admitted OKX statistics requires a SWAP or dated FUTURES instId")
+ return ProviderLane("OKX", market, "REFERENCE_CONTRACT_STATISTICS")
+ family = _FAMILIES.get(path)
+ if family is None:
+ raise ValueError(f"admitted OKX client serves market candle endpoints only, not {path}")
+ inst = str(params.get("instId") or "").upper()
+ return ProviderLane("OKX", "SWAP" if inst.endswith("-SWAP") else "SPOT", family)
+
+ def _leased_get(self, path: str, params: Mapping[str, str]) -> list[dict[str, Any]]:
+ lane = self.lane_for(path, params)
+ with self._admission.lease(lane, f"{lane.endpoint_family.lower()}:{params.get('instId')}",
+ priority=self._priority, token_cost=1):
+ response = self._session.get(f"{self._base_url}{path}", params=dict(params), timeout=self._timeout)
+ try:
+ payload = response.json()
+ except ValueError:
+ payload = {}
+ code = str(payload.get("code")) if isinstance(payload, dict) else None
+ if response.status_code == 429 or code == "50011":
+ raise self._admission.rate_limited(
+ lane, http_status=429 if response.status_code == 429 else None,
+ provider_code=50011 if code == "50011" else None,
+ retry_after_ms=statistics_retry_after_ms(response) if path in OKX_CONTRACT_STATISTICS_LIMITS else None)
+ if response.status_code != 200:
+ raise requests.HTTPError(f"OKX HTTP {response.status_code} {path}")
+ if code != "0" or not isinstance(payload.get("data"), list):
+ raise ValueError(f"OKX V5 error code={code} msg={payload.get('msg')}")
+ return payload["data"]
+
+ async def get(self, path: str, *, params: Mapping[str, str], bucket: str,
+ attempts: int = 3) -> list[dict[str, Any]]:
+ last_error: BaseException | None = None
+ for attempt in range(attempts):
+ try:
+ if path in OKX_CONTRACT_STATISTICS_LIMITS:
+ await (await self._bucket_for(path, params, bucket)).acquire()
+ return await asyncio.to_thread(self._leased_get, path, params)
+ except ProviderRateLimited:
+ raise
+ except (requests.RequestException, ValueError) as error:
+ last_error = error
+ if attempt + 1 < attempts:
+ delay = min(4.0, 0.5 * 2**attempt)
+ await asyncio.sleep(delay + random.random() * delay * 0.2)
+ raise RuntimeError(f"OKX V5 request exhausted retries: {path}") from last_error
+
+
+class AsyncAdmittedOkxStatisticsClient:
+ """New reference pages share Query's existing async Rust admission runtime."""
+
+ def __init__(self, client: OkxRestClient, admission: ProviderAdmissionRuntime) -> None:
+ self._client = client
+ self._admission = admission
+
+ async def _page(self, path: str, params: Mapping[str, str], bucket: str, lane: ProviderLane):
+ try:
+ return await self._client.get(path, params=params, bucket=bucket, attempts=1)
+ except OkxStatisticsRateLimited as error:
+ try:
+ await self._admission.record_rate_limit(
+ lane, None, http_status=error.http_status,
+ provider_code=error.provider_code, retry_after_ms=error.retry_after_ms,
+ )
+ except (AdmissionContractError, AdmissionTransportError):
+ pass # The typed provider failure still reaches the caller.
+ raise
+
+ async def get(self, path: str, *, params: Mapping[str, str], bucket: str,
+ attempts: int = 3) -> list[dict[str, Any]]:
+ if path not in OKX_CONTRACT_STATISTICS_LIMITS:
+ raise ValueError("async OKX admission serves contract statistics only")
+ if not 1 <= attempts <= 3:
+ raise ValueError("OKX statistics attempts must be between 1 and 3")
+ lane = AdmittedOkxRestClient.lane_for(path, params)
+ for attempt in range(attempts):
+ request = AdmissionRequest(
+ lane=lane, request_id=request_id("okx-stats"),
+ priority=AdmissionPriority.BATCH, token_cost=1,
+ )
+ try:
+ decision = await self._admission.admit(request)
+ decision.validate_for(request)
+ except (AdmissionContractError, AdmissionTransportError) as error:
+ raise ReferenceProviderExhausted("OKX statistics shared admission failed") from error
+ if decision.disposition is not AdmissionDisposition.GRANTED:
+ raise ReferenceProviderExhausted(
+ "OKX statistics deferred by shared admission", retry_after_ms=decision.retry_after_ms,
+ )
+ try:
+ try:
+ # requests runs in a worker thread: cancellation cannot end
+ # the HTTP operation. Retain its lease until the page exits.
+ page = asyncio.create_task(self._page(path, params, bucket, lane))
+ try:
+ return await asyncio.shield(page)
+ except asyncio.CancelledError:
+ while not page.done():
+ try:
+ await asyncio.shield(page)
+ except asyncio.CancelledError:
+ continue
+ except Exception:
+ break
+ if not page.cancelled():
+ try:
+ page.result()
+ except Exception:
+ pass
+ raise
+ except RuntimeError as error:
+ if not isinstance(error.__cause__, (requests.RequestException, ValueError)):
+ raise
+ if attempt + 1 == attempts:
+ raise ReferenceProviderExhausted("OKX statistics exhausted admitted retries") from error
+ finally:
+ try:
+ completed = await asyncio.shield(self._admission.complete(lane, request.request_id))
+ except (AdmissionContractError, AdmissionTransportError) as error:
+ raise ReferenceProviderExhausted("OKX statistics admission completion failed") from error
+ if not completed:
+ raise ReferenceProviderExhausted("OKX statistics admission lease was not active at completion")
+ delay = min(4.0, 0.5 * 2**attempt)
+ await asyncio.sleep(delay + random.random() * delay * 0.2)
+ raise AssertionError("bounded OKX statistics retry loop did not terminate")
diff --git a/qdl/adapters/okx/bar_edge.py b/qdl/adapters/okx/bar_edge.py
index f6d65197..f48f0441 100644
--- a/qdl/adapters/okx/bar_edge.py
+++ b/qdl/adapters/okx/bar_edge.py
@@ -6,6 +6,7 @@
from dataclasses import dataclass
from qdl.adapters.intervals import (
+ BarHistoryGapError,
canonical_interval_ms,
latest_closed_boundary_ms,
okx_bar_size,
@@ -73,7 +74,11 @@ async def fetch_closed_bar_history_raw_envelopes(
now_ms: int | None = None,
history_client: OkxHistoricalClient | None = None,
test_provenance: bool = False,
+ allow_short: bool = False,
) -> tuple[raw_provider_pb2.RawProviderEnvelope, ...]:
+ """``allow_short`` (KN-4 D47-3): when OKX itself has no older candles
+ (``PROVIDER_EXHAUSTED``), the shorter contiguous window is returned for the
+ caller to report; any other short coverage stays an error."""
if limit < 1 or limit > 10_000:
raise ValueError("OKX history limit must be between 1 and 10000")
observed_ms = int(now_ms if now_ms is not None else time.time() * 1000)
@@ -88,7 +93,7 @@ async def fetch_closed_bar_history_raw_envelopes(
observed_ms,
provider="OKX",
) - 1
- start_ms = end_ms - (limit + 2) * interval_ms
+ start_ms = max(0, end_ms - (limit + 2) * interval_ms)
client = history_client or OkxHistoricalClient(OkxRestClient())
history = await client.candles(
inst_id=binding.native_symbol,
@@ -99,23 +104,22 @@ async def fetch_closed_bar_history_raw_envelopes(
max_records=limit + 3,
max_pages=max(2, (limit + 299) // 300 + 1),
)
- if history.coverage.status != "FULL":
+ exhausted = allow_short and history.coverage.terminal_reason == "PROVIDER_EXHAUSTED"
+ if history.coverage.status != "FULL" and not exhausted:
raise RuntimeError(
f"OKX closed-bar history coverage is {history.coverage.status}, not FULL"
)
confirmed = tuple(item for item in history.records if item.confirmed)
- if len(confirmed) < limit:
+ if len(confirmed) < limit and not exhausted:
raise RuntimeError(
"OKX closed-bar history is short: requested="
f"{limit} confirmed={len(confirmed)}"
)
records = tuple(sorted(confirmed, key=lambda item: item.open_ts_ms))[-limit:]
opens = [item.open_ts_ms for item in records]
- if any(
- current - previous != interval_ms
- for previous, current in zip(opens, opens[1:])
- ):
- raise RuntimeError("OKX closed-bar history contains a time gap")
+ for previous, current in zip(opens, opens[1:]):
+ if current - previous != interval_ms:
+ raise BarHistoryGapError("OKX", binding.native_symbol, binding.interval, previous, current)
if any(not item.confirmed for item in records):
raise RuntimeError("OKX history returned a provisional candle in the closed window")
diff --git a/qdl/adapters/okx/client.py b/qdl/adapters/okx/client.py
index f69acc89..c62ad044 100644
--- a/qdl/adapters/okx/client.py
+++ b/qdl/adapters/okx/client.py
@@ -6,11 +6,49 @@
import time
from collections.abc import Awaitable, Callable, Mapping
from dataclasses import dataclass
+from datetime import datetime, timezone
+from email.utils import parsedate_to_datetime
+import math
from enum import Enum
from typing import Any
import requests
+from qdl.reference.contracts import ReferenceProviderExhausted
+
+
+# Official Trading Statistics limits per endpoint + IP + instrument (2026-09-26).
+OKX_CONTRACT_STATISTICS_LIMITS = {
+ "/api/v5/rubik/stat/contracts/open-interest-history": 10,
+ "/api/v5/rubik/stat/contracts/long-short-account-ratio-contract": 5,
+ "/api/v5/rubik/stat/contracts/long-short-account-ratio-contract-top-trader": 5,
+ "/api/v5/rubik/stat/contracts/long-short-position-ratio-contract-top-trader": 5,
+ "/api/v5/rubik/stat/taker-volume-contract": 5,
+}
+
+
+class OkxStatisticsRateLimited(ReferenceProviderExhausted):
+ def __init__(self, *, http_status: int | None, provider_code: int | None,
+ retry_after_ms: int | None) -> None:
+ super().__init__("OKX contract statistics rate limited; no local retry",
+ retry_after_ms=retry_after_ms)
+ self.http_status = http_status
+ self.provider_code = provider_code
+
+
+def statistics_retry_after_ms(response: Any) -> int | None:
+ value = str(response.headers.get("Retry-After", "")).strip()
+ if not value:
+ return None
+ try:
+ seconds = float(value)
+ except ValueError:
+ try:
+ seconds = (parsedate_to_datetime(value) - datetime.now(timezone.utc)).total_seconds()
+ except (ValueError, TypeError, OverflowError):
+ return None
+ return math.ceil(max(0.0, seconds) * 1000) if math.isfinite(seconds) else None
+
OKX_REST_BASE = "https://www.okx.com"
OKX_PUBLIC_WS = "wss://ws.okx.com:8443/ws/v5/public"
@@ -93,6 +131,21 @@ async def _bucket_for(
) -> AsyncTokenBucket:
"""Return the documented rate-limit scope without cross-symbol queueing."""
+ if path in OKX_CONTRACT_STATISTICS_LIMITS:
+ inst_id = str(params.get("instId") or "").strip().upper()
+ if not inst_id:
+ raise ValueError("OKX contract statistics requires instId")
+ key = ("contract_statistics", path, inst_id)
+ async with self._scoped_bucket_lock:
+ scoped = self._scoped_buckets.get(key)
+ if scoped is None:
+ # Capacity one prevents initial bursts; leave 20% headroom
+ # below the documented 2s window. No generic public bucket.
+ scoped = AsyncTokenBucket(
+ capacity=1, refill_per_second=OKX_CONTRACT_STATISTICS_LIMITS[path] * 0.4
+ )
+ self._scoped_buckets[key] = scoped
+ return scoped
# OKX mark-price is budgeted by IP plus instrument. Do not put five
# independent execution references behind the generic public bucket.
if path == "/api/v5/public/mark-price":
@@ -122,8 +175,18 @@ async def get(
params=dict(params),
timeout=self._timeout,
)
+ if path in OKX_CONTRACT_STATISTICS_LIMITS and response.status_code == 429:
+ raise OkxStatisticsRateLimited(
+ http_status=429, provider_code=None,
+ retry_after_ms=statistics_retry_after_ms(response),
+ )
response.raise_for_status()
payload = response.json()
+ if path in OKX_CONTRACT_STATISTICS_LIMITS and str(payload.get("code")) == "50011":
+ raise OkxStatisticsRateLimited(
+ http_status=None, provider_code=50011,
+ retry_after_ms=statistics_retry_after_ms(response),
+ )
if str(payload.get("code")) != "0" or not isinstance(payload.get("data"), list):
raise ValueError(f"OKX V5 error code={payload.get('code')} msg={payload.get('msg')}")
return payload["data"]
diff --git a/qdl/adapters/okx/history.py b/qdl/adapters/okx/history.py
index a8c7235e..4e8b1088 100644
--- a/qdl/adapters/okx/history.py
+++ b/qdl/adapters/okx/history.py
@@ -247,8 +247,10 @@ async def _paginate_time_window(
parser: Callable[[Any], Any],
timestamp: Callable[[Any], int],
merge: Callable[[Any, Any], Any],
+ cursor_parameter: str = "after",
) -> tuple[list[Any], HistoryCoverage]:
- # OKX `after` means strictly older. end+1 preserves an inclusive end.
+ # OKX `after` (candles/funding) and `end` (contract statistics) are
+ # strictly older cursors. end+1 preserves an inclusive request end.
cursor = end_ms + 1
selected: dict[int, Any] = {}
complete_left = False
@@ -258,10 +260,12 @@ async def _paginate_time_window(
while pages < max_pages:
rows = await self._client.get(
endpoint,
- params={**base_params, "after": str(cursor), "limit": str(page_limit)},
+ params={**base_params, cursor_parameter: str(cursor), "limit": str(page_limit)},
bucket=bucket,
)
pages += 1
+ if cursor_parameter == "end" and (not isinstance(rows, list) or len(rows) > page_limit):
+ raise ValueError("OKX contract statistics page has invalid shape or size")
if not rows:
terminal_reason = "PROVIDER_EXHAUSTED"
break
diff --git a/qdl/adapters/okx/reference.py b/qdl/adapters/okx/reference.py
index c4592064..5112eab3 100644
--- a/qdl/adapters/okx/reference.py
+++ b/qdl/adapters/okx/reference.py
@@ -4,21 +4,28 @@
from collections.abc import Mapping
from typing import Any
+from qdl.admission.contracts import ProviderAdmissionRuntime
+from qdl.admission.edge import AdmissionDeadlineExceeded, ProviderRateLimited
+from qdl.adapters.intervals import canonical_interval_ms, okx_bar_size
+from qdl.adapters.okx.admitted_rest import AsyncAdmittedOkxStatisticsClient
from qdl.adapters.okx.client import OkxRestClient
from qdl.adapters.okx.history import (
HistoryCoverage,
OkxHistoricalClient,
OkxOpenInterestSnapshot,
+ PaginationStalled,
)
-from qdl.domain.capabilities import FeedCapability
+from qdl.domain.capabilities import FeedCapability, OKX_REFERENCE_INTERVALS
from qdl.domain.instrument import ProductType
from qdl.reference.contracts import (
+ LongShortKind,
MarkIndexKind,
ReferenceCoverage,
ReferenceFetch,
ReferenceObservation,
ReferenceProduct,
ReferenceProviderError,
+ ReferenceProviderExhausted,
ReferenceRequest,
ReferenceUnavailable,
decimal_field,
@@ -27,7 +34,13 @@
)
-_ADAPTER_VERSION = "qdl-okx-reference/1"
+_ADAPTER_VERSION = "qdl-okx-reference/2"
+_CONTRACT_STATISTICS = "/api/v5/rubik/stat/contracts/"
+_LONG_SHORT_ENDPOINTS = {
+ LongShortKind.GLOBAL_ACCOUNT: _CONTRACT_STATISTICS + "long-short-account-ratio-contract",
+ LongShortKind.TOP_ACCOUNT: _CONTRACT_STATISTICS + "long-short-account-ratio-contract-top-trader",
+ LongShortKind.TOP_POSITION: _CONTRACT_STATISTICS + "long-short-position-ratio-contract-top-trader",
+}
def _fields(*items):
@@ -42,9 +55,21 @@ def __init__(
client: OkxRestClient,
*,
history: OkxHistoricalClient | None = None,
+ statistics_client: OkxRestClient | None = None,
+ statistics_admission: ProviderAdmissionRuntime | None = None,
+ require_statistics_admission: bool = False,
) -> None:
self._client = client
+ self._statistics_admission_missing = require_statistics_admission and statistics_admission is None
self._history = history if history is not None else OkxHistoricalClient(client)
+ if statistics_admission is not None:
+ self._statistics_history = OkxHistoricalClient(
+ AsyncAdmittedOkxStatisticsClient(statistics_client or client, statistics_admission)
+ )
+ else:
+ self._statistics_history = (
+ OkxHistoricalClient(statistics_client) if statistics_client is not None else self._history
+ )
async def fetch(
self,
@@ -62,10 +87,11 @@ async def fetch(
if product is ReferenceProduct.OPEN_INTEREST:
require_product(request.instrument, ProductType.PERPETUAL, ProductType.FUTURE)
if request.is_history:
- raise ReferenceUnavailable(
- "OKX public open-interest is snapshot-only; no historical series is certified"
- )
+ return await self._contract_statistics(request, capability)
return await self._open_interest_snapshot(request, capability)
+ if product in {ReferenceProduct.LONG_SHORT_RATIO, ReferenceProduct.TAKER_FLOW}:
+ require_product(request.instrument, ProductType.PERPETUAL, ProductType.FUTURE)
+ return await self._contract_statistics(request, capability)
if product is ReferenceProduct.MARK_INDEX_PRICE:
require_product(request.instrument, ProductType.PERPETUAL, ProductType.FUTURE)
return await self._mark_index_snapshot(request, capability, received_at_ns)
@@ -80,6 +106,125 @@ async def fetch(
f"OKX has no provider-equivalent public {product.value} reference product"
)
+ async def _contract_statistics(
+ self, request: ReferenceRequest, capability: FeedCapability
+ ) -> ReferenceFetch:
+ assert request.start_ms is not None and request.end_ms is not None
+ if self._statistics_admission_missing:
+ raise ReferenceUnavailable("OKX contract statistics requires configured shared Rust admission")
+ if request.interval not in OKX_REFERENCE_INTERVALS:
+ raise ReferenceUnavailable(
+ "OKX contract statistics requires a supported canonical fixed-duration interval"
+ )
+ period = okx_bar_size(request.interval)
+ interval_ms = canonical_interval_ms(request.interval)
+ params = {"instId": request.instrument.native_symbol, "period": period}
+ labels = [
+ ("native_symbol", request.instrument.native_symbol),
+ ("inst_type", request.instrument.identity.market),
+ ("scope", "EXACT_CONTRACT"),
+ ("identity_origin", "REQUEST_INST_ID"),
+ ("interval", request.interval),
+ ("provider_period", period),
+ ("timestamp_origin", "PROVIDER"),
+ ("finality", "PROVIDER_NOT_SUPPLIED"),
+ ("history_limit_samples", "1440"),
+ ]
+ if request.product is ReferenceProduct.OPEN_INTEREST:
+ endpoint = _CONTRACT_STATISTICS + "open-interest-history"
+ columns = (
+ ("open_interest_contracts", "CONTRACTS"),
+ ("open_interest_ccy", "BASE_ASSET_QUANTITY"),
+ ("open_interest_usd", "USD_NOTIONAL"),
+ )
+ elif request.product is ReferenceProduct.LONG_SHORT_RATIO:
+ assert request.long_short_kind is not None
+ endpoint = _LONG_SHORT_ENDPOINTS[request.long_short_kind]
+ columns = (("long_short_ratio", "RATIO"),)
+ labels.extend((
+ ("ratio_kind", request.long_short_kind.value),
+ ("ratio_population", "ALL_TRADERS" if request.long_short_kind is LongShortKind.GLOBAL_ACCOUNT
+ else "TOP_5_PERCENT_BY_OPEN_POSITION_VALUE"),
+ ("ratio_measure", "POSITION" if request.long_short_kind is LongShortKind.TOP_POSITION else "ACCOUNT"),
+ ))
+ else:
+ endpoint = "/api/v5/rubik/stat/taker-volume-contract"
+ # The provider returns SELL before BUY. Pin contracts explicitly;
+ # do not relabel native units or manufacture a buy/sell ratio.
+ params["unit"] = "1"
+ labels.append(("provider_unit", "1"))
+ columns = (("sell_volume", "CONTRACTS"), ("buy_volume", "CONTRACTS"))
+
+ def parse(row: object) -> ReferenceObservation:
+ if not isinstance(row, list) or len(row) != len(columns) + 1:
+ raise ReferenceProviderError("OKX contract statistics row has invalid shape")
+ timestamp_ns = self._timestamp_ns_optional({"ts": row[0]}, "ts")
+ if timestamp_ns is None or timestamp_ns // 1_000_000 > request.end_ms:
+ raise ReferenceProviderError("OKX contract statistics timestamp is missing or beyond request end")
+ fields = _fields(*(decimal_field(name, value, unit)
+ for (name, unit), value in zip(columns, row[1:], strict=True)))
+ if not fields:
+ raise ReferenceProviderError("OKX contract statistics row has no numeric fields")
+ if any(field.value.as_decimal() < 0 for field in fields):
+ raise ReferenceProviderError("OKX contract statistics values must be nonnegative")
+ return self._observation(request, timestamp_ns, fields, labels=tuple(labels))
+
+ try:
+ observations, history = await self._statistics_history._paginate_time_window(
+ endpoint=endpoint,
+ base_params=params,
+ bucket="public",
+ start_ms=request.start_ms,
+ end_ms=request.end_ms,
+ page_limit=min(100, request.page_size or request.limit),
+ max_records=min(request.limit, 1440),
+ max_pages=request.max_pages,
+ parser=parse,
+ timestamp=lambda item: item.observed_at_ns // 1_000_000,
+ merge=self._history._merge_identical,
+ cursor_parameter="end",
+ )
+ except (AdmissionDeadlineExceeded, ProviderRateLimited) as error:
+ raise ReferenceProviderExhausted(
+ "OKX contract statistics deferred by shared provider admission",
+ retry_after_ms=(error.decision.retry_after_ms if isinstance(error, AdmissionDeadlineExceeded)
+ else error.retry_after_ms),
+ ) from error
+ except (ValueError, PaginationStalled) as error:
+ raise ReferenceProviderError(str(error)) from error
+
+ times = [item.observed_at_ns // 1_000_000 for item in observations]
+ gaps = any(right - left != interval_ms for left, right in zip(times, times[1:]))
+ # Coverage describes supplied sample timestamps, never candle closure.
+ # Retention, listing and internal gaps must not inherit the paginator's
+ # unconditional right-edge flag or imply padded/continuous history.
+ complete_left = bool(times) and times[0] - request.start_ms < interval_ms
+ complete_right = bool(times) and request.end_ms - times[-1] < interval_ms
+ reason = history.terminal_reason
+ if history.truncated and request.limit > 1440 and reason == "MAX_RECORDS":
+ reason = "PROVIDER_HISTORY_LIMIT"
+ elif not history.truncated:
+ if gaps:
+ reason = "PROVIDER_GAP"
+ elif complete_left and complete_right:
+ reason = "REQUEST_WINDOW_COVERED"
+ elif times:
+ reason = "PROVIDER_PARTIAL"
+ return ReferenceFetch(
+ observations=tuple(observations),
+ lineage=(self._lineage(endpoint, capability),),
+ coverage=ReferenceCoverage(
+ requested_start_ms=request.start_ms,
+ requested_end_ms=request.end_ms,
+ observed_min_ms=times[0] if times else None,
+ observed_max_ms=times[-1] if times else None,
+ complete_left=complete_left and not gaps and not history.truncated,
+ complete_right=complete_right and not gaps,
+ truncated=history.truncated,
+ terminal_reason=reason,
+ ),
+ )
+
async def _funding_history(
self, request: ReferenceRequest, capability: FeedCapability
) -> ReferenceFetch:
diff --git a/qdl/admission/edge.py b/qdl/admission/edge.py
new file mode 100644
index 00000000..95a0ea76
--- /dev/null
+++ b/qdl/admission/edge.py
@@ -0,0 +1,141 @@
+"""Blocking facade over the Rust provider admission for the thread-based BAR edge.
+
+Purpose (KN-4 D47-2): the stable BAR edge calls venue REST from threads, while
+the Rust admission relay (``RustHttpProviderAdmission``) is async. This module
+owns one private event-loop thread for the relay and gives the edge a lease:
+admit (waiting out a DEFERRED decision by the Rust ``retry_after_ms`` hint,
+bounded by a deadline), run the provider call, complete - also when the call
+fails. A provider rate-limit reply is relayed to Rust (which opens the shared
+cooldown) and raised as ``ProviderRateLimited``.
+
+Boundary: no budget, queue, retry or cooldown policy lives here - Rust decides
+(``rust/qdl-core/src/provider_admission.rs``); this only waits for what Rust
+says and never widens a grant.
+"""
+from __future__ import annotations
+
+import asyncio
+from contextlib import contextmanager
+import logging
+import threading
+import time
+import uuid
+from typing import Any, Callable, Iterator
+
+from qdl.admission.contracts import (
+ AdmissionDecision,
+ AdmissionDisposition,
+ AdmissionPriority,
+ AdmissionRequest,
+ ProviderAdmissionRuntime,
+ ProviderLane,
+)
+
+logger = logging.getLogger(__name__)
+
+_CALL_TIMEOUT_S = 5.0
+
+
+class AdmissionDeadlineExceeded(RuntimeError):
+ """Rust kept deferring past the caller's deadline (typed, never a venue call)."""
+
+ def __init__(self, lane: ProviderLane, decision: AdmissionDecision) -> None:
+ self.lane = lane
+ self.decision = decision
+ reason = decision.defer_reason.value if decision.defer_reason else "DEFERRED"
+ super().__init__(f"provider admission deferred {lane.provider}/{lane.market}/"
+ f"{lane.endpoint_family}: {reason}")
+
+
+class ProviderRateLimited(RuntimeError):
+ """The venue answered with a rate-limit signal; Rust has opened the cooldown."""
+
+ def __init__(self, lane: ProviderLane, *, http_status: int | None, provider_code: int | None,
+ retry_after_ms: int | None) -> None:
+ self.lane = lane
+ self.http_status = http_status
+ self.provider_code = provider_code
+ self.retry_after_ms = retry_after_ms
+ self.banned = http_status == 418
+ super().__init__(f"{lane.provider} rate limited http={http_status} code={provider_code} "
+ f"retry_after_ms={retry_after_ms}")
+
+
+def request_id(prefix: str) -> str:
+ """A unique admission request id (Rust: 1..128 of [A-Za-z0-9._:-])."""
+
+ safe = "".join(ch if ch.isalnum() or ch in "._:-" else "-" for ch in prefix)[:90]
+ return f"{safe}:{uuid.uuid4().hex}"
+
+
+class BlockingProviderAdmission:
+ def __init__(self, runtime_factory: Callable[[], ProviderAdmissionRuntime], *,
+ max_wait_s: float = 30.0, sleep: Callable[[float], None] = time.sleep,
+ clock: Callable[[], float] = time.monotonic) -> None:
+ if max_wait_s <= 0:
+ raise ValueError("admission max wait must be positive")
+ self._loop = asyncio.new_event_loop()
+ self._thread = threading.Thread(target=self._loop.run_forever, name="qdl-provider-admission",
+ daemon=True)
+ self._thread.start()
+ self._max_wait_s = max_wait_s
+ self._sleep = sleep
+ self._clock = clock
+
+ async def create() -> ProviderAdmissionRuntime:
+ return runtime_factory()
+
+ self._runtime = self._call(create())
+
+ def _call(self, coroutine) -> Any:
+ return asyncio.run_coroutine_threadsafe(coroutine, self._loop).result(_CALL_TIMEOUT_S)
+
+ @contextmanager
+ def lease(self, lane: ProviderLane, request_prefix: str, *, priority: AdmissionPriority, token_cost: int,
+ max_wait_s: float | None = None) -> Iterator[AdmissionDecision]:
+ """Hold a Rust grant for one provider call; completed on every exit."""
+
+ identifier = request_id(request_prefix)
+ request = AdmissionRequest(lane=lane, request_id=identifier, priority=priority, token_cost=token_cost)
+ deadline = self._clock() + (self._max_wait_s if max_wait_s is None else max_wait_s)
+ while True:
+ decision = self._call(self._runtime.admit(request))
+ if decision.disposition is AdmissionDisposition.GRANTED:
+ break
+ wait_s = max(0.01, (decision.retry_after_ms or 100) / 1000.0)
+ if self._clock() + wait_s > deadline:
+ raise AdmissionDeadlineExceeded(lane, decision)
+ self._sleep(wait_s)
+ try:
+ yield decision
+ finally:
+ try:
+ self._call(self._runtime.complete(lane, identifier))
+ except Exception: # noqa: BLE001 - the lease expires in Rust (max_lease_ns)
+ logger.warning("provider admission completion failed lane=%s request=%s", lane, identifier,
+ exc_info=True)
+
+ def rate_limited(self, lane: ProviderLane, *, http_status: int | None, provider_code: int | None,
+ retry_after_ms: int | None) -> ProviderRateLimited:
+ """Relay a venue rate-limit reply to Rust; return the typed error to raise."""
+
+ try:
+ self._call(self._runtime.record_rate_limit(
+ lane, None, http_status=http_status, provider_code=provider_code,
+ retry_after_ms=retry_after_ms if retry_after_ms and retry_after_ms > 0 else None))
+ except Exception: # noqa: BLE001 - still raised to the caller, typed
+ logger.warning("provider rate-limit relay failed lane=%s", lane, exc_info=True)
+ return ProviderRateLimited(lane, http_status=http_status, provider_code=provider_code,
+ retry_after_ms=retry_after_ms)
+
+ def close(self) -> None:
+ close = getattr(self._runtime, "aclose", None) or getattr(self._runtime, "close", None)
+ if close is not None:
+ try:
+ result = close()
+ if asyncio.iscoroutine(result):
+ self._call(result)
+ except Exception: # noqa: BLE001
+ logger.debug("provider admission close failed", exc_info=True)
+ self._loop.call_soon_threadsafe(self._loop.stop)
+ self._thread.join(timeout=5)
diff --git a/qdl/admission/http.py b/qdl/admission/http.py
index d7b95fd4..0f155c2b 100644
--- a/qdl/admission/http.py
+++ b/qdl/admission/http.py
@@ -108,7 +108,7 @@ async def record_rate_limit(
provider_code: int | None,
retry_after_ms: int | None,
) -> AdmissionDecision:
- if http_status not in {None, 418, 429} or provider_code not in {None, -1003}:
+ if http_status not in {None, 418, 429} or provider_code not in {None, -1003, 50011}:
raise AdmissionContractError("provider rate-limit signal is not recognized")
if http_status is None and provider_code is None:
raise AdmissionContractError("provider rate-limit signal is empty")
diff --git a/qdl/api_v2/router.py b/qdl/api_v2/router.py
index 86a7303d..70cc9170 100644
--- a/qdl/api_v2/router.py
+++ b/qdl/api_v2/router.py
@@ -1,15 +1,18 @@
from __future__ import annotations
import asyncio
+from concurrent.futures import ThreadPoolExecutor
+import json
from dataclasses import asdict
from decimal import Decimal, InvalidOperation
from typing import Annotated
from fastapi import APIRouter, Depends, FastAPI, Header, Query, Request
from fastapi.exceptions import RequestValidationError
-from fastapi.responses import JSONResponse
+from fastapi.responses import JSONResponse, Response
from fastapi.security import APIKeyHeader, HTTPAuthorizationCredentials, HTTPBearer
+from qdl.query.cold_work import await_in_thread, cold_yield
from qdl.api_v2.models import (
BatchItemResponse,
BatchRequirementModel,
@@ -390,6 +393,14 @@ def _market_item(item) -> MarketDataView:
def _warmup(result) -> WarmupResponse:
+ return _warmup_envelope(result).model_copy(
+ update={"data": [_market_item(item) for item in _cold_rows(result.history.items)]}
+ )
+
+
+def _warmup_envelope(result) -> WarmupResponse:
+ """The warmup response without its rows (``data`` is rendered per chunk)."""
+
history = result.history
return WarmupResponse(
request_id=result.request_id,
@@ -399,8 +410,159 @@ def _warmup(result) -> WarmupResponse:
watermark_offset=history.watermark_offset,
coverage=history.coverage.value,
count=len(history.items),
- data=[_market_item(item) for item in history.items],
+ data=[],
+ )
+
+
+async def _json_off_loop(build) -> JSONResponse:
+ """Build, dump and encode a large public response on a worker thread.
+
+ A 5,000-row BAR warmup is about 10 MB and seconds of Pydantic work. Done on
+ the event loop it stalls every other request on the replica: measured on
+ 2026-09-23 (v2.1.1 Phase-3 stage 5), QUOTE snapshots reached 6.5 s while
+ ``query_v2_1`` sat at its 1.0 CPU cap during two cold warmups. The bytes
+ are exactly those of ``JSONResponse(content=model.model_dump(mode="json",
+ by_alias=True))``; only the thread that computes them changes.
+ """
+
+ # The render thread holds the caller's local lease until it returns, also
+ # when the request is cancelled (KN-4 D39): an abandoned render may not
+ # overlap the next admitted one.
+ return await await_in_thread(
+ _RENDER_EXECUTOR,
+ lambda: JSONResponse(content=build().model_dump(mode="json", by_alias=True)),
+ )
+
+
+_RENDER_CHUNK_ROWS = 250
+# Large responses render on two fixed threads, not on the loop's default
+# executor (up to cpu_count + 4 threads): each thread that renders a 10k-row
+# warmup grows its own malloc arena to the render's peak and keeps it, so the
+# number of render threads bounds the replica's retained memory (KN-4 D39,
+# measured). The local batch lease already admits one large render at a time.
+_RENDER_EXECUTOR = ThreadPoolExecutor(max_workers=2, thread_name_prefix="qdl-query-render")
+
+
+def _cold_rows(values):
+ for value in values:
+ cold_yield()
+ yield value
+
+
+def _render_warmup_chunked(model: WarmupResponse) -> bytes:
+ """Encode a warmup model in bounded pieces, byte-identical to ``JSONResponse``."""
+
+ rows = model.data
+ return _render_chunked(model, len(rows), lambda start, stop: _cold_rows(rows[start:stop]))
+
+
+def _render_warmup_result(result) -> bytes:
+ """Encode a warmup result directly, one chunk of public views at a time.
+
+ Only ``_RENDER_CHUNK_ROWS`` views exist at once: building every
+ ``MarketDataView`` first held ~11 KB per row (110 MB for 10,000 rows,
+ measured KN-4 D39) next to the rendered text. Bytes are identical to
+ ``_render_warmup_chunked(_warmup(result))``.
+ """
+
+ items = result.history.items
+ return _render_chunked(
+ _warmup_envelope(result),
+ len(items),
+ lambda start, stop: (_market_item(item) for item in _cold_rows(items[start:stop])),
+ )
+
+
+def _render_chunked(envelope: WarmupResponse, count: int, views) -> bytes:
+ """Encode a warmup in bounded pieces, byte-identical to ``JSONResponse``.
+
+ One ``model_dump`` and one ``json.dumps`` over 5,000 rows are two C-level
+ calls that each hold the GIL for most of a second, and no switch interval
+ can preempt them: on 2026-09-23 (v2.1.1 Phase-3 stage 5) every probe on
+ the rendering replica took ~1.4 s at once. Per-chunk calls hand the GIL
+ back between pieces. ``data`` is the model's last field, so the envelope
+ is rendered with an empty list and the rows are spliced into it. Each
+ piece is encoded to UTF-8 as it is made, so the text of the whole body
+ never exists next to its bytes.
+ """
+
+ def encode(value) -> bytes:
+ return json.dumps(
+ value, ensure_ascii=False, allow_nan=False, indent=None, separators=(",", ":"),
+ ).encode("utf-8")
+
+ suffix = b',"data":[]}'
+ head = encode(envelope.model_copy(update={"data": []}).model_dump(mode="json", by_alias=True))
+ if not head.endswith(suffix):
+ raise RuntimeError("warmup response layout no longer ends with its data list")
+ parts = [head[: -len(suffix)], b',"data":[']
+ for start in range(0, count, _RENDER_CHUNK_ROWS):
+ chunk = encode([
+ view.model_dump(mode="json", by_alias=True)
+ for view in views(start, start + _RENDER_CHUNK_ROWS)
+ ])
+ if start:
+ parts.append(b",")
+ parts.append(chunk[1:-1])
+ parts.append(b"]}")
+ return b"".join(parts)
+
+
+async def _warmup_json_off_loop(build) -> Response:
+ """A warmup response rendered off the loop and in chunks (see above).
+
+ ``build`` returns the (cursor-bound) warmup result, not its model.
+ """
+
+ # The render thread holds the local lease until it returns, also when the
+ # request is cancelled (KN-4 K4-T06).
+ body = await await_in_thread(
+ _RENDER_EXECUTOR, lambda: _render_warmup_result(build()), cold=True
)
+ return Response(content=body, media_type="application/json")
+
+
+async def _single_warmup_response(request, access, service, requirement, purpose):
+ """One warmup, rendered inside the local lease exactly like ``warmup:batch``.
+
+ Holding the lease through rendering keeps at most one large response being
+ built per replica, so moving the work off the loop does not also remove its
+ memory bound.
+ """
+
+ async def render(batch_result):
+ (item,) = batch_result.results
+ if item.problem is not None:
+ raise QueryServiceError(
+ item.problem,
+ request_id=batch_result.request_id,
+ instrument_uid=requirement.instrument_uid,
+ )
+ # Cursor binding copies every item and reads the durable watermark, so
+ # it belongs off the loop with the rest of the response.
+ return await _warmup_json_off_loop(lambda: type(item.result)(
+ item.result.request_id,
+ _bind_history_cursor(request, access, requirement, item.result.history),
+ ))
+
+ complete = getattr(service, "warmup_batch_completed_async", None)
+ if callable(complete):
+ return await complete(
+ BatchRequirement(access.consumer_id, (requirement,), require_all=True),
+ purpose=purpose,
+ completion=render,
+ )
+ # Service doubles predating the completion hook keep the original path.
+ result = await service.warmup_async(
+ requirement,
+ purpose=purpose,
+ consumer_id=access.consumer_id,
+ )
+ result = type(result)(
+ result.request_id,
+ _bind_history_cursor(request, access, requirement, result.history),
+ )
+ return _warmup(result)
def _warmup_batch_response(
@@ -447,6 +609,41 @@ def _warmup_batch_response(
)
+def _render_warmup_batch(request, access, result, requirements) -> bytes:
+ """Render bounded row chunks per item, preserving the existing batch bytes."""
+ def encode(value):
+ return json.dumps(value, ensure_ascii=False, allow_nan=False,
+ separators=(",", ":")).encode("utf-8")
+
+ bodies, item_models = [], []
+ for item, requirement in zip(result.results, requirements, strict=True):
+ cold_yield()
+ problem = None if item.problem is None else _problem(QueryServiceError(
+ item.problem, request_id=result.request_id, instrument_uid=item.instrument_uid))
+ item_model = BatchItemResponse(instrument_uid=item.instrument_uid,
+ status=item.status, data=None, problem=problem)
+ item_models.append(item_model)
+ metadata = item_model.model_dump(mode="json", by_alias=True)
+ data = b"null"
+ if item.result is not None:
+ bound = type(item.result)(item.result.request_id,
+ _bind_history_cursor(request, access, requirement, item.result.history))
+ data = _render_warmup_result(bound)
+ bodies.append(b"{" + b",".join(encode(key) + b":" + (data if key == "data" else encode(value))
+ for key, value in metadata.items()) + b"}")
+ envelope = BatchResponse(request_id=result.request_id, partial=result.partial,
+ success_count=result.success_count, error_count=result.error_count, results=item_models)
+ return b"{" + b",".join(encode(key) + b":" +
+ (b"[" + b",".join(bodies) + b"]" if key == "results" else encode(value))
+ for key, value in envelope.model_dump(mode="json", by_alias=True).items()) + b"}"
+
+
+async def _warmup_batch_json_off_loop(request, access, result, requirements) -> Response:
+ body = await await_in_thread(_RENDER_EXECUTOR,
+ lambda: _render_warmup_batch(request, access, result, requirements), cold=True)
+ return Response(content=body, media_type="application/json")
+
+
def _reference_data(result) -> dict:
"""Serialize provider-authentic reference data without float coercion."""
@@ -534,6 +731,7 @@ def _problem(error: QueryServiceError) -> ProblemDetails:
retry_after_ms=error.problem.retry_after_ms,
instrument_uid=error.instrument_uid,
quality_state=error.quality_state,
+ diagnostics=error.diagnostics,
)
@@ -681,10 +879,10 @@ async def snapshot(
access.require_permission(DataPlanePermission.SNAPSHOT_READ)
access.require_purpose(purpose)
access.require_requirement(requirement)
- result = await asyncio.to_thread(
- service.snapshot,
+ result = await service.snapshot_async(
requirement,
purpose=purpose,
+ consumer_id=access.consumer_id,
)
item = _bind_item_cursor(request, access, requirement, result.item)
return SnapshotResponse(request_id=result.request_id, data=_market_item(item))
@@ -746,15 +944,7 @@ async def warmup(
access.require_permission(DataPlanePermission.HISTORY_READ)
access.require_purpose(purpose)
access.require_requirement(requirement)
- result = await service.warmup_async(
- requirement,
- purpose=purpose,
- )
- result = type(result)(
- result.request_id,
- _bind_history_cursor(request, access, requirement, result.history),
- )
- return _warmup(result)
+ return await _single_warmup_response(request, access, service, requirement, purpose)
@router.get("/market-data/{instrument_uid}/history", response_model=WarmupResponse)
@@ -813,12 +1003,7 @@ async def history(
access.require_permission(DataPlanePermission.HISTORY_READ)
access.require_purpose(purpose)
access.require_requirement(requirement)
- result = await service.warmup_async(requirement, purpose=purpose)
- result = type(result)(
- result.request_id,
- _bind_history_cursor(request, access, requirement, result.history),
- )
- return _warmup(result)
+ return await _single_warmup_response(request, access, service, requirement, purpose)
@router.post("/market-data/warmup:batch", response_model=BatchResponse)
@@ -843,10 +1028,10 @@ async def warmup_batch(
)
async def render(result):
- response = _warmup_batch_response(request, access, result, requirements)
# Returning an already-rendered Response prevents FastAPI from doing a
- # second Pydantic walk after the fully-local service lease is released.
- return JSONResponse(content=response.model_dump(mode="json", by_alias=True))
+ # second Pydantic walk after the fully-local service lease is released;
+ # rendering off the loop keeps other requests on this replica moving.
+ return await _warmup_batch_json_off_loop(request, access, result, requirements)
complete = getattr(service, "warmup_batch_completed_async", None)
if callable(complete):
@@ -948,7 +1133,12 @@ async def feed_status(
"schema": "qdl.feed-status.v2",
"instrument_uid": instrument_uid,
"feed": feed.value,
- "quality": asdict(await asyncio.to_thread(service.status, requirement)),
+ "quality": asdict(
+ await service.status_async(
+ requirement,
+ consumer_id=access.consumer_id,
+ )
+ ),
}
@@ -971,7 +1161,7 @@ async def readiness(
requirements,
require_all=body.require_all,
)
- result = await asyncio.to_thread(service.readiness, batch, purpose=purpose)
+ result = await service.readiness_async(batch, purpose=purpose)
items = []
for item in result.results:
problem = None
@@ -1006,19 +1196,32 @@ async def system_readiness(
return await request.app.state.v2_runtime_readiness.public_summary()
-@router.get("/data-quality/gaps", response_model=GapListResponse)
+@router.get("/data-quality/gaps", response_model=GapListResponse, response_model_exclude_unset=True)
async def data_quality_gaps(
+ response: Response,
+ include_coverage: bool = Query(False),
service: V2QueryService = Depends(_service),
access: DataPlaneAccess = Depends(_data_access),
):
access.require_permission(DataPlanePermission.QUALITY_READ)
- return {
- "schema": "qdl.data-quality.gaps.v2",
- "items": [
- {**asdict(item), "feed": item.feed.value}
- for item in service.open_gaps()
- ],
- }
+ result = await service.open_gaps_async()
+ coverage = getattr(result, "coverage_document", None)
+ document = coverage() if callable(coverage) else None
+ response.headers["X-QDL-Gap-Scope"] = "RETAINED_WINDOW"
+ if document is not None and result.unavailable and not include_coverage:
+ sample = ",".join(item["binding_id"] for item in result.unavailable[:8])
+ raise QueryServiceError(QueryProblem(CanonicalErrorCode.PARTIAL_RESULT,
+ f"retained scan has {len(result.unavailable)} unavailable product views: {sample}; "
+ "request include_coverage=true for exact coverage; history boundaries are not assessed",
+ True, retry_after_ms=1000), request_id=service.request_id())
+ body = {"schema": "qdl.data-quality.gaps.v2", "items": [
+ {**asdict(item), "feed": item.feed.value} for item in result]}
+ if include_coverage:
+ if document is None:
+ raise QueryServiceError(QueryProblem(CanonicalErrorCode.PARTIAL_RESULT,
+ "backend does not expose product coverage", False), request_id=service.request_id())
+ body["coverage"] = document
+ return body
def create_v2_app(
diff --git a/qdl/certification/phase3_consumer_load.py b/qdl/certification/phase3_consumer_load.py
new file mode 100644
index 00000000..71a57f42
--- /dev/null
+++ b/qdl/certification/phase3_consumer_load.py
@@ -0,0 +1,892 @@
+"""Bounded, manifest-derived logical-consumer workload planning.
+
+This module deliberately owns no socket, provider, cursor, order, or runtime
+lifecycle. It freezes a truthful load shape before the external Phase-3
+driver is allowed to contact the V2 Query/Stream plane.
+"""
+
+from __future__ import annotations
+
+from collections import Counter, defaultdict, deque
+from dataclasses import dataclass, field
+import math
+from typing import TYPE_CHECKING, Mapping, Sequence
+
+if TYPE_CHECKING: # annotations only: the host launcher loads this file without the SDK
+ from qdl.certification.phase103_consumer_acceptance import AcceptanceProduct
+ from qdl.consumer.manifest import ConsumerManifest
+
+
+_HOT_FEED_ORDER = {
+ "TRADE": 0,
+ "QUOTE": 1,
+ "MARK_INDEX_PRICE": 2,
+ "BOOK_SNAPSHOT": 3,
+ "BOOK_DELTA": 4,
+ "BAR": 5,
+}
+
+
+@dataclass(frozen=True, slots=True)
+class LogicalConsumerSession:
+ """One independent workload session over an existing authenticated identity."""
+
+ ordinal: int
+ consumer_id: str
+ products: tuple[AcceptanceProduct, ...]
+
+ def __post_init__(self) -> None:
+ if self.ordinal < 1 or not self.consumer_id or not 2 <= len(self.products) <= 5:
+ raise ValueError("logical session fields are invalid")
+ if any(item.consumer_id != self.consumer_id for item in self.products):
+ raise ValueError("logical session mixes consumer identities")
+ identities = [item.identity for item in self.products]
+ if len(identities) != len(set(identities)):
+ raise ValueError("logical session contains duplicate products")
+
+
+@dataclass(frozen=True, slots=True)
+class IdentityLoadBudget:
+ """Quota-derived admission budget for one already registered identity."""
+
+ consumer_id: str
+ logical_sessions: int
+ requests_per_minute: int
+ test_requests_per_minute: int
+ seconds_per_request: float
+ max_streams: int
+ planned_streams: int
+
+ def __post_init__(self) -> None:
+ if (
+ not self.consumer_id
+ or self.logical_sessions < 1
+ or self.requests_per_minute < 1
+ or not 1 <= self.test_requests_per_minute <= self.requests_per_minute
+ or self.seconds_per_request <= 0
+ or self.max_streams < 1
+ or not 0 <= self.planned_streams <= self.max_streams
+ ):
+ raise ValueError("identity load budget is invalid")
+
+
+@dataclass(frozen=True, slots=True)
+class ConsumerLoadPlan:
+ """A deterministic no-order workload with explicit session/identity counts."""
+
+ logical_sessions: tuple[LogicalConsumerSession, ...]
+ identity_budgets: tuple[IdentityLoadBudget, ...]
+ covered_instruments: tuple[tuple[str, str], ...]
+
+ def __post_init__(self) -> None:
+ if not self.logical_sessions or not self.identity_budgets:
+ raise ValueError("consumer load plan cannot be empty")
+ budget_ids = {item.consumer_id for item in self.identity_budgets}
+ session_ids = {item.consumer_id for item in self.logical_sessions}
+ if budget_ids != session_ids:
+ raise ValueError("consumer load plan budget/session identities differ")
+ if tuple(sorted(set(self.covered_instruments))) != self.covered_instruments:
+ raise ValueError("consumer load coverage must be sorted and unique")
+
+ @property
+ def identity_count(self) -> int:
+ return len(self.identity_budgets)
+
+ @property
+ def stream_count(self) -> int:
+ return sum(item.planned_streams for item in self.identity_budgets)
+
+
+def _product_sort_key(product: AcceptanceProduct) -> tuple[object, ...]:
+ return (
+ product.venue,
+ product.native_symbol,
+ _HOT_FEED_ORDER.get(product.feed.value, 99),
+ product.feed.value,
+ product.interval or "",
+ product.source_policy_id,
+ )
+
+
+def _interleave_by_instrument(
+ products: Sequence[AcceptanceProduct],
+) -> tuple[AcceptanceProduct, ...]:
+ """Avoid a sorted BAR-heavy prefix hiding an instrument during a load run."""
+
+ groups: dict[tuple[str, str], list[AcceptanceProduct]] = defaultdict(list)
+ for product in products:
+ groups[(product.venue, product.native_symbol)].append(product)
+ if len(groups) < 1:
+ raise ValueError("load identity has no eligible products")
+ ordered_groups = [
+ sorted(groups[key], key=_product_sort_key)
+ for key in sorted(groups)
+ ]
+ result: list[AcceptanceProduct] = []
+ index = 0
+ while True:
+ emitted = False
+ for group in ordered_groups:
+ if index < len(group):
+ result.append(group[index])
+ emitted = True
+ if not emitted:
+ break
+ index += 1
+ return tuple(result)
+
+
+def _session_products(
+ values: Sequence[AcceptanceProduct], *, start: int, count: int
+) -> tuple[AcceptanceProduct, ...]:
+ selected: list[AcceptanceProduct] = []
+ seen: set[tuple[str, str, str, str, str]] = set()
+ for offset in range(len(values)):
+ candidate = values[(start + offset) % len(values)]
+ if candidate.identity in seen:
+ continue
+ selected.append(candidate)
+ seen.add(candidate.identity)
+ if len(selected) == count:
+ return tuple(selected)
+ raise ValueError("load identity cannot provide a unique session product mix")
+
+
+def _ensure_streamable_product(
+ selected: tuple[AcceptanceProduct, ...],
+ values: Sequence[AcceptanceProduct],
+ *,
+ start: int,
+) -> tuple[AcceptanceProduct, ...]:
+ """Keep one high-activity consumer feed inside each logical session.
+
+ The driver measures a stream over one of the session's declared feeds. A
+ deterministic trade/quote replacement avoids accidentally treating a
+ sparse reference or a long BAR as evidence that a stream connection is
+ healthy.
+ """
+
+ streamable = {"TRADE", "QUOTE", "BOOK_DELTA", "BOOK_SNAPSHOT"}
+
+ def is_streamable(item: AcceptanceProduct) -> bool:
+ # Unit-test stand-ins predate DeliveryClass and intentionally omit it;
+ # real acceptance products must be durable before a session can count
+ # them as a live stream subscription.
+ delivery = getattr(getattr(item, "delivery", None), "value", "DURABLE")
+ return item.feed.value in streamable and delivery == "DURABLE"
+
+ if any(is_streamable(item) for item in selected):
+ return selected
+ seen = {item.identity for item in selected[:-1]}
+ for offset in range(len(values)):
+ candidate = values[(start + offset) % len(values)]
+ if is_streamable(candidate) and candidate.identity not in seen:
+ return (*selected[:-1], candidate)
+ raise ValueError("load identity has no streamable product")
+
+
+def _instrument_pair(product: AcceptanceProduct) -> tuple[str, str]:
+ return (product.venue, product.native_symbol)
+
+
+def _coverage_counts(
+ sessions: Sequence[LogicalConsumerSession],
+) -> Counter[tuple[str, str]]:
+ return Counter(
+ _instrument_pair(product)
+ for session in sessions
+ for product in session.products
+ )
+
+
+def _ensure_required_instrument_coverage(
+ sessions: Sequence[LogicalConsumerSession],
+ *,
+ eligible: Mapping[str, Sequence[AcceptanceProduct]],
+ required_instruments: Sequence[tuple[str, str]],
+) -> tuple[LogicalConsumerSession, ...]:
+ """Make every bounded stage cover its declared venue-symbol scope.
+
+ The logical-session count is deliberately independent of the demanded
+ universe. For small stages, deterministically append a missing declared
+ product to a same-identity session with spare capacity; only then replace a
+ redundant pair. This keeps each session at `2..5` products, retains the
+ sealed identity/quota allocation, and fails before traffic when coverage is
+ impossible rather than silently shrinking the denominator.
+ """
+
+ required = tuple(sorted(set(required_instruments)))
+ if not required:
+ return tuple(sessions)
+ if any(not venue or not symbol for venue, symbol in required):
+ raise ValueError("required instrument coverage contains an empty identity")
+
+ result = list(sessions)
+ for pair in required:
+ coverage = _coverage_counts(result)
+ if coverage[pair]:
+ continue
+ candidate_by_consumer = {
+ consumer_id: tuple(sorted(
+ (product for product in values if _instrument_pair(product) == pair),
+ key=_product_sort_key,
+ ))
+ for consumer_id, values in eligible.items()
+ }
+ candidate_by_consumer = {
+ consumer_id: values
+ for consumer_id, values in candidate_by_consumer.items()
+ if values
+ }
+ applied = False
+ for session_index in sorted(
+ range(len(result)),
+ key=lambda index: (len(result[index].products), result[index].ordinal),
+ ):
+ session = result[session_index]
+ if len(session.products) >= 5:
+ continue
+ existing = {product.identity for product in session.products}
+ candidate = next(
+ (product for product in candidate_by_consumer.get(session.consumer_id, ())
+ if product.identity not in existing),
+ None,
+ )
+ if candidate is None:
+ continue
+ result[session_index] = LogicalConsumerSession(
+ ordinal=session.ordinal,
+ consumer_id=session.consumer_id,
+ products=(*session.products, candidate),
+ )
+ applied = True
+ break
+ if applied:
+ continue
+
+ coverage = _coverage_counts(result)
+ for session_index in sorted(
+ range(len(result)), key=lambda index: result[index].ordinal
+ ):
+ session = result[session_index]
+ existing = {product.identity for product in session.products}
+ candidate = next(
+ (product for product in candidate_by_consumer.get(session.consumer_id, ())
+ if product.identity not in existing),
+ None,
+ )
+ if candidate is None:
+ continue
+ replace_index = next(
+ (
+ index for index, product in enumerate(session.products)
+ if coverage[_instrument_pair(product)] > 1
+ ),
+ None,
+ )
+ if replace_index is None:
+ continue
+ products = list(session.products)
+ products[replace_index] = candidate
+ result[session_index] = LogicalConsumerSession(
+ ordinal=session.ordinal,
+ consumer_id=session.consumer_id,
+ products=tuple(products),
+ )
+ applied = True
+ break
+ if not applied:
+ raise ValueError(
+ "load plan cannot cover required instrument " + repr(pair)
+ )
+
+ missing = set(required) - set(_coverage_counts(result))
+ if missing:
+ raise ValueError(
+ "load plan misses required instruments: " + repr(sorted(missing))
+ )
+ return tuple(result)
+
+
+def build_consumer_load_plan(
+ *,
+ manifests: Mapping[str, ConsumerManifest],
+ products_by_consumer: Mapping[str, Sequence[AcceptanceProduct]],
+ logical_session_count: int,
+ test_quota_fraction: float = 0.10,
+ extra_streams_per_identity: int = 1,
+ required_instruments: Sequence[tuple[str, str]] = (),
+) -> ConsumerLoadPlan:
+ """Render `2..5`-feed sessions without inventing identities or quota.
+
+ Every planned session opens at most one stream. A caller must therefore
+ fail before traffic starts if its requested logical-session count cannot fit
+ the sealed stream quota of any selected authenticated identity.
+ """
+
+ if not 1 <= logical_session_count <= 500:
+ raise ValueError("logical session count must be within 1..500")
+ if not 0.0 < test_quota_fraction <= 0.10:
+ raise ValueError("test quota fraction must be positive and at most ten percent")
+ if not 0 <= extra_streams_per_identity <= 4:
+ raise ValueError("extra stream probes must be within 0..4 per identity")
+ consumer_ids = tuple(sorted(products_by_consumer))
+ if not consumer_ids or set(consumer_ids) != set(manifests):
+ raise ValueError("load manifests and products must use the same identities")
+
+ eligible: dict[str, tuple[AcceptanceProduct, ...]] = {}
+ for consumer_id in consumer_ids:
+ values = tuple(products_by_consumer[consumer_id])
+ if len(values) < 2:
+ raise ValueError("each load identity requires at least two eligible products")
+ if any(item.consumer_id != consumer_id for item in values):
+ raise ValueError("load products are assigned to the wrong identity")
+ eligible[consumer_id] = _interleave_by_instrument(values)
+
+ sessions_by_consumer: dict[str, int] = defaultdict(int)
+ cursors: dict[str, int] = defaultdict(int)
+ sessions: list[LogicalConsumerSession] = []
+ for ordinal in range(1, logical_session_count + 1):
+ consumer_id = consumer_ids[(ordinal - 1) % len(consumer_ids)]
+ values = eligible[consumer_id]
+ feed_count = 2 + ((ordinal - 1) % 4)
+ count = min(feed_count, len(values), 5)
+ selected = _ensure_streamable_product(
+ _session_products(values, start=cursors[consumer_id], count=count),
+ values,
+ start=cursors[consumer_id],
+ )
+ session = LogicalConsumerSession(
+ ordinal=ordinal,
+ consumer_id=consumer_id,
+ products=selected,
+ )
+ cursors[consumer_id] = (cursors[consumer_id] + count) % len(values)
+ sessions_by_consumer[consumer_id] += 1
+ sessions.append(session)
+
+ sessions = list(_ensure_required_instrument_coverage(
+ sessions,
+ eligible=eligible,
+ required_instruments=required_instruments,
+ ))
+
+ budgets: list[IdentityLoadBudget] = []
+ for consumer_id in consumer_ids:
+ manifest = manifests[consumer_id]
+ session_count = sessions_by_consumer[consumer_id]
+ safe_rpm = max(1, int(manifest.quotas.requests_per_minute * test_quota_fraction))
+ planned_streams = session_count + extra_streams_per_identity
+ if planned_streams > manifest.quotas.max_streams:
+ raise ValueError(
+ "logical stream sessions exceed sealed max_streams for " + consumer_id
+ )
+ budgets.append(IdentityLoadBudget(
+ consumer_id=consumer_id,
+ logical_sessions=session_count,
+ requests_per_minute=manifest.quotas.requests_per_minute,
+ test_requests_per_minute=safe_rpm,
+ seconds_per_request=60.0 / safe_rpm,
+ max_streams=manifest.quotas.max_streams,
+ planned_streams=planned_streams,
+ ))
+
+ coverage = tuple(sorted({
+ (product.venue, product.native_symbol)
+ for session in sessions
+ for product in session.products
+ }))
+ return ConsumerLoadPlan(
+ logical_sessions=tuple(sessions),
+ identity_budgets=tuple(budgets),
+ covered_instruments=coverage,
+ )
+
+
+def assert_required_instrument_coverage(
+ plan: ConsumerLoadPlan,
+ required: Sequence[tuple[str, str]],
+) -> None:
+ """Require a declared final stage to include every requested venue/symbol."""
+
+ expected = frozenset(required)
+ if not expected:
+ raise ValueError("required coverage cannot be empty")
+ missing = expected - frozenset(plan.covered_instruments)
+ if missing:
+ raise ValueError("load plan misses required instruments: " + repr(sorted(missing)))
+
+
+# ---------------------------------------------------------------------------
+# v2.1.1 frozen target workload
+#
+# The preflight planner above derives its request rate from ten percent of each
+# identity's sealed quota and opens at most one stream per session. That is a
+# safe mapping check, not the owner's target. The target below is the frozen
+# four-class profile of the v2.1.1 closure contract: the offered load is an
+# INPUT (declared streams and fixed request periods per class), and the plan
+# refuses to exist when a sealed identity quota cannot carry it, instead of
+# quietly lowering the rate to fit.
+# ---------------------------------------------------------------------------
+
+TARGET_STAGE_MIX: dict[int, tuple[int, int, int, int]] = {
+ # candle, realtime, grid, multi
+ 5: (2, 1, 1, 1),
+ 20: (8, 6, 4, 2),
+ 35: (14, 10, 7, 4),
+ 50: (20, 15, 10, 5),
+}
+TARGET_STAGE_SECONDS: dict[int, int] = {5: 90, 20: 120, 35: 180, 50: 300}
+TARGET_CLASSES = ("CANDLE", "REALTIME", "GRID", "MULTI")
+TARGET_HOT_PERIOD_SECONDS = 1.0
+TARGET_REFERENCE_PERIOD_SECONDS = 60.0
+# Sealed quota is a fixed-minute window shared by both Query replicas through
+# Redis, with no burst smoothing, so start-up warmups, reconnects and the final
+# 25% burst land in the same minute as steady traffic.
+TARGET_QUOTA_HEADROOM = 1.5
+TARGET_STREAM_HEADROOM = 1.2
+
+
+@dataclass(frozen=True, slots=True)
+class TargetPoll:
+ """One fixed-period read a logical alpha issues for the whole observation."""
+
+ products: tuple[AcceptanceProduct, ...]
+ period_seconds: float
+ operation: str
+
+ def __post_init__(self) -> None:
+ if not self.products or self.period_seconds <= 0:
+ raise ValueError("target poll is invalid")
+ if self.operation not in {"SNAPSHOT", "REFERENCE_BATCH"}:
+ raise ValueError("target poll operation is unknown")
+ if self.operation == "SNAPSHOT" and len(self.products) != 1:
+ raise ValueError("a snapshot poll reads exactly one product")
+
+
+@dataclass(frozen=True, slots=True)
+class TargetAlphaSession:
+ ordinal: int
+ consumer_id: str
+ alpha_class: str
+ streams: tuple[AcceptanceProduct, ...]
+ polls: tuple[TargetPoll, ...]
+ startup_snapshots: tuple[AcceptanceProduct, ...] = ()
+
+ def __post_init__(self) -> None:
+ if self.alpha_class not in TARGET_CLASSES or self.ordinal < 1:
+ raise ValueError("target session class or ordinal is invalid")
+ if not self.streams or not self.polls:
+ raise ValueError("target session needs streams and polls")
+ products = (*self.streams, *(p for poll in self.polls for p in poll.products),
+ *self.startup_snapshots)
+ if any(item.consumer_id != self.consumer_id for item in products):
+ raise ValueError("target session mixes consumer identities")
+ declared = {item.identity for item in products}
+ if not 2 <= len(declared) <= 6:
+ raise ValueError("target session must declare 2..5 products plus a startup snapshot")
+
+ @property
+ def requests_per_minute(self) -> float:
+ return sum(60.0 / poll.period_seconds for poll in self.polls)
+
+
+@dataclass(frozen=True, slots=True)
+class TargetIdentityDemand:
+ consumer_id: str
+ sessions: int
+ required_requests_per_minute: int
+ required_streams: int
+ sealed_requests_per_minute: int
+ sealed_max_streams: int
+
+ @property
+ def quota_needed(self) -> int:
+ return math.ceil(self.required_requests_per_minute * TARGET_QUOTA_HEADROOM)
+
+ @property
+ def streams_needed(self) -> int:
+ return math.ceil(self.required_streams * TARGET_STREAM_HEADROOM)
+
+ @property
+ def fits(self) -> bool:
+ return (self.sealed_requests_per_minute >= self.quota_needed
+ and self.sealed_max_streams >= self.streams_needed)
+
+
+@dataclass(frozen=True, slots=True)
+class TargetWorkloadPlan:
+ stage: int
+ sessions: tuple[TargetAlphaSession, ...]
+ demands: tuple[TargetIdentityDemand, ...]
+
+ @property
+ def stream_count(self) -> int:
+ return sum(len(item.streams) for item in self.sessions)
+
+ @property
+ def hot_requests_per_second(self) -> float:
+ return sum(1.0 / poll.period_seconds for s in self.sessions for poll in s.polls
+ if poll.period_seconds <= TARGET_HOT_PERIOD_SECONDS)
+
+ @property
+ def class_counts(self) -> tuple[int, ...]:
+ counts = Counter(item.alpha_class for item in self.sessions)
+ return tuple(counts[name] for name in TARGET_CLASSES)
+
+ @property
+ def covered_instruments(self) -> tuple[tuple[str, str], ...]:
+ return tuple(sorted({(p.venue, p.native_symbol) for s in self.sessions for p in s.streams}))
+
+
+def _one(products: Sequence[AcceptanceProduct], venue: str, symbol: str,
+ feed: str, interval: str | None = None) -> AcceptanceProduct:
+ found = [item for item in products
+ if item.venue == venue and item.native_symbol == symbol
+ and item.feed.value == feed and (interval is None or item.interval == interval)]
+ if len(found) != 1:
+ raise ValueError(f"target workload needs exactly one {feed}{'/' + interval if interval else ''} "
+ f"for {venue} {symbol}; manifest declares {len(found)}")
+ return found[0]
+
+
+def build_target_workload_plan(
+ *,
+ stage: int,
+ manifests: Mapping[str, ConsumerManifest],
+ products_by_consumer: Mapping[str, Sequence[AcceptanceProduct]],
+ venue_identity: Mapping[str, str],
+ instruments: Mapping[str, Sequence[str]],
+ enforce_quota: bool = True,
+) -> TargetWorkloadPlan:
+ """Materialize the frozen four-class workload for one stage.
+
+ Sessions are assigned to venue/symbol pairs round-robin, so every stage of
+ at least ten single-instrument sessions covers all ten pairs. A MULTI
+ session takes two symbols of one venue because one alpha identity serves
+ one venue. Raises before any traffic when a class product is missing from
+ the identity's manifest or when a sealed quota cannot carry the demand with
+ the declared headroom.
+ """
+
+ if stage not in TARGET_STAGE_MIX:
+ raise ValueError(f"target stage must be one of {sorted(TARGET_STAGE_MIX)}")
+ venues = sorted(venue_identity)
+ # Interleave venues symbol by symbol so every stage, including five
+ # sessions, spreads over both venues and both identities rather than
+ # filling one venue first.
+ columns = [sorted(instruments[venue]) for venue in venues]
+ pairs = [(venue, column[row]) for row in range(max(map(len, columns)))
+ for venue, column in zip(venues, columns) if row < len(column)]
+ if not pairs:
+ raise ValueError("target workload has no instruments")
+ classes = [name for name, count in zip(TARGET_CLASSES, TARGET_STAGE_MIX[stage]) for _ in range(count)]
+ sessions: list[TargetAlphaSession] = []
+ for ordinal, alpha_class in enumerate(classes, start=1):
+ venue, symbol = pairs[(ordinal - 1) % len(pairs)]
+ consumer_id = venue_identity[venue]
+ values = products_by_consumer[consumer_id]
+ hot = lambda *items: TargetPoll(tuple(items), TARGET_HOT_PERIOD_SECONDS,
+ "REFERENCE_BATCH" if items[0].feed.value == "MARK_INDEX_PRICE" else "SNAPSHOT")
+ if alpha_class == "CANDLE":
+ streams = (_one(values, venue, symbol, "BAR", "1m"),)
+ polls = (hot(_one(values, venue, symbol, "QUOTE")),)
+ startup = ()
+ elif alpha_class == "REALTIME":
+ streams = (_one(values, venue, symbol, "TRADE"), _one(values, venue, symbol, "QUOTE"))
+ polls = (hot(_one(values, venue, symbol, "MARK_INDEX_PRICE")),)
+ startup = ()
+ elif alpha_class == "GRID":
+ streams = (_one(values, venue, symbol, "BAR", "1m"), _one(values, venue, symbol, "QUOTE"),
+ _one(values, venue, symbol, "BOOK_DELTA"))
+ polls = (hot(_one(values, venue, symbol, "MARK_INDEX_PRICE")),)
+ startup = (_one(values, venue, symbol, "BOOK_SNAPSHOT"),)
+ else:
+ symbols = sorted(instruments[venue])
+ second = symbols[(symbols.index(symbol) + 1) % len(symbols)]
+ streams = (_one(values, venue, symbol, "QUOTE"), _one(values, venue, second, "QUOTE"))
+ polls = (
+ TargetPoll((_one(values, venue, symbol, "MARK_INDEX_PRICE"),
+ _one(values, venue, second, "MARK_INDEX_PRICE")),
+ TARGET_HOT_PERIOD_SECONDS, "REFERENCE_BATCH"),
+ TargetPoll((_one(values, venue, symbol, "FUNDING_RATE"),),
+ TARGET_REFERENCE_PERIOD_SECONDS, "REFERENCE_BATCH"),
+ )
+ startup = ()
+ sessions.append(TargetAlphaSession(ordinal, consumer_id, alpha_class, streams, polls, startup))
+
+ demands = []
+ for consumer_id in sorted({item.consumer_id for item in sessions}):
+ mine = [item for item in sessions if item.consumer_id == consumer_id]
+ quotas = manifests[consumer_id].quotas
+ demand = TargetIdentityDemand(
+ consumer_id=consumer_id,
+ sessions=len(mine),
+ required_requests_per_minute=round(sum(item.requests_per_minute for item in mine)),
+ required_streams=sum(len(item.streams) for item in mine),
+ sealed_requests_per_minute=quotas.requests_per_minute,
+ sealed_max_streams=quotas.max_streams,
+ )
+ if enforce_quota and not demand.fits:
+ raise ValueError(
+ f"target stage {stage} does not fit sealed quota of {consumer_id}: needs "
+ f"{demand.quota_needed} rpm / {demand.streams_needed} streams with headroom, sealed "
+ f"{demand.sealed_requests_per_minute} rpm / {demand.sealed_max_streams} streams")
+ demands.append(demand)
+ return TargetWorkloadPlan(stage=stage, sessions=tuple(sessions), demands=tuple(demands))
+
+
+# ---------------------------------------------------------------------------
+# Target-run accounting and acceptance. Pure: the driver owns every socket and
+# clock; these types only decide what was offered, what happened to it, and
+# whether the frozen budget holds.
+# ---------------------------------------------------------------------------
+
+
+class DeclaredRateTicker:
+ """Due times of one declared fixed-period read; the period never stretches.
+
+ Tick ``k`` is due at ``start + phase + k * period`` for every due time
+ before ``end``. ``take(now)`` returns the next tick to send and how many
+ earlier ticks were missed on the way. A tick whose whole period elapsed
+ before it could be sent is *missed* - counted, never re-timed - so a slow
+ server or a starved client cannot lower the offered rate and pass.
+ """
+
+ def __init__(self, *, start: float, period: float, phase: float, end: float) -> None:
+ if period <= 0 or not 0 <= phase < period or end <= start:
+ raise ValueError("declared-rate ticker window is invalid")
+ self._first = start + phase
+ self._period = period
+ self._end = end
+ self._next = 0
+
+ @property
+ def offered(self) -> int:
+ if self._first >= self._end:
+ return 0
+ return math.ceil((self._end - self._first) / self._period - 1e-9)
+
+ def take(self, now: float) -> tuple[float | None, int]:
+ missed = 0
+ while self._next < self.offered:
+ due = self._first + self._next * self._period
+ self._next += 1
+ if now < due + self._period:
+ return due, missed
+ missed += 1
+ return None, missed
+
+
+@dataclass(slots=True)
+class PollLedger:
+ """Exact fate of every offered tick of one declared read."""
+
+ offered: int = 0
+ sent: int = 0
+ completed: int = 0
+ failed: int = 0
+ missed: int = 0
+ late: int = 0
+ failure_codes: Counter = field(default_factory=Counter)
+
+ def record_failure(self, code: str) -> None:
+ self.failed += 1
+ self.failure_codes[code] += 1
+
+ @property
+ def balanced(self) -> bool:
+ return (self.offered == self.sent + self.missed
+ and self.sent == self.completed + self.failed)
+
+ def evidence(self) -> dict[str, object]:
+ return {
+ "offered": self.offered, "sent": self.sent, "completed": self.completed,
+ "failed": self.failed, "missed": self.missed, "late": self.late,
+ "balanced": self.balanced,
+ "failure_codes": dict(sorted(self.failure_codes.items())),
+ }
+
+
+class BarSeries:
+ """Bounded append/dedup/FIFO BAR series, kept the way an alpha keeps it.
+
+ A repeated open (a revision, or the handoff bar the warmup already holds)
+ is deduplicated onto the tail; the next open appends; an older
+ open is a FIFO violation and a skipped open is a gap. Both raise, because a
+ strategy that silently accepts either computes on a series that does not
+ exist.
+ """
+
+ def __init__(self, *, maxlen: int, interval_ns: int) -> None:
+ if maxlen < 1 or interval_ns <= 0:
+ raise ValueError("bar series bounds are invalid")
+ self._opens: deque[int] = deque(maxlen=maxlen)
+ self._interval_ns = interval_ns
+ self.appended = 0
+ self.repeats = 0
+
+ def __len__(self) -> int:
+ return len(self._opens)
+
+ @property
+ def last_open_ns(self) -> int | None:
+ return self._opens[-1] if self._opens else None
+
+ def offer(self, open_ns: int) -> str:
+ last = self.last_open_ns
+ if last is None or open_ns == last + self._interval_ns:
+ self._opens.append(open_ns)
+ self.appended += 1
+ return "APPEND"
+ if open_ns == last:
+ self.repeats += 1
+ return "REPEAT"
+ if open_ns < last:
+ raise ValueError("BAR series FIFO violation: an older open arrived after a newer one")
+ raise ValueError("BAR series gap: an open was skipped")
+
+
+def nearest_rank(values: Sequence[float], quantile: float) -> float | None:
+ if not values:
+ return None
+ ordered = sorted(values)
+ return ordered[min(len(ordered) - 1, max(0, math.ceil(quantile * len(ordered)) - 1))]
+
+
+def load_target_budget(raw: Mapping[str, object]) -> Mapping[str, object]:
+ if raw.get("schema") != "qdl.v211.target-acceptance-budget.v1":
+ raise ValueError("target acceptance budget schema is unknown")
+ stages = raw.get("stages")
+ if not isinstance(stages, Mapping) or {int(key) for key in stages} != set(TARGET_STAGE_MIX):
+ raise ValueError("target acceptance budget stages differ from the frozen profile")
+ for key, value in stages.items():
+ if tuple(value["mix"]) != TARGET_STAGE_MIX[int(key)] or value["seconds"] != TARGET_STAGE_SECONDS[int(key)]:
+ raise ValueError("target acceptance budget stage mix or duration differs from the frozen profile")
+ return raw
+
+
+def evaluate_latency(values_ms: Sequence[float], target: Mapping[str, object],
+ rule: Mapping[str, object]) -> dict[str, object]:
+ count = len(values_ms)
+ p95, p99 = nearest_rank(values_ms, 0.95), nearest_rank(values_ms, 0.99)
+ result: dict[str, object] = {
+ "count": count, "p50": nearest_rank(values_ms, 0.50), "p95": p95, "p99": p99,
+ "max": max(values_ms) if values_ms else None,
+ "target_p95": target["p95"], "target_p99": target["p99"],
+ }
+ if count == 0:
+ result.update(status="FAIL", rule="no samples")
+ elif count >= int(rule["p99_min_samples"]):
+ result.update(status="PASS" if p95 <= target["p95"] and p99 <= target["p99"] else "FAIL",
+ rule="p95 and p99")
+ elif count >= int(rule["p95_min_samples"]):
+ result.update(status="PASS" if p95 <= target["p95"] else "FAIL", rule="p95; p99 reported only")
+ else:
+ result.update(status="PASS" if result["max"] <= target["p99"] else "FAIL",
+ rule="small sample: max within p99 target")
+ return result
+
+
+def _gate(name: str, passed: bool, **evidence: object) -> dict[str, object]:
+ return {"gate": name, "status": "PASS" if passed else "FAIL", **evidence}
+
+
+def evaluate_target_acceptance(
+ *,
+ budget: Mapping[str, object],
+ stage: int,
+ final: bool,
+ receipt: Mapping[str, object],
+ trading_system: Mapping[str, object],
+) -> dict[str, object]:
+ """Apply the frozen budget to one run. Every gate is listed, pass or fail."""
+
+ gates: list[dict[str, object]] = []
+ classes = budget["latency_ms"]
+ series: Mapping[str, Sequence[float]] = receipt["latency_series"]
+ venues = sorted({key.split("|")[1] for key in series})
+ for name, target in sorted(classes.items()):
+ for venue in venues:
+ result = evaluate_latency(series.get(f"{name}|{venue}|STEADY", ()), target,
+ budget["sample_rule"])
+ gates.append({"gate": f"latency:{name}:{venue}", **result})
+ ledgers = receipt["poll_ledgers"]
+ offered = sum(item["offered"] for item in ledgers)
+ missed = sum(item["missed"] for item in ledgers)
+ failed = sum(item["failed"] for item in ledgers)
+ unbalanced = [item for item in ledgers if not item["balanced"]]
+ starved = [item for item in ledgers if item["offered"] and item["completed"] == 0]
+ requests = budget["requests"]
+ gates.append(_gate("requests:offered_equals_sent_plus_missed", not unbalanced,
+ offered=offered, unbalanced=len(unbalanced)))
+ gates.append(_gate("requests:no_missed_ticks", missed <= requests["max_missed_ticks"], missed=missed))
+ gates.append(_gate("requests:no_failures", failed <= requests["max_failed_steady"],
+ failed=failed, codes=dict(sum((Counter(item["failure_codes"]) for item in ledgers), Counter()))))
+ gates.append(_gate("requests:no_starved_session", not starved, starved=len(starved)))
+ lag_p99 = receipt["scheduler_lag_ms"].get("p99")
+ gates.append(_gate("client:scheduler_lag_valid",
+ lag_p99 is not None and lag_p99 <= requests["client_validity_scheduler_lag_p99_ms"],
+ p99_ms=lag_p99))
+ streams = receipt["streams"]
+ stream_errors = sum(item["errors"] for item in streams)
+ gates.append(_gate("streams:no_errors", stream_errors <= budget["streams"]["max_stream_errors"],
+ errors=stream_errors, streams=len(streams)))
+ silent = [item["name"] for item in streams
+ if item["feed"] in budget["streams"]["first_event_required_feeds"] and item["events"] < 1]
+ gates.append(_gate("streams:every_live_stream_delivered", not silent, silent=silent))
+ bars = [item for item in streams if item["feed"] == "BAR"]
+ short = [item["name"] for item in bars
+ if item["final_bars"] < budget["streams"]["min_final_bars_per_bar_stream"]]
+ gates.append(_gate("streams:final_bar_every_bar_stream", not short, bar_streams=len(bars), missing=short))
+ cold = receipt["cold"]
+ cold_bad = [item for item in cold if item.get("error") or item.get("returned") != item.get("rows")]
+ wanted = {(venue, rows) for venue in venues for rows in budget["cold"]["rows"]}
+ done = {(item["venue"], item["rows"]) for item in cold if not item.get("error")}
+ gates.append(_gate("cold:2500_5000_overlap_per_venue", not cold_bad and wanted <= done,
+ runs=len(cold), bad=len(cold_bad)))
+ setup = receipt["setup"]
+ gates.append(_gate("startup:bounded", not setup["failures"]
+ and setup["seconds"] <= budget["startup"]["max_setup_seconds"],
+ seconds=setup["seconds"], retries=setup["retries"], failures=setup["failures"]))
+ gates.append(_gate("teardown:no_leaked_work", receipt["leaked_tasks"] == 0, leaked=receipt["leaked_tasks"]))
+ ts_budget = budget["trading_system"]
+ samples = trading_system.get("samples", [])
+ def sample_ready(item: Mapping[str, object]) -> bool:
+ # Quiet/live is evaluated by the typed read plane, not a symbol-name
+ # exception in the load harness. An unhealthy/disconnected route
+ # cannot be certified by copying an old budget's exemption.
+ return (item.get("demanded") == ts_budget["demanded_routes"]
+ and item.get("ready") == ts_budget["demanded_routes"]
+ and (item.get("fallback") or 0) <= ts_budget["max_fallback"]
+ and not item.get("unhealthy"))
+
+ not_ready = [item for item in samples if not sample_ready(item)]
+ gates.append(_gate("ts:ready_60_every_sample", bool(samples) and not not_ready,
+ samples=len(samples), not_ready=len(not_ready)))
+ errors = [item.get("v2_error") for item in samples if isinstance(item.get("v2_error"), int)]
+ gates.append(_gate("ts:v2_error_not_increased",
+ bool(errors) and max(errors) - min(errors) <= ts_budget["max_v2_error_increase"],
+ first=errors[0] if errors else None, last=errors[-1] if errors else None))
+ codes = trading_system.get("disconnect_codes", {})
+ forbidden = {code: count for code, count in codes.items() if code in ts_budget["forbidden_disconnect_codes"]}
+ rate = trading_system.get("run_disconnects_per_minute")
+ base = trading_system.get("baseline_disconnects_per_minute")
+ gates.append(_gate("ts:no_auth_or_manifest_disconnect", not forbidden, forbidden=forbidden))
+ gates.append(_gate("ts:disconnects_within_baseline",
+ rate is not None and base is not None
+ and rate - base <= ts_budget["max_disconnect_rate_over_baseline_per_minute"],
+ run_per_minute=rate, baseline_per_minute=base, codes=codes))
+ if final:
+ windows = receipt.get("fault_windows", {})
+ gates.append(_gate("final:fault_windows_ran",
+ all(windows.get(key) for key in ("BURST", "SLOW_READER", "RECONNECT")),
+ windows=windows))
+ for window in ("BURST", "RECONNECT"):
+ window_values = [value for key, values in series.items()
+ if key.endswith(f"|{window}") for value in values]
+ gates.append(_gate(f"final:{window.lower()}_window_measured", bool(window_values),
+ count=len(window_values)))
+ failed_gates = [item["gate"] for item in gates if item["status"] != "PASS"]
+ return {"stage": stage, "final": final, "status": "PASS" if not failed_gates else "FAIL",
+ "failed_gates": failed_gates, "gates": gates}
diff --git a/qdl/certification/reference_l2_acceptance.py b/qdl/certification/reference_l2_acceptance.py
index 261a9346..e5a7c84f 100644
--- a/qdl/certification/reference_l2_acceptance.py
+++ b/qdl/certification/reference_l2_acceptance.py
@@ -114,8 +114,8 @@ class ReferenceL2AcceptanceScope:
books: tuple[AcceptanceProduct, ...]
def __post_init__(self) -> None:
- if len(self.references) != 55 or len(self.books) != 24:
- raise ValueError("Reference/L2 acceptance must contain exactly 55 reference and 24 book products")
+ if not self.references or not self.books:
+ raise ValueError("Reference/L2 acceptance requires references and book products")
identities = [item.identity for item in self.references] + [item.identity for item in self.books]
if len(identities) != len(set(identities)):
raise ValueError("Reference/L2 acceptance contains duplicate product identities")
diff --git a/qdl/consumer/manifest.py b/qdl/consumer/manifest.py
index e984fef3..8b14decd 100644
--- a/qdl/consumer/manifest.py
+++ b/qdl/consumer/manifest.py
@@ -177,8 +177,11 @@ def from_mapping(payload: Any) -> ConsumerManifest:
}:
raise ValueError("consumer manifest spec contains unknown fields")
requirements = spec.get("requirements")
- if not isinstance(requirements, list) or not 1 <= len(requirements) <= 256:
- raise ValueError("consumer manifest requires 1..256 requirements")
+ # Bounded, not a product quota: the D48 daily universe (up to 300
+ # symbols per venue) sits beside the execution products of one alpha
+ # identity; per-request limits stay in the manifest quotas.
+ if not isinstance(requirements, list) or not 1 <= len(requirements) <= 1024:
+ raise ValueError("consumer manifest requires 1..1024 requirements")
permissions = spec.get("permissions")
purposes = spec.get("purposes")
quotas = spec.get("quotas")
diff --git a/qdl/data_quality/binding_decision.py b/qdl/data_quality/binding_decision.py
index e63968c3..bae8ce1d 100644
--- a/qdl/data_quality/binding_decision.py
+++ b/qdl/data_quality/binding_decision.py
@@ -324,10 +324,13 @@ def freshness_verdict(
# Gap/completeness are evaluated by the caller's declared gap policy after
# this freshness verdict. Collapsing them into DATA_STALE would lose the
# actionable OPEN_SEQUENCE_GAP error contract.
- if state in {"STALE", "OFFLINE", "UNAVAILABLE"}:
- return False, "EVENT_AGE"
+ # A STALE state caused by the provider session (lost, expired, unknown,
+ # generation/config mismatch) is named as such; only an old event is
+ # EVENT_AGE. The admission decision is the same either way.
if provider_session_state in {"STALE", "DISCONNECTED", "UNKNOWN"}:
return False, "SESSION_STATE"
+ if state in {"STALE", "OFFLINE", "UNAVAILABLE"}:
+ return False, "EVENT_AGE"
if max_session_liveness_ms is not None and not (
provider_session_state == "LIVE"
and provider_session_liveness_ms is not None
diff --git a/qdl/domain/capabilities.py b/qdl/domain/capabilities.py
index 0fb6bda6..255a0b80 100644
--- a/qdl/domain/capabilities.py
+++ b/qdl/domain/capabilities.py
@@ -11,6 +11,13 @@
)
+# Explicit analytics subset of the fixed-duration canonical contract, verified
+# against OKX Trading Statistics docs on 2026-09-26 (not the candle capability).
+OKX_REFERENCE_INTERVALS = (
+ "5m", "15m", "30m", "1h", "2h", "4h", "6h", "12h", "1d", "2d", "3d", "1w",
+)
+
+
class CapabilityAvailability(str, Enum):
AVAILABLE = "AVAILABLE"
UNAVAILABLE = "UNAVAILABLE"
@@ -72,6 +79,7 @@ def okx_global_capabilities(market: str, *, account_tier: str = "PUBLIC") -> Ven
if market_value not in {"SPOT", "SWAP", "FUTURES", "OPTION", "EVENTS"}:
raise ValueError(f"unsupported OKX market profile: {market}")
deep_book = CapabilityAvailability.TIER_GATED
+ contract_analytics = market_value in {"SWAP", "FUTURES"}
return VenueCapabilityProfile(
provider="OKX_DIRECT",
venue="OKX",
@@ -121,8 +129,11 @@ def okx_global_capabilities(market: str, *, account_tier: str = "PUBLIC") -> Ven
),
"open_interest": FeedCapability(
CapabilityAvailability.AVAILABLE,
+ rest_history=contract_analytics,
snapshot=True,
- constraint="public current snapshot; no certified historical series in this profile",
+ native_intervals=OKX_REFERENCE_INTERVALS if contract_analytics else (),
+ constraint=("exact-contract snapshot; SWAP/FUTURES history retains at most 1440 samples; contracts/base/USD"
+ if contract_analytics else "public current snapshot; no certified historical series in this profile"),
),
"mark_index_price": FeedCapability(
CapabilityAvailability.AVAILABLE,
@@ -131,12 +142,18 @@ def okx_global_capabilities(market: str, *, account_tier: str = "PUBLIC") -> Ven
constraint="mark/index history and current public reference reads",
),
"long_short_ratio": FeedCapability(
- CapabilityAvailability.UNAVAILABLE,
- constraint="no provider-equivalent public OKX global/top account ratio",
+ CapabilityAvailability.AVAILABLE if contract_analytics else CapabilityAvailability.UNAVAILABLE,
+ rest_history=contract_analytics,
+ native_intervals=OKX_REFERENCE_INTERVALS if contract_analytics else (),
+ constraint=("SWAP/FUTURES exact-contract global account/top 5% account/top 5% position; at most 1440 samples"
+ if contract_analytics else "no provider-equivalent public OKX global/top account ratio"),
),
"taker_flow": FeedCapability(
- CapabilityAvailability.UNAVAILABLE,
- constraint="no provider-equivalent public OKX taker long/short ratio",
+ CapabilityAvailability.AVAILABLE if contract_analytics else CapabilityAvailability.UNAVAILABLE,
+ rest_history=contract_analytics,
+ native_intervals=OKX_REFERENCE_INTERVALS if contract_analytics else (),
+ constraint=("SWAP/FUTURES exact-contract buy/sell volume in contracts; at most 1440 samples; no native buy/sell ratio"
+ if contract_analytics else "no provider-equivalent public OKX taker long/short ratio"),
),
"basis": FeedCapability(
CapabilityAvailability.AVAILABLE,
diff --git a/qdl/projection/kn_state_codec.py b/qdl/projection/kn_state_codec.py
new file mode 100644
index 00000000..7e270043
--- /dev/null
+++ b/qdl/projection/kn_state_codec.py
@@ -0,0 +1,613 @@
+"""KN-3 state codecs (contract sections 2-5, decisions D2-D4), shared with Rust.
+
+The byte formats the Kafka-native projector writes and every reader decodes.
+``rust/qdl-contracts/src/state_codec.rs`` implements the same rules; the
+oracle both read is ``contracts/golden/kn_v220/state_codec.json``, built from
+real canonical records by ``scripts/kn_state_codec_golden.py``.
+
+* **State trailer** (48 bytes): source offset u64 BE, materializer epoch u64
+ BE, SHA-256 of the canonical EventEnvelope bytes.
+* **BAR cache row** = trailer + the canonical envelope without the LPK-derived
+ fields (instrument uid, venue, market, bar interval). Byte-identical to the
+ KN-1 reference ``scripts/kn_resource_sizing.py`` ``lpk_row``. Decoding
+ restores the four fields from the LPK and proves the result against the hash.
+* **Latest cache value** = trailer + the full canonical bytes.
+* **State-topic frame** (D2): ``QKS1`` + kind u8 + header length u32 BE +
+ canonical strict JSON header + the canonical envelope bytes unchanged.
+* **Keys and partition** (D3): the latest key is the LPK; BAR keys separate
+ the in-progress row from each final revision; every record of one product
+ goes to ``murmur2(lpk) & 0x7fffffff % partitions`` (Kafka's default hash).
+
+Boundary: pure functions over bytes, no I/O. Every refusal is a
+``StateCodecError`` whose ``reason`` is one of ``REASONS``; Rust reports the
+same reason for the same input, which the golden pins. JSON parsing is aligned
+with ``serde_json`` (integers beyond u64/i64 and ``-0`` become floats, a float that
+overflows is a parse error, nesting deeper than ``MAX_JSON_DEPTH`` is a parse
+error, lone surrogates are a parse error) so both sides classify every header
+identically.
+"""
+from __future__ import annotations
+
+from dataclasses import dataclass
+from enum import IntEnum
+import hashlib
+import json
+import math
+import re
+from typing import Any
+
+from google.protobuf.message import DecodeError
+
+from qdl.marketdata.v2 import market_data_pb2
+from qdl.projection.state_contract import MAX_OFFSET, LogicalProductKey, SourceCoordinate
+
+TRAILER_BYTES = 48
+FRAME_MAGIC = b"QKS1"
+FRAME_PREFIX_BYTES = 9
+MAX_HEADER_BYTES = 4096
+# serde_json's recursion limit: 128 nested arrays/objects is a parse error.
+MAX_JSON_DEPTH = 127
+MAX_PARTITION = (1 << 31) - 1
+MAX_REVISION = (1 << 32) - 1
+MAX_PARTITIONS = (1 << 31) - 1
+LEGACY_PROVENANCE = "legacy_import"
+KAFKA_MURMUR2_SEED = 0x9747B28C
+_MURMUR2_M = 0x5BD1E995
+_U32 = 0xFFFFFFFF
+_U64 = (1 << 64) - 1
+
+# Always ``fullmatch``: ``re.match`` with ``$`` also accepts a trailing "\n".
+# Header strings never need JSON escaping, so both encoders agree byte for byte.
+_TEXT = re.compile(r"[A-Za-z0-9._:/@|+=-]{1,1024}")
+_HEX64 = re.compile(r"[0-9a-f]{64}")
+_EVENT_ID = re.compile(r"(?:[0-9a-f]{2}){1,512}")
+
+REASONS = (
+ "TRUNCATED", # shorter than its fixed prefix, or header length past the end
+ "MAGIC", # frame does not start with QKS1
+ "KIND", # unknown frame kind byte
+ "HEADER_SIZE", # declared header length above MAX_HEADER_BYTES
+ "HEADER_JSON", # header is not a UTF-8 JSON object
+ "HEADER_FIELDS", # header (or a nested object) field set is not exact
+ "FIELD", # a header field has the wrong type, range or format
+ "NON_CANONICAL", # header bytes or a BAR row body are not the canonical encoding
+ "BODY", # floor frame with a body, or a state record without one
+ "CONTENT_HASH", # SHA-256 of the canonical bytes differs from the stored hash
+ "ENVELOPE", # body is not a decodable EventEnvelope
+ "NOT_BAR", # a BAR codec was given another payload
+ "PRODUCT_MISMATCH", # envelope uid/venue/market/feed/interval differ from the LPK
+ "OPEN_TIME", # bar open time negative or not a whole millisecond
+ "HEADER_MISMATCH", # header event id/open time/revision/finality differ from the envelope
+ "TRAILER", # source offset above 2^63-1 or materializer epoch outside 1..2^63-1
+ "ENVELOPE_NOT_CANONICAL", # canonical bytes would not re-serialize byte-for-byte after decode
+ "PARTITIONS", # partition count outside 1..2^31-1
+)
+
+
+class StateCodecError(ValueError):
+ """A typed refusal; ``reason`` is shared with the Rust codec."""
+
+ def __init__(self, reason: str, detail: str = "") -> None:
+ super().__init__(f"STATE_CODEC:{reason}" + (f":{detail}" if detail else ""))
+ self.reason = reason
+ self.detail = detail
+
+
+class FrameKind(IntEnum):
+ LATEST = 1
+ BAR_REVISION = 2
+ RETENTION_FLOOR = 3
+ LEGACY_BAR = 4
+
+
+_SOURCE_FIELDS = ("offset", "partition", "topic_id")
+_LEGACY_FIELDS = ("spool_logical_offset", "spool_partition_key", "spool_stream")
+_HEADER_FIELDS = {
+ FrameKind.LATEST: ("content_sha256", "event_id", "lpk", "materializer_epoch", "source"),
+ FrameKind.BAR_REVISION: ("content_sha256", "event_id", "is_final", "lpk", "materializer_epoch",
+ "open_time_ms", "revision", "source"),
+ FrameKind.RETENTION_FLOOR: ("floor_open_time_ms", "lpk", "materializer_epoch"),
+ FrameKind.LEGACY_BAR: ("content_sha256", "event_id", "is_final", "legacy", "lpk", "materializer_epoch",
+ "open_time_ms", "provenance", "revision"),
+}
+
+
+def _is_integer(value: object) -> bool:
+ return isinstance(value, int) and not isinstance(value, bool)
+
+
+# ------------------------------------------------------------------ trailer
+
+@dataclass(frozen=True)
+class DecodedState:
+ """A cache value proven against its trailer hash."""
+
+ canonical: bytes
+ source_offset: int
+ materializer_epoch: int
+
+
+def _check_trailer_numbers(source_offset: object, materializer_epoch: object) -> None:
+ if (not _is_integer(source_offset) or not _is_integer(materializer_epoch)
+ or not 0 <= source_offset <= MAX_OFFSET or not 1 <= materializer_epoch <= MAX_OFFSET):
+ raise StateCodecError("TRAILER")
+
+
+def state_trailer(canonical: bytes, source_offset: int, materializer_epoch: int) -> bytes:
+ _check_trailer_numbers(source_offset, materializer_epoch)
+ return (source_offset.to_bytes(8, "big") + materializer_epoch.to_bytes(8, "big")
+ + hashlib.sha256(canonical).digest())
+
+
+def _read_trailer(data: bytes) -> tuple[int, int, bytes]:
+ if len(data) < TRAILER_BYTES:
+ raise StateCodecError("TRUNCATED")
+ source_offset = int.from_bytes(data[:8], "big")
+ materializer_epoch = int.from_bytes(data[8:16], "big")
+ _check_trailer_numbers(source_offset, materializer_epoch)
+ return source_offset, materializer_epoch, bytes(data[16:TRAILER_BYTES])
+
+
+def encode_latest_value(canonical: bytes, source_offset: int, materializer_epoch: int) -> bytes:
+ """Latest cache value: trailer + the full canonical bytes (nothing stripped)."""
+
+ trailer = state_trailer(canonical, source_offset, materializer_epoch)
+ if not canonical:
+ raise StateCodecError("BODY")
+ return trailer + bytes(canonical)
+
+
+def decode_latest_value(value: bytes) -> DecodedState:
+ source_offset, materializer_epoch, digest = _read_trailer(value)
+ canonical = bytes(value[TRAILER_BYTES:])
+ if not canonical:
+ raise StateCodecError("BODY")
+ if hashlib.sha256(canonical).digest() != digest:
+ raise StateCodecError("CONTENT_HASH")
+ return DecodedState(canonical, source_offset, materializer_epoch)
+
+
+# ------------------------------------------------------------------ product checks
+
+def _parse_envelope(canonical: bytes) -> market_data_pb2.EventEnvelope:
+ """Parse like prost: unknown fields are dropped (upb would keep and re-emit them)."""
+
+ try:
+ envelope = market_data_pb2.EventEnvelope.FromString(bytes(canonical))
+ except DecodeError as error:
+ raise StateCodecError("ENVELOPE") from error
+ envelope.DiscardUnknownFields()
+ return envelope
+
+
+def _check_product(envelope: market_data_pb2.EventEnvelope, lpk: LogicalProductKey) -> None:
+ """The envelope is the product ``lpk`` names: uid, venue, market, feed and qualifier."""
+
+ payload = envelope.WhichOneof("payload")
+ qualifier = envelope.bar.interval if payload == "bar" else "-"
+ for name, actual, expected in (
+ ("instrument_uid", envelope.instrument_uid, lpk.instrument_uid),
+ ("venue", envelope.venue, lpk.venue),
+ ("market", envelope.market, lpk.market),
+ ("feed", (payload or "").upper(), lpk.feed),
+ ("qualifier", qualifier, lpk.qualifier),
+ ):
+ if actual != expected:
+ raise StateCodecError("PRODUCT_MISMATCH", name)
+
+
+def _open_time_ms(envelope: market_data_pb2.EventEnvelope) -> int:
+ open_time_ns = envelope.bar.open_time_ns
+ if open_time_ns < 0 or open_time_ns % 1_000_000:
+ raise StateCodecError("OPEN_TIME")
+ return open_time_ns // 1_000_000
+
+
+# ------------------------------------------------------------------ BAR cache row
+
+def encode_bar_row(canonical: bytes, lpk: LogicalProductKey, source_offset: int, materializer_epoch: int) -> bytes:
+ """BAR current-index row: trailer + canonical envelope without the LPK fields.
+
+ Refuses a non-BAR, a row of another product, and canonical bytes that would
+ not be reproduced byte-for-byte by ``decode_bar_row``.
+ """
+
+ trailer = state_trailer(canonical, source_offset, materializer_epoch)
+ envelope = _parse_envelope(canonical)
+ if envelope.WhichOneof("payload") != "bar":
+ raise StateCodecError("NOT_BAR")
+ _check_product(envelope, lpk)
+ envelope.ClearField("instrument_uid")
+ envelope.ClearField("venue")
+ envelope.ClearField("market")
+ envelope.bar.ClearField("interval")
+ body = envelope.SerializeToString()
+ if _restore_bar(envelope, lpk) != bytes(canonical):
+ raise StateCodecError("ENVELOPE_NOT_CANONICAL")
+ return trailer + body
+
+
+def _restore_bar(envelope: market_data_pb2.EventEnvelope, lpk: LogicalProductKey) -> bytes:
+ envelope.instrument_uid = lpk.instrument_uid
+ envelope.venue = lpk.venue
+ envelope.market = lpk.market
+ envelope.bar.interval = lpk.qualifier
+ return envelope.SerializeToString()
+
+
+def decode_bar_row(row: bytes, lpk: LogicalProductKey, *, expected_open_ms: int | None = None) -> DecodedState:
+ source_offset, materializer_epoch, digest = _read_trailer(row)
+ envelope = _parse_envelope(row[TRAILER_BYTES:])
+ if envelope.WhichOneof("payload") != "bar":
+ raise StateCodecError("NOT_BAR")
+ if envelope.instrument_uid or envelope.venue or envelope.market or envelope.bar.interval:
+ raise StateCodecError("NON_CANONICAL")
+ if expected_open_ms is not None and _open_time_ms(envelope) != expected_open_ms:
+ raise StateCodecError("OPEN_TIME_MISMATCH")
+ canonical = _restore_bar(envelope, lpk)
+ if hashlib.sha256(canonical).digest() != digest:
+ raise StateCodecError("CONTENT_HASH")
+ return DecodedState(canonical, source_offset, materializer_epoch)
+
+
+# ------------------------------------------------------------------ canonical JSON header
+
+def _parse_int(text: str) -> int | float:
+ # serde_json keeps an integer only when it fits u64 (or i64 when negative)
+ # and turns ``-0`` into the float ``-0.0``.
+ value = int(text)
+ if value == 0 and text.startswith("-"):
+ return -0.0
+ if -(1 << 63) <= value <= _U64:
+ return value
+ return _parse_float(text)
+
+
+def _parse_float(text: str) -> float:
+ value = float(text)
+ if math.isinf(value):
+ raise ValueError("number out of range")
+ return value
+
+
+def _reject_constant(name: str) -> Any:
+ raise ValueError(name)
+
+
+def _json_shape_ok(value: Any) -> bool:
+ """Depth within serde_json's limit and no lone surrogates (serde_json rejects both)."""
+
+ stack = [(value, 1)]
+ while stack:
+ item, depth = stack.pop()
+ if isinstance(item, (dict, list)):
+ if depth > MAX_JSON_DEPTH:
+ return False
+ children = list(item.items()) if isinstance(item, dict) else [(None, child) for child in item]
+ for key, child in children:
+ if isinstance(key, str) and _has_surrogate(key):
+ return False
+ stack.append((child, depth + 1))
+ elif isinstance(item, str) and _has_surrogate(item):
+ return False
+ return True
+
+
+def _has_surrogate(text: str) -> bool:
+ return any(0xD800 <= ord(char) <= 0xDFFF for char in text)
+
+
+def _parse_header(data: bytes) -> dict[str, Any]:
+ try:
+ value = json.loads(data.decode("utf-8"), parse_int=_parse_int, parse_float=_parse_float,
+ parse_constant=_reject_constant)
+ except (UnicodeDecodeError, ValueError, RecursionError) as error:
+ raise StateCodecError("HEADER_JSON") from error
+ if not isinstance(value, dict) or not _json_shape_ok(value):
+ raise StateCodecError("HEADER_JSON")
+ return value
+
+
+def canonical_json(value: dict[str, Any]) -> bytes:
+ """Sorted byte-order keys, ``,``/``:``, no whitespace; values already validated."""
+
+ parts = []
+ for key in sorted(value, key=lambda item: item.encode()):
+ item = value[key]
+ if isinstance(item, bool):
+ encoded = "true" if item else "false"
+ elif isinstance(item, int):
+ encoded = str(item)
+ elif isinstance(item, str):
+ encoded = f'"{item}"'
+ elif isinstance(item, dict):
+ encoded = canonical_json(item).decode("ascii")
+ else: # pragma: no cover - validation admits no other type
+ raise StateCodecError("FIELD", key)
+ parts.append(f'"{key}":{encoded}')
+ return ("{" + ",".join(parts) + "}").encode("ascii")
+
+
+def _exact(value: dict[str, Any], names: tuple[str, ...], where: str) -> None:
+ if set(value) != set(names):
+ raise StateCodecError("HEADER_FIELDS", where)
+
+
+def _integer(value: Any, minimum: int, maximum: int, name: str) -> None:
+ if not _is_integer(value) or not minimum <= value <= maximum:
+ raise StateCodecError("FIELD", name)
+
+
+def _text(value: Any, name: str) -> None:
+ if not isinstance(value, str) or not _TEXT.fullmatch(value):
+ raise StateCodecError("FIELD", name)
+
+
+def _validate_header(kind: FrameKind, header: dict[str, Any]) -> LogicalProductKey:
+ """Exact field set, then every field in sorted name order (nested too)."""
+
+ names = _HEADER_FIELDS[kind]
+ _exact(header, names, "header")
+ lpk = None
+ for name in names:
+ value = header[name]
+ if name == "content_sha256":
+ if not isinstance(value, str) or not _HEX64.fullmatch(value):
+ raise StateCodecError("FIELD", name)
+ elif name == "event_id":
+ if not isinstance(value, str) or not _EVENT_ID.fullmatch(value):
+ raise StateCodecError("FIELD", name)
+ elif name in ("floor_open_time_ms", "open_time_ms"):
+ _integer(value, 0, MAX_OFFSET, name)
+ elif name == "is_final":
+ if not isinstance(value, bool):
+ raise StateCodecError("FIELD", name)
+ elif name == "legacy":
+ if not isinstance(value, dict):
+ raise StateCodecError("FIELD", name)
+ _exact(value, _LEGACY_FIELDS, name)
+ _integer(value["spool_logical_offset"], 0, MAX_OFFSET, "legacy.spool_logical_offset")
+ _text(value["spool_partition_key"], "legacy.spool_partition_key")
+ _text(value["spool_stream"], "legacy.spool_stream")
+ elif name == "lpk":
+ _text(value, name)
+ try:
+ lpk = LogicalProductKey.parse(value)
+ except ValueError as error:
+ raise StateCodecError("FIELD", name) from error
+ elif name == "materializer_epoch":
+ _integer(value, 1, MAX_OFFSET, name)
+ elif name == "provenance":
+ if value != LEGACY_PROVENANCE:
+ raise StateCodecError("FIELD", name)
+ elif name == "revision":
+ _integer(value, 0, MAX_REVISION, name)
+ elif name == "source":
+ if not isinstance(value, dict):
+ raise StateCodecError("FIELD", name)
+ _exact(value, _SOURCE_FIELDS, name)
+ _integer(value["offset"], 0, MAX_OFFSET, "source.offset")
+ _integer(value["partition"], 0, MAX_PARTITION, "source.partition")
+ _text(value["topic_id"], "source.topic_id")
+ assert lpk is not None
+ return lpk
+
+
+# ------------------------------------------------------------------ state-topic frame
+
+@dataclass(frozen=True)
+class LegacyLineage:
+ """Where a legacy-imported BAR came from; never a canonical Kafka offset."""
+
+ spool_stream: str
+ spool_partition_key: str
+ spool_logical_offset: int
+
+
+@dataclass(frozen=True)
+class StateFrame:
+ """One decoded or to-be-encoded state-topic record (decision D2)."""
+
+ kind: FrameKind
+ lpk: LogicalProductKey
+ materializer_epoch: int
+ envelope: bytes = b""
+ content_sha256: str | None = None
+ event_id: str | None = None
+ source: SourceCoordinate | None = None
+ open_time_ms: int | None = None
+ revision: int | None = None
+ is_final: bool | None = None
+ floor_open_time_ms: int | None = None
+ legacy: LegacyLineage | None = None
+
+ def header(self) -> dict[str, Any]:
+ header: dict[str, Any] = {"lpk": self.lpk.encode(), "materializer_epoch": self.materializer_epoch}
+ if self.kind is FrameKind.RETENTION_FLOOR:
+ header["floor_open_time_ms"] = self.floor_open_time_ms
+ return header
+ header["content_sha256"] = self.content_sha256
+ header["event_id"] = self.event_id
+ if self.kind is FrameKind.LEGACY_BAR:
+ legacy = self.legacy
+ header["legacy"] = None if legacy is None else {
+ "spool_logical_offset": legacy.spool_logical_offset,
+ "spool_partition_key": legacy.spool_partition_key,
+ "spool_stream": legacy.spool_stream}
+ header["provenance"] = LEGACY_PROVENANCE
+ else:
+ source = self.source
+ header["source"] = None if source is None else {
+ "offset": source.offset, "partition": source.partition, "topic_id": source.topic_id}
+ if self.kind in (FrameKind.BAR_REVISION, FrameKind.LEGACY_BAR):
+ header["open_time_ms"] = self.open_time_ms
+ header["revision"] = self.revision
+ header["is_final"] = self.is_final
+ return header
+
+ def encode(self) -> bytes:
+ header = self.header()
+ _validate_header(self.kind, header)
+ encoded = canonical_json(header)
+ return FRAME_MAGIC + bytes([int(self.kind)]) + len(encoded).to_bytes(4, "big") + encoded + self.envelope
+
+ def key(self) -> str:
+ if self.kind is FrameKind.LATEST:
+ return latest_key(self.lpk)
+ if self.kind is FrameKind.RETENTION_FLOOR:
+ return floor_key(self.lpk)
+ assert self.open_time_ms is not None and self.revision is not None and self.content_sha256 is not None
+ return bar_key(self.lpk, self.open_time_ms, bool(self.is_final), self.revision, self.content_sha256)
+
+
+def _envelope_facts(kind: FrameKind, canonical: bytes, lpk: LogicalProductKey) -> dict[str, Any]:
+ """What the envelope itself says; the header must agree with every item."""
+
+ if not canonical:
+ raise StateCodecError("BODY")
+ envelope = _parse_envelope(canonical)
+ bar = kind in (FrameKind.BAR_REVISION, FrameKind.LEGACY_BAR)
+ if bar and envelope.WhichOneof("payload") != "bar":
+ raise StateCodecError("NOT_BAR")
+ _check_product(envelope, lpk)
+ facts: dict[str, Any] = {"content_sha256": hashlib.sha256(canonical).hexdigest(),
+ "event_id": envelope.event_id.hex()}
+ if bar:
+ facts.update(open_time_ms=_open_time_ms(envelope), revision=envelope.bar.revision,
+ is_final=envelope.bar.is_final)
+ return facts
+
+
+def _envelope_frame(kind: FrameKind, canonical: bytes, lpk: LogicalProductKey, materializer_epoch: int,
+ *, source: SourceCoordinate | None = None, legacy: LegacyLineage | None = None) -> StateFrame:
+ canonical = bytes(canonical)
+ facts = _envelope_facts(kind, canonical, lpk)
+ frame = StateFrame(kind, lpk, materializer_epoch, canonical, source=source, legacy=legacy, **facts)
+ _validate_header(kind, frame.header())
+ return frame
+
+
+def latest_frame(canonical: bytes, lpk: LogicalProductKey, source: SourceCoordinate,
+ materializer_epoch: int) -> StateFrame:
+ return _envelope_frame(FrameKind.LATEST, canonical, lpk, materializer_epoch, source=source)
+
+
+def bar_revision_frame(canonical: bytes, lpk: LogicalProductKey, source: SourceCoordinate,
+ materializer_epoch: int) -> StateFrame:
+ return _envelope_frame(FrameKind.BAR_REVISION, canonical, lpk, materializer_epoch, source=source)
+
+
+def legacy_bar_frame(canonical: bytes, lpk: LogicalProductKey, legacy: LegacyLineage,
+ materializer_epoch: int) -> StateFrame:
+ return _envelope_frame(FrameKind.LEGACY_BAR, canonical, lpk, materializer_epoch, legacy=legacy)
+
+
+def retention_floor_frame(lpk: LogicalProductKey, floor_open_time_ms: int, materializer_epoch: int) -> StateFrame:
+ if lpk.feed != "BAR":
+ raise StateCodecError("PRODUCT_MISMATCH", "feed")
+ frame = StateFrame(FrameKind.RETENTION_FLOOR, lpk, materializer_epoch, floor_open_time_ms=floor_open_time_ms)
+ _validate_header(FrameKind.RETENTION_FLOOR, frame.header())
+ return frame
+
+
+def decode_frame(data: bytes) -> StateFrame:
+ """Strict decode; the first failing check in the documented order wins."""
+
+ data = bytes(data)
+ if len(data) < FRAME_PREFIX_BYTES:
+ raise StateCodecError("TRUNCATED")
+ if data[:4] != FRAME_MAGIC:
+ raise StateCodecError("MAGIC")
+ try:
+ kind = FrameKind(data[4])
+ except ValueError as error:
+ raise StateCodecError("KIND") from error
+ header_len = int.from_bytes(data[5:9], "big")
+ if header_len > MAX_HEADER_BYTES:
+ raise StateCodecError("HEADER_SIZE")
+ if FRAME_PREFIX_BYTES + header_len > len(data):
+ raise StateCodecError("TRUNCATED")
+ header_bytes = data[FRAME_PREFIX_BYTES:FRAME_PREFIX_BYTES + header_len]
+ body = data[FRAME_PREFIX_BYTES + header_len:]
+ header = _parse_header(header_bytes)
+ lpk = _validate_header(kind, header)
+ if canonical_json(header) != header_bytes:
+ raise StateCodecError("NON_CANONICAL")
+ if kind is FrameKind.RETENTION_FLOOR:
+ if body:
+ raise StateCodecError("BODY")
+ if lpk.feed != "BAR":
+ raise StateCodecError("PRODUCT_MISMATCH", "feed")
+ return StateFrame(kind, lpk, header["materializer_epoch"], floor_open_time_ms=header["floor_open_time_ms"])
+ if not body:
+ raise StateCodecError("BODY")
+ if hashlib.sha256(body).hexdigest() != header["content_sha256"]:
+ raise StateCodecError("CONTENT_HASH")
+ source = legacy = None
+ if "source" in header:
+ item = header["source"]
+ source = SourceCoordinate(item["topic_id"], item["partition"], item["offset"])
+ if "legacy" in header:
+ item = header["legacy"]
+ legacy = LegacyLineage(item["spool_stream"], item["spool_partition_key"], item["spool_logical_offset"])
+ facts = _envelope_facts(kind, body, lpk)
+ for name in ("event_id", "open_time_ms", "revision", "is_final"):
+ if name in facts and header[name] != facts[name]:
+ raise StateCodecError("HEADER_MISMATCH", name)
+ return StateFrame(kind, lpk, header["materializer_epoch"], body, source=source, legacy=legacy, **facts)
+
+
+# ------------------------------------------------------------------ keys and partition
+
+def latest_key(lpk: LogicalProductKey) -> str:
+ return lpk.encode()
+
+
+def bar_key(lpk: LogicalProductKey, open_time_ms: int, is_final: bool, revision: int, content_sha256: str) -> str:
+ """``||p`` for the one in-progress row, else ``|f|`` per final fact."""
+
+ _integer(open_time_ms, 0, MAX_OFFSET, "open_time_ms")
+ if not is_final:
+ return f"{lpk.encode()}|{open_time_ms}|p"
+ _integer(revision, 0, MAX_REVISION, "revision")
+ if not isinstance(content_sha256, str) or not _HEX64.fullmatch(content_sha256):
+ raise StateCodecError("FIELD", "content_sha256")
+ return f"{lpk.encode()}|{open_time_ms}|f{revision}|{content_sha256[:16]}"
+
+
+def floor_key(lpk: LogicalProductKey) -> str:
+ return f"{lpk.encode()}|floor"
+
+
+def murmur2(data: bytes) -> int:
+ """Kafka ``org.apache.kafka.common.utils.Utils.murmur2`` as a signed 32-bit int."""
+
+ length = len(data)
+ h = (KAFKA_MURMUR2_SEED ^ length) & _U32
+ for index in range(length // 4):
+ k = int.from_bytes(data[4 * index:4 * index + 4], "little")
+ k = (k * _MURMUR2_M) & _U32
+ k ^= k >> 24
+ k = (k * _MURMUR2_M) & _U32
+ h = ((h * _MURMUR2_M) & _U32) ^ k
+ tail = length & ~3
+ remainder = length % 4
+ if remainder >= 3:
+ h ^= data[tail + 2] << 16
+ if remainder >= 2:
+ h ^= data[tail + 1] << 8
+ if remainder >= 1:
+ h ^= data[tail]
+ h = (h * _MURMUR2_M) & _U32
+ h ^= h >> 13
+ h = (h * _MURMUR2_M) & _U32
+ h ^= h >> 15
+ return h - (1 << 32) if h >= 1 << 31 else h
+
+
+def state_partition(lpk: LogicalProductKey, partitions: int) -> int:
+ """Kafka's default partitioner over the LPK bytes: one product, one partition."""
+
+ if not _is_integer(partitions) or not 1 <= partitions <= MAX_PARTITIONS:
+ raise StateCodecError("PARTITIONS")
+ return (murmur2(lpk.encode().encode("utf-8")) & 0x7FFFFFFF) % partitions
diff --git a/qdl/projection/state_contract.py b/qdl/projection/state_contract.py
new file mode 100644
index 00000000..c617476c
--- /dev/null
+++ b/qdl/projection/state_contract.py
@@ -0,0 +1,204 @@
+"""Kafka-native state contract (KN-1 K1.3), shared with the Rust projector.
+
+Frozen here, before any projector exists, so KN-3 implements rules rather than
+inventing them:
+
+* ``LogicalProductKey`` - product identity for latest/BAR state. It is not the
+ physical Kafka key: BOOK snapshot and delta share one physical partition to
+ keep order, but are distinct logical products (guide KD04).
+* ``SourceCoordinate`` vs ``ChangelogCoordinate`` - the canonical record a
+ state was derived from, versus where the derived state record itself sits.
+ Public cursors and watermarks only ever carry the source coordinate (KD08).
+* ``latest_apply_decision`` - stage-B idempotent apply for latest state:
+ offsets compare only inside one topic identity and physical partition.
+* ``bar_revision_decision`` - append-only BAR revision rules: a final bar is
+ never replaced by an in-progress update (invariant 27); an equal revision
+ with different content is a conflict, never last-write-wins (KD05).
+* ``cache_read_state`` - a cached product is served only from the published
+ ready generation of the market cache (guide 18.4.4).
+
+Every rule has golden vectors in ``contracts/golden/kn_v220/`` that the Rust
+implementation must reproduce.
+"""
+from __future__ import annotations
+
+from dataclasses import dataclass
+from enum import StrEnum
+import re
+
+LPK_VERSION = "lpk1"
+# Always ``fullmatch``: ``re.match`` with ``$`` also accepts a trailing "\n".
+_LPK_FIELD = re.compile(r"[A-Za-z0-9._:-]{1,96}")
+_HEX64 = re.compile(r"[0-9a-f]{64}")
+MAX_OFFSET = 2**63 - 1
+
+
+def _is_integer(value: object) -> bool:
+ """A JSON integer: ``bool`` is an ``int`` subclass and ``1.0`` is a float."""
+
+ return isinstance(value, int) and not isinstance(value, bool)
+
+
+@dataclass(frozen=True)
+class LogicalProductKey:
+ environment: str
+ venue: str
+ market: str
+ instrument_uid: str
+ feed: str
+ qualifier: str = "-"
+
+ def __post_init__(self) -> None:
+ for name in ("environment", "venue", "market", "instrument_uid", "feed", "qualifier"):
+ value = getattr(self, name)
+ if not isinstance(value, str) or not _LPK_FIELD.fullmatch(value):
+ raise ValueError(f"logical product key field is invalid: {name}")
+ if self.venue != self.venue.upper() or self.market != self.market.upper() or self.feed != self.feed.upper():
+ raise ValueError("venue, market and feed are upper-case enum names")
+
+ @classmethod
+ def for_product(
+ cls, *, environment: str, venue: str, market: str, instrument_uid: str,
+ feed: str, interval: str | None,
+ ) -> "LogicalProductKey":
+ return cls(environment, venue, market, instrument_uid, feed, interval or "-")
+
+ def encode(self) -> str:
+ return "|".join((LPK_VERSION, self.environment, self.venue, self.market,
+ self.instrument_uid, self.feed, self.qualifier))
+
+ @classmethod
+ def parse(cls, value: str) -> "LogicalProductKey":
+ parts = value.split("|")
+ if len(parts) != 7 or parts[0] != LPK_VERSION:
+ raise ValueError("unsupported logical product key")
+ key = cls(*parts[1:])
+ if key.encode() != value:
+ raise ValueError("logical product key is not canonical")
+ return key
+
+
+@dataclass(frozen=True)
+class SourceCoordinate:
+ """The committed canonical record a state was derived from."""
+
+ topic_id: str
+ partition: int
+ offset: int
+
+ def __post_init__(self) -> None:
+ if (not isinstance(self.topic_id, str) or not self.topic_id
+ or not _is_integer(self.partition) or not _is_integer(self.offset)):
+ raise ValueError("source coordinate field has the wrong type")
+ if not 0 <= self.partition < 1 << 31 or not 0 <= self.offset <= MAX_OFFSET:
+ raise ValueError("source coordinate is out of range")
+
+
+@dataclass(frozen=True)
+class ChangelogCoordinate:
+ """Where a derived state record sits; delivery metadata, never a cursor."""
+
+ topic: str
+ partition: int
+ offset: int
+ materializer_epoch: int
+
+ def __post_init__(self) -> None:
+ if (not isinstance(self.topic, str) or not self.topic
+ or not all(_is_integer(item) for item in (self.partition, self.offset, self.materializer_epoch))):
+ raise ValueError("changelog coordinate field has the wrong type")
+ if (not 0 <= self.partition < 1 << 31
+ or not 0 <= self.offset <= MAX_OFFSET or self.materializer_epoch < 1):
+ raise ValueError("changelog coordinate is out of range")
+
+
+class ApplyDecision(StrEnum):
+ APPLY = "APPLY"
+ DUPLICATE = "DUPLICATE"
+ STALE = "STALE"
+ NOT_COMPARABLE = "NOT_COMPARABLE"
+ STALE_IN_PROGRESS = "STALE_IN_PROGRESS"
+ STALE_REVISION = "STALE_REVISION"
+ CONFLICT = "CONFLICT"
+
+
+def latest_apply_decision(current: SourceCoordinate | None, incoming: SourceCoordinate) -> ApplyDecision:
+ """Stage-B compare for a latest-state product.
+
+ Offsets are comparable only within one topic identity and partition. A
+ different topic identity (topic recreated) or partition (new plan) is a
+ generation change that the sink fence must resolve; it is never ordered by
+ comparing raw numbers.
+ """
+
+ if current is None:
+ return ApplyDecision.APPLY
+ if (current.topic_id, current.partition) != (incoming.topic_id, incoming.partition):
+ return ApplyDecision.NOT_COMPARABLE
+ if incoming.offset > current.offset:
+ return ApplyDecision.APPLY
+ if incoming.offset == current.offset:
+ return ApplyDecision.DUPLICATE
+ return ApplyDecision.STALE
+
+
+@dataclass(frozen=True)
+class BarState:
+ is_final: bool
+ revision: int
+ content_sha256: str
+ source: SourceCoordinate
+
+ def __post_init__(self) -> None:
+ if (not isinstance(self.is_final, bool) or not _is_integer(self.revision)
+ or not isinstance(self.content_sha256, str) or not isinstance(self.source, SourceCoordinate)):
+ raise ValueError("bar state field has the wrong type")
+ if not 0 <= self.revision < 1 << 32:
+ raise ValueError("bar revision is a uint32")
+ if not _HEX64.fullmatch(self.content_sha256):
+ raise ValueError("bar content hash must be lowercase SHA-256")
+
+
+def bar_revision_decision(current: BarState | None, incoming: BarState) -> ApplyDecision:
+ """Decide one incoming bar against the current row at the same open time."""
+
+ if current is None:
+ return ApplyDecision.APPLY
+ if current.is_final and not incoming.is_final:
+ return ApplyDecision.STALE_IN_PROGRESS
+ if not current.is_final and incoming.is_final:
+ return ApplyDecision.APPLY
+ if not current.is_final:
+ # Two in-progress updates: canonical order decides, within one partition.
+ return latest_apply_decision(current.source, incoming.source)
+ if incoming.revision > current.revision:
+ return ApplyDecision.APPLY
+ if incoming.revision < current.revision:
+ return ApplyDecision.STALE_REVISION
+ if incoming.content_sha256 == current.content_sha256:
+ return ApplyDecision.DUPLICATE
+ return ApplyDecision.CONFLICT
+
+
+class CacheReadState(StrEnum):
+ READY = "READY"
+ NOT_READY_NO_GENERATION = "NOT_READY_NO_GENERATION"
+ NOT_READY_MISSING = "NOT_READY_MISSING"
+ NOT_READY_OTHER_GENERATION = "NOT_READY_OTHER_GENERATION"
+
+
+def cache_read_state(ready_generation: int | None, entry_generation: int | None) -> CacheReadState:
+ """A product is served only from the published ready cache generation.
+
+ A staging rebuild writes a new generation beside the old one and publishes
+ it atomically; an entry from any other generation is not served, and a
+ missing entry is typed NOT_READY rather than a default value.
+ """
+
+ if ready_generation is None:
+ return CacheReadState.NOT_READY_NO_GENERATION
+ if entry_generation is None:
+ return CacheReadState.NOT_READY_MISSING
+ if entry_generation != ready_generation:
+ return CacheReadState.NOT_READY_OTHER_GENERATION
+ return CacheReadState.READY
diff --git a/qdl/query/cold_work.py b/qdl/query/cold_work.py
new file mode 100644
index 00000000..db02fa4b
--- /dev/null
+++ b/qdl/query/cold_work.py
@@ -0,0 +1,117 @@
+"""Cooperative duty cycle for CPU-bound cold reads inside one Query process.
+
+A 5,000-row warmup keeps a worker thread CPU-bound for seconds. Python's GIL
+then hands the event loop at most one slice per switch interval, and a hot HTTP
+request needs many: measured live on 2026-09-23 (v2.1.1 Phase-3), QUOTE
+snapshots on the same replica went from p50 9.5 ms to p50 156 ms / max 1.44 s
+during one 4.1 s cold warmup, with no disk read and no CPU throttling.
+
+A thread that marks itself cold sleeps briefly after every slice of work, which
+actually releases the GIL for that window. Hot threads never mark themselves,
+so they never pause; a cold read that finishes within one slice never pauses.
+
+Cancellation (KN-4 K4.2/K4-T06): a thread cannot be interrupted, so a caller
+whose request was cancelled or timed out must not release its admission
+permit while the worker still runs. ``await_in_thread`` keeps the awaiting
+task until the worker has returned, and asks a cold worker to stop at its
+next ``cold_yield`` (``ColdWorkCancelled``) so the wait is one slice long.
+"""
+
+from __future__ import annotations
+
+import asyncio
+from contextlib import contextmanager
+from functools import partial
+import threading
+import time
+
+COLD_SLICE_SECONDS = 0.004
+COLD_PAUSE_SECONDS = 0.002
+
+_state = threading.local()
+
+
+class ColdWorkCancelled(BaseException):
+ """The request that owns this cold work was cancelled; stop now.
+
+ A ``BaseException`` like ``asyncio.CancelledError``: per-item ``except
+ Exception`` outcomes inside a batch must not turn it into an item error
+ and keep working."""
+
+
+@contextmanager
+def cold_work():
+ """Mark the current thread as doing cold work for the duration."""
+
+ previous = getattr(_state, "since", None)
+ _state.since = time.perf_counter()
+ try:
+ yield
+ finally:
+ _state.since = previous
+
+
+def cold_yield() -> None:
+ """Pause briefly if this cold thread has worked a whole slice; else no-op."""
+
+ since = getattr(_state, "since", None)
+ if since is None:
+ return
+ cancelled = getattr(_state, "cancelled", None)
+ if cancelled is not None and cancelled.is_set():
+ raise ColdWorkCancelled("the request that owns this cold work was cancelled")
+ now = time.perf_counter()
+ if now - since >= COLD_SLICE_SECONDS:
+ time.sleep(COLD_PAUSE_SECONDS)
+ _state.since = time.perf_counter()
+
+
+def run_cold(work, /, *args, **kwargs):
+ """Run ``work`` with this thread marked cold (for executor submission)."""
+
+ with cold_work():
+ return work(*args, **kwargs)
+
+
+def _run_cancellable(cancelled: threading.Event, cold: bool, work, /, *args, **kwargs):
+ previous = getattr(_state, "cancelled", None)
+ _state.cancelled = cancelled
+ try:
+ if cold:
+ with cold_work():
+ return work(*args, **kwargs)
+ return work(*args, **kwargs)
+ finally:
+ _state.cancelled = previous
+
+
+async def await_in_thread(executor, work, /, *args, cold: bool = False, on_cancel=None, **kwargs):
+ """Run ``work`` on ``executor`` and hold the caller until it has returned.
+
+ On cancellation the worker is asked to stop (a cold worker raises at its
+ next ``cold_yield``; ``on_cancel`` signals a worker that polls its own
+ flag, such as the bounded gap scan); the caller waits for the thread to
+ finish before the cancellation propagates, so every permit or lease the
+ caller holds stays held while the thread runs. A second cancellation
+ during that wait does not abandon the thread either.
+ """
+
+ loop = asyncio.get_running_loop()
+ cancelled = threading.Event()
+ future = loop.run_in_executor(
+ executor, partial(_run_cancellable, cancelled, cold, work, *args, **kwargs)
+ )
+ try:
+ return await asyncio.shield(future)
+ except asyncio.CancelledError:
+ cancelled.set()
+ if on_cancel is not None:
+ on_cancel()
+ while not future.done():
+ try:
+ await asyncio.wait({future})
+ except asyncio.CancelledError:
+ continue
+ if not future.cancelled():
+ future.exception() # retrieved: the request is gone, its error with it
+ raise
diff --git a/qdl/query/lanes.py b/qdl/query/lanes.py
new file mode 100644
index 00000000..16c779d7
--- /dev/null
+++ b/qdl/query/lanes.py
@@ -0,0 +1,316 @@
+"""Bounded, fair request admission for Query read-plane work.
+
+The data plane has materially different work classes: a latest snapshot is a
+small cache read, while a warmup can retain and decode thousands of bars. A
+single process-wide executor makes those classes contend invisibly. This
+module keeps the admission boundary explicit without changing any public V2
+endpoint, provider quota, or quality decision.
+"""
+
+from __future__ import annotations
+
+import asyncio
+from dataclasses import dataclass
+from typing import Awaitable, Callable, TypeVar
+
+
+T = TypeVar("T")
+
+
+class ReadLaneRejected(RuntimeError):
+ """A finite in-process read lane cannot accept more work."""
+
+
+@dataclass(frozen=True, slots=True)
+class ReadLanePolicy:
+ """One bounded fair lane with an optional reserved consumer share."""
+
+ max_active: int
+ max_pending: int
+ max_pending_bytes: int
+ max_active_per_consumer: int = 1
+ max_pending_per_consumer: int = 2
+ reserved_consumer_id: str | None = None
+ reserved_slots: int = 0
+ reserved_max_active_per_consumer: int | None = None
+ reserved_max_pending_per_consumer: int | None = None
+ reserved_pending_slots: int = 0
+ non_reserved_pending_slots: int = 0
+
+ def __post_init__(self) -> None:
+ if not 1 <= self.max_active <= 64:
+ raise ValueError("read lane max_active must be between 1 and 64")
+ if not self.max_active <= self.max_pending <= 8_192:
+ raise ValueError("read lane max_pending must include active work")
+ if self.max_pending_bytes < 1:
+ raise ValueError("read lane max_pending_bytes must be positive")
+ if not 1 <= self.max_active_per_consumer <= self.max_active:
+ raise ValueError("read lane per-consumer active bound is invalid")
+ if not self.max_active_per_consumer <= self.max_pending_per_consumer <= self.max_pending:
+ raise ValueError("read lane per-consumer pending bound is invalid")
+ if not 0 <= self.reserved_slots < self.max_active:
+ raise ValueError("read lane reserved slots must leave one general slot")
+ if self.reserved_slots and not self.reserved_consumer_id:
+ raise ValueError("read lane reserved slots require a consumer identity")
+ if self.reserved_max_active_per_consumer is not None:
+ if not self.reserved_consumer_id:
+ raise ValueError("reserved consumer active bound requires a consumer identity")
+ if not self.max_active_per_consumer <= self.reserved_max_active_per_consumer <= self.max_active:
+ raise ValueError("reserved consumer active bound is invalid")
+ if self.reserved_max_pending_per_consumer is not None:
+ if not self.reserved_consumer_id:
+ raise ValueError("reserved consumer pending bound requires a consumer identity")
+ if not self.max_active <= self.reserved_max_pending_per_consumer <= self.max_pending:
+ raise ValueError("reserved consumer pending bound is invalid")
+ if not 0 <= self.reserved_pending_slots < self.max_pending:
+ raise ValueError("reserved consumer pending reserve is invalid")
+ if not 0 <= self.non_reserved_pending_slots < self.max_pending:
+ raise ValueError("non-reserved consumer pending reserve is invalid")
+ if (
+ self.reserved_pending_slots or self.non_reserved_pending_slots
+ ) and not self.reserved_consumer_id:
+ raise ValueError("pending reserves require a consumer identity")
+
+
+@dataclass(slots=True)
+class _Entry:
+ consumer_id: str
+ reserved_bytes: int
+ sequence: int
+
+
+class BoundedReadLane:
+ """FIFO-by-consumer admission with finite request and byte reservations.
+
+ A waiting Trading System request receives its reserved share before another
+ alpha can consume the final general slot. The reservation is demand-driven:
+ idle capacity remains available to ordinary consumers. Within a consumer,
+ only its oldest queued task may run; a single identity cannot fill every
+ active slot while another identity waits.
+ """
+
+ def __init__(self, policy: ReadLanePolicy) -> None:
+ self.policy = policy
+ self._condition = asyncio.Condition()
+ self._waiting: list[_Entry] = []
+ self._active = 0
+ self._active_by_consumer: dict[str, int] = {}
+ self._pending_by_consumer: dict[str, int] = {}
+ self._pending_bytes = 0
+ self._sequence = 0
+ self._admitted = 0
+ self._rejected = 0
+ self._rejected_bytes = 0
+ self._queue_wait_timeouts = 0
+
+ async def run(
+ self,
+ work: Callable[[], Awaitable[T]],
+ *,
+ consumer_id: str,
+ reserved_bytes: int,
+ wait_timeout_ms: int | None = None,
+ ) -> T:
+ if not consumer_id.strip():
+ raise ValueError("read lane consumer_id is required")
+ if reserved_bytes < 1:
+ raise ValueError("read lane reserved_bytes must be positive")
+ if wait_timeout_ms is not None and wait_timeout_ms < 1:
+ raise ValueError("read lane wait timeout must be positive")
+
+ loop = asyncio.get_running_loop()
+ entry: _Entry | None = None
+ active = False
+ async with self._condition:
+ self._reject_if_unadmittable(consumer_id, reserved_bytes)
+ entry = _Entry(consumer_id, reserved_bytes, self._sequence)
+ self._sequence += 1
+ self._waiting.append(entry)
+ self._pending_by_consumer[consumer_id] = (
+ self._pending_by_consumer.get(consumer_id, 0) + 1
+ )
+ self._pending_bytes += reserved_bytes
+ self._condition.notify_all()
+ deadline = (
+ loop.time() + wait_timeout_ms / 1_000
+ if wait_timeout_ms is not None
+ else None
+ )
+ try:
+ while not self._can_start(entry):
+ if deadline is None:
+ await self._condition.wait()
+ continue
+ remaining = deadline - loop.time()
+ if remaining <= 0:
+ self._queue_wait_timeouts += 1
+ raise ReadLaneRejected(
+ "read lane admission wait exceeded the declared deadline"
+ )
+ try:
+ await asyncio.wait_for(self._condition.wait(), timeout=remaining)
+ except asyncio.TimeoutError as error:
+ self._queue_wait_timeouts += 1
+ raise ReadLaneRejected(
+ "read lane admission wait exceeded the declared deadline"
+ ) from error
+ self._waiting.remove(entry)
+ self._active += 1
+ self._active_by_consumer[consumer_id] = (
+ self._active_by_consumer.get(consumer_id, 0) + 1
+ )
+ self._admitted += 1
+ active = True
+ self._condition.notify_all()
+ except BaseException:
+ if entry in self._waiting:
+ self._waiting.remove(entry)
+ self._withdraw(entry)
+ self._condition.notify_all()
+ raise
+
+ try:
+ return await work()
+ finally:
+ if active:
+ async with self._condition:
+ self._active -= 1
+ active_for_consumer = self._active_by_consumer[consumer_id] - 1
+ if active_for_consumer:
+ self._active_by_consumer[consumer_id] = active_for_consumer
+ else:
+ self._active_by_consumer.pop(consumer_id, None)
+ self._withdraw(entry)
+ self._condition.notify_all()
+
+ def stats(self) -> dict[str, int]:
+ reserved = self.policy.reserved_consumer_id
+ return {
+ "active": self._active,
+ "pending": sum(self._pending_by_consumer.values()),
+ "pending_bytes": self._pending_bytes,
+ "active_reserved": self._active_by_consumer.get(reserved or "", 0),
+ "pending_reserved": self._pending_by_consumer.get(reserved or "", 0),
+ "admitted": self._admitted,
+ "rejected": self._rejected,
+ "rejected_bytes": self._rejected_bytes,
+ "queue_wait_timeouts": self._queue_wait_timeouts,
+ }
+
+ def _reject_if_unadmittable(self, consumer_id: str, reserved_bytes: int) -> None:
+ pending = sum(self._pending_by_consumer.values())
+ if reserved_bytes > self.policy.max_pending_bytes:
+ self._rejected += 1
+ self._rejected_bytes += 1
+ raise ReadLaneRejected("read lane request exceeds its byte reservation budget")
+ if pending >= self._class_pending_limit(consumer_id):
+ self._rejected += 1
+ raise ReadLaneRejected("read lane retains finite capacity for another consumer class")
+ if self._pending_bytes + reserved_bytes > self.policy.max_pending_bytes:
+ self._rejected += 1
+ self._rejected_bytes += 1
+ raise ReadLaneRejected("read lane is at byte reservation capacity")
+ if (
+ self._pending_by_consumer.get(consumer_id, 0)
+ >= self._consumer_pending_limit(consumer_id)
+ ):
+ self._rejected += 1
+ raise ReadLaneRejected("read lane consumer is at its finite pending bound")
+
+ def _consumer_pending_limit(self, consumer_id: str) -> int:
+ if (
+ consumer_id == self.policy.reserved_consumer_id
+ and self.policy.reserved_max_pending_per_consumer is not None
+ ):
+ return self.policy.reserved_max_pending_per_consumer
+ return self.policy.max_pending_per_consumer
+
+ def _class_pending_limit(self, consumer_id: str) -> int:
+ """Keep one bounded queue slot for the absent consumer class.
+
+ A critical identity can use idle capacity until an ordinary identity is
+ present, but it cannot fill the whole finite queue and make a new alpha
+ request unadmittable. The reciprocal reserve gives a later TS request a
+ bounded entry point when only alphas have work. Once both classes have
+ queued work, all declared capacity is usable and FIFO fairness decides
+ service order.
+ """
+
+ reserved = self.policy.reserved_consumer_id
+ if reserved is None:
+ return self.policy.max_pending
+ has_reserved = bool(self._pending_by_consumer.get(reserved, 0))
+ has_non_reserved = any(
+ identity != reserved and pending
+ for identity, pending in self._pending_by_consumer.items()
+ )
+ if consumer_id == reserved and not has_non_reserved:
+ return self.policy.max_pending - self.policy.non_reserved_pending_slots
+ if consumer_id != reserved and not has_reserved:
+ return self.policy.max_pending - self.policy.reserved_pending_slots
+ return self.policy.max_pending
+
+ def _withdraw(self, entry: _Entry) -> None:
+ current = self._pending_by_consumer[entry.consumer_id] - 1
+ if current:
+ self._pending_by_consumer[entry.consumer_id] = current
+ else:
+ self._pending_by_consumer.pop(entry.consumer_id, None)
+ self._pending_bytes -= entry.reserved_bytes
+
+ def _can_start(self, entry: _Entry) -> bool:
+ if self._active >= self.policy.max_active:
+ return False
+ heads: dict[str, _Entry] = {}
+ for queued in self._waiting:
+ heads.setdefault(queued.consumer_id, queued)
+ if heads.get(entry.consumer_id) is not entry:
+ return False
+ reserved = self.policy.reserved_consumer_id
+ reserved_head = heads.get(reserved) if reserved else None
+ reserved_can_start = (
+ reserved_head is not None
+ and self._can_start_without_reservation(reserved_head, heads)
+ )
+ if (
+ entry.consumer_id != reserved
+ and reserved_can_start
+ and self._non_reserved_active() >= self.policy.max_active - self.policy.reserved_slots
+ ):
+ return False
+
+ if reserved_can_start:
+ return entry is reserved_head
+
+ eligible = [
+ head
+ for head in heads.values()
+ if self._can_start_without_reservation(head, heads)
+ ]
+ if not eligible:
+ return False
+ return entry is min(eligible, key=lambda candidate: candidate.sequence)
+
+ def _can_start_without_reservation(
+ self, entry: _Entry, heads: dict[str, _Entry]
+ ) -> bool:
+ if self._active >= self.policy.max_active:
+ return False
+ active_for_consumer = self._active_by_consumer.get(entry.consumer_id, 0)
+ if active_for_consumer < self.policy.max_active_per_consumer:
+ return True
+ # Only the explicitly reserved critical identity may borrow an idle
+ # worker. Generic identities retain the hard fair-share cap even when
+ # they arrive one event-loop turn before a peer, avoiding a race where
+ # a bursty alpha could acquire every active worker ahead of another.
+ borrowed_limit = self.policy.reserved_max_active_per_consumer
+ return (
+ entry.consumer_id == self.policy.reserved_consumer_id
+ and borrowed_limit is not None
+ and len(heads) == 1
+ and active_for_consumer < borrowed_limit
+ )
+
+ def _non_reserved_active(self) -> int:
+ reserved = self.policy.reserved_consumer_id
+ return self._active - self._active_by_consumer.get(reserved or "", 0)
diff --git a/qdl/query/results.py b/qdl/query/results.py
index b64f6345..0f02efb1 100644
--- a/qdl/query/results.py
+++ b/qdl/query/results.py
@@ -1,10 +1,11 @@
from __future__ import annotations
-from dataclasses import dataclass
+from dataclasses import dataclass, field
from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable
from qdl.domain.instrument import InstrumentRecord, InstrumentRegistry
from qdl.query.contracts import (
+ CanonicalErrorCode,
CoverageStatus,
DataRequirement,
FeedType,
@@ -138,6 +139,10 @@ class MarketDataItem:
supersedes_event_id: str | None = None
received_at_ns: int | None = None
resample_lineage: "ResampleLineage | None" = None
+ # Internal only, never rendered: identifies immutable row content (binding
+ # + canonical hash) so a renderer may reuse the validated static views of
+ # the same row (KN-4 D30). Quality, cursor and watermark never enter it.
+ render_key: str | None = field(default=None, compare=False, repr=False)
def __post_init__(self) -> None:
if not self.instrument_uid.strip() or not self.instrument_id.strip():
@@ -235,6 +240,30 @@ def __post_init__(self) -> None:
raise ValueError("gap detection time must be positive")
+class GapScanResult(tuple):
+ """Tuple-compatible retained-window scan plus explicit product coverage.
+
+ Completeness here means a servable view was inspected, NOT that listing-to-
+ now history is complete. Readiness/history remain the boundary authorities.
+ """
+
+ def __new__(cls, gaps, coverage):
+ obj = super().__new__(cls, gaps)
+ obj.coverage = tuple(coverage)
+ return obj
+
+ @property
+ def unavailable(self):
+ return tuple(c for c in self.coverage if c["state"] not in {"SCANNED", "EXCLUDED"})
+
+ def coverage_document(self):
+ return {"scope": "RETAINED_WINDOW", "scan_complete": True,
+ "materialization_complete": not self.unavailable,
+ "history_complete": None,
+ "leading_coverage": "NOT_ASSESSED", "trailing_coverage": "NOT_ASSESSED",
+ "products": list(self.coverage)}
+
+
class MemoryMarketDataBackend:
"""Deterministic shadow/test backend; production adapters implement the protocol."""
@@ -272,6 +301,16 @@ def put_gap(self, gap: GapRecord) -> None:
def open_gaps(self) -> tuple[GapRecord, ...]:
return tuple(sorted(self._gaps, key=lambda item: (item.detected_at_ns, item.gap_id)))
+ def open_gaps_bounded(self, *, cancelled=None) -> tuple[GapRecord, ...]:
+ if cancelled is not None and cancelled():
+ raise QueryBackendError(QueryProblem(
+ CanonicalErrorCode.PARTIAL_RESULT,
+ "global gap diagnostic was cancelled",
+ True,
+ retry_after_ms=1_000,
+ ))
+ return self.open_gaps()
+
@dataclass(frozen=True)
class InstrumentPage:
diff --git a/qdl/query/row_cache.py b/qdl/query/row_cache.py
new file mode 100644
index 00000000..4c584fd4
--- /dev/null
+++ b/qdl/query/row_cache.py
@@ -0,0 +1,64 @@
+"""Bounded, thread-safe LRU for values derived from immutable rows (KN-4 D30).
+
+Purpose: a Query replica derives the same projection of a market-cache row
+(decoded envelope, lineage verdict, item fields, validated public views) for
+every consumer that reads it. Those derivations depend only on the row's
+content and the process's catalog, so they are cached here under a content
+key (binding + canonical SHA-256). Anything that depends on time or on the
+request - quality, freshness, eligibility, cursor, watermark - is never
+stored: the callers rebuild it per request.
+
+Boundary: entries are bounded by count (``max_entries``); the oldest are
+evicted first; counters are exported for measurement. No I/O.
+"""
+from __future__ import annotations
+
+from collections import OrderedDict
+import threading
+from typing import Any, Hashable
+
+ROW_CACHE_ENTRIES_ENV = "QDL_KN_ROW_CACHE_ENTRIES"
+
+
+class BoundedRowCache:
+ def __init__(self, max_entries: int) -> None:
+ if max_entries < 0:
+ raise ValueError("row cache size cannot be negative")
+ self.max_entries = max_entries
+ self._entries: OrderedDict[Hashable, Any] = OrderedDict()
+ self._lock = threading.Lock()
+ self.hits = 0
+ self.misses = 0
+ self.evictions = 0
+
+ def get(self, key: Hashable) -> Any | None:
+ if self.max_entries == 0:
+ return None
+ with self._lock:
+ value = self._entries.get(key)
+ if value is None:
+ self.misses += 1
+ return None
+ self._entries.move_to_end(key)
+ self.hits += 1
+ return value
+
+ def put(self, key: Hashable, value: Any) -> None:
+ if self.max_entries == 0:
+ return
+ with self._lock:
+ self._entries[key] = value
+ self._entries.move_to_end(key)
+ while len(self._entries) > self.max_entries:
+ self._entries.popitem(last=False)
+ self.evictions += 1
+
+ def stats(self) -> dict[str, int]:
+ with self._lock:
+ return {
+ "entries": len(self._entries),
+ "max_entries": self.max_entries,
+ "hits": self.hits,
+ "misses": self.misses,
+ "evictions": self.evictions,
+ }
diff --git a/qdl/query/service.py b/qdl/query/service.py
index 3fa03a88..1ce21f8f 100644
--- a/qdl/query/service.py
+++ b/qdl/query/service.py
@@ -2,10 +2,12 @@
import asyncio
import math
+import threading
import uuid
import time
+from concurrent.futures import ThreadPoolExecutor
from dataclasses import dataclass, replace
-from typing import Awaitable, Callable, TypeVar
+from typing import Any, Awaitable, Callable, TypeVar
from qdl.adapters.intervals import canonical_interval_ms
from qdl.data_quality.binding_decision import freshness_verdict
@@ -30,12 +32,15 @@
evaluate_requirement,
)
from qdl.query.lifecycle import BarLifecycle
+from qdl.query.cold_work import await_in_thread, cold_yield
+from qdl.query.lanes import BoundedReadLane, ReadLanePolicy, ReadLaneRejected
from qdl.query.entitlement import AccessPurpose, DataProduct, EntitlementPolicy
from qdl.query.reference import (
ReferenceBatchRequirement,
ReferenceDataRequirement,
)
from qdl.query.results import (
+ GapRecord,
HistoryResult,
InstrumentPage,
InstrumentQuery,
@@ -92,12 +97,14 @@ def __init__(
request_id: str,
instrument_uid: str | None = None,
quality_state: str | None = None,
+ diagnostics: dict[str, Any] | None = None,
) -> None:
super().__init__(problem.detail)
self.problem = problem
self.request_id = request_id
self.instrument_uid = instrument_uid
self.quality_state = quality_state
+ self.diagnostics = diagnostics
@dataclass(frozen=True)
@@ -179,10 +186,132 @@ class ReadinessResult:
results: tuple[ReadinessItemResult, ...]
-class _LocalBatchAdmissionRejected(RuntimeError):
+_TS_RESERVED_CONSUMER_ID = "trading-system.paper.stable"
+_HOT_SNAPSHOT_RESERVED_BYTES = 16 * 1024
+_HOT_REFERENCE_RESERVED_BYTES = 16 * 1024
+_LOCAL_HISTORY_BYTES_PER_ROW = 1024
+_LOCAL_HISTORY_BASE_BYTES = 16 * 1024
+
+
+def _hot_snapshot_lane_policy() -> ReadLanePolicy:
+ """Finite latest/status capacity sized for the current TS hot slice set.
+
+ One identity may queue a fleet-sized burst (KN-4 K4.2). An alpha identity
+ fronts every session of its runtime (up to its manifest's 60 streams), and
+ those sessions read snapshots together at a bar close. With four queued
+ requests per identity the fifth concurrent read of one identity on a
+ replica was refused ``RATE_LIMITED`` although the lane was idle a moment
+ later (``Phase5ApiReplicaLoadTests``, first bad ``13b3594``). Queued reads
+ still run one at a time per identity (``max_active_per_consumer``), wait
+ at most their request deadline, stay inside 1 MiB of reservations, and
+ the Trading System keeps its active and pending reserves.
+ """
+
+ return ReadLanePolicy(
+ max_active=2,
+ max_pending=64,
+ max_pending_bytes=64 * _HOT_SNAPSHOT_RESERVED_BYTES,
+ max_active_per_consumer=1,
+ max_pending_per_consumer=32,
+ reserved_consumer_id=_TS_RESERVED_CONSUMER_ID,
+ reserved_slots=1,
+ reserved_max_active_per_consumer=2,
+ reserved_max_pending_per_consumer=15,
+ reserved_pending_slots=1,
+ non_reserved_pending_slots=1,
+ )
+
+
+def _hot_reference_lane_policy() -> ReadLanePolicy:
+ """Finite execution-reference capacity without changing provider quotas."""
+
+ return ReadLanePolicy(
+ max_active=4,
+ max_pending=32,
+ max_pending_bytes=1024 * 1024,
+ max_active_per_consumer=2,
+ max_pending_per_consumer=8,
+ reserved_consumer_id=_TS_RESERVED_CONSUMER_ID,
+ reserved_slots=1,
+ reserved_max_active_per_consumer=4,
+ reserved_max_pending_per_consumer=31,
+ reserved_pending_slots=1,
+ non_reserved_pending_slots=1,
+ )
+
+
+class _LocalBatchAdmissionRejected(ReadLaneRejected):
"""A bounded canonical-cache batch lane cannot accept more queued work."""
+_SMALL_LOCAL_WARMUP_ROWS = 2
+
+
+def _small_local_warmup_lane_policy() -> ReadLanePolicy:
+ """Finite lane for warmups of at most two rows, shaped like the hot lanes.
+
+ A stream handoff or latest-style warmup reads one or two rows through the
+ exact final-BAR index or a one-row tail - snapshot-sized work. In the
+ single-active local batch lane it waited behind 2,500/5,000-row warmups
+ that take seconds: on 2026-09-23 (v2.1.1 Phase-3 stage 20) alpha stream
+ handoffs were refused ``RATE_LIMITED`` and TS slices stayed unready while
+ alpha sessions warmed. Large warmups keep the single-active lane.
+ """
+
+ return ReadLanePolicy(
+ max_active=2,
+ max_pending=16,
+ max_pending_bytes=512 * 1024,
+ max_active_per_consumer=1,
+ max_pending_per_consumer=4,
+ reserved_consumer_id=_TS_RESERVED_CONSUMER_ID,
+ reserved_slots=1,
+ reserved_max_active_per_consumer=2,
+ reserved_max_pending_per_consumer=15,
+ reserved_pending_slots=1,
+ non_reserved_pending_slots=1,
+ )
+
+
+_QUEUED_LOCAL_BATCH_MAX_WAIT_MS = 8_000
+
+
+def _queued_local_batch_lane_policy() -> ReadLanePolicy:
+ """The single-active large-warmup lane with a bounded queue per identity.
+
+ The default admits one pending batch per consumer and refuses the next at
+ once. Many alpha sessions share one platform identity, so a fleet cold
+ start became immediate ``RATE_LIMITED`` refusals: on 2026-09-23 (v2.1.1
+ Phase-3) 5 of 35 and 13 of 50 sessions never started. Queuing keeps one
+ active materialization per replica - the memory bound - while each waiter
+ is still limited by its own request deadline and by 64 MiB of reserved
+ rows (about twelve 5,000-row warmups), with queue slots kept for TS.
+ """
+
+ return ReadLanePolicy(
+ max_active=1,
+ max_pending=16,
+ max_pending_bytes=64 * 1024 * 1024,
+ max_active_per_consumer=1,
+ max_pending_per_consumer=8,
+ reserved_consumer_id=_TS_RESERVED_CONSUMER_ID,
+ reserved_slots=0,
+ reserved_max_pending_per_consumer=8,
+ reserved_pending_slots=2,
+ non_reserved_pending_slots=1,
+ )
+
+
+def _is_small_local_warmup(requirement: DataRequirement) -> bool:
+ specification = requirement.warmup_specification
+ if specification is None:
+ return True
+ return (
+ specification.rows is not None
+ and specification.rows <= _SMALL_LOCAL_WARMUP_ROWS
+ )
+
+
class _LocalBatchAdmission:
"""Serialize expensive local history snapshots without touching venue policy.
@@ -196,63 +325,94 @@ class _LocalBatchAdmission:
declared work deadline; it is never provider pacing.
"""
- def __init__(self, *, max_active: int = 1, max_pending: int = 5) -> None:
- if max_active != 1:
- raise ValueError("local canonical batch admission currently requires one active lane")
- if max_pending < max_active:
- raise ValueError("local canonical batch pending bound must include active work")
- self._gate = asyncio.Semaphore(max_active)
- self._lock = asyncio.Lock()
- self._max_pending = max_pending
- self._pending = 0
- self._active = 0
- self._admitted = 0
- self._rejected = 0
- self._queue_wait_timeouts = 0
-
- async def run(self, work, *, wait_timeout_ms: int | None = None):
- if wait_timeout_ms is not None and wait_timeout_ms < 1:
- raise ValueError("local canonical batch admission wait must be positive")
- async with self._lock:
- if self._pending >= self._max_pending:
- self._rejected += 1
- raise _LocalBatchAdmissionRejected(
- "local canonical-cache batch admission is at capacity"
- )
- self._pending += 1
- acquired = False
+ def __init__(
+ self,
+ *,
+ max_active: int = 1,
+ max_pending: int = 5,
+ max_pending_bytes: int = 64 * 1024 * 1024,
+ reserved_consumer_id: str | None = _TS_RESERVED_CONSUMER_ID,
+ policy: ReadLanePolicy | None = None,
+ ) -> None:
+ if policy is None:
+ if max_active != 1:
+ raise ValueError("local canonical batch admission currently requires one active lane")
+ if max_pending < max_active:
+ raise ValueError("local canonical batch pending bound must include active work")
+ policy = ReadLanePolicy(
+ max_active=max_active,
+ max_pending=max_pending,
+ max_pending_bytes=max_pending_bytes,
+ max_active_per_consumer=1,
+ max_pending_per_consumer=1,
+ reserved_consumer_id=reserved_consumer_id,
+ reserved_slots=0,
+ )
+ self._lane = BoundedReadLane(policy)
+ self._anonymous_sequence = 0
+
+ async def run(
+ self,
+ work,
+ *,
+ consumer_id: str | None = None,
+ reserved_bytes: int = _LOCAL_HISTORY_BASE_BYTES,
+ wait_timeout_ms: int | None = None,
+ ):
+ if consumer_id is None:
+ # Focused legacy callers did not carry an authenticated consumer
+ # identity. Preserve their old global-only behavior without
+ # weakening the real router path, which always supplies one.
+ self._anonymous_sequence += 1
+ consumer_id = f"qdl.v2.legacy.{self._anonymous_sequence}"
try:
- try:
- if wait_timeout_ms is None:
- await self._gate.acquire()
- else:
- await asyncio.wait_for(
- self._gate.acquire(), timeout=wait_timeout_ms / 1_000
- )
- except asyncio.TimeoutError as error:
- self._queue_wait_timeouts += 1
- raise _LocalBatchAdmissionRejected(
- "local canonical-cache batch admission wait exceeded the declared deadline"
- ) from error
- acquired = True
- self._active += 1
- self._admitted += 1
- return await work()
- finally:
- if acquired:
- self._active -= 1
- self._gate.release()
- async with self._lock:
- self._pending -= 1
+ return await self._lane.run(
+ work,
+ consumer_id=consumer_id,
+ reserved_bytes=reserved_bytes,
+ wait_timeout_ms=wait_timeout_ms,
+ )
+ except ReadLaneRejected as error:
+ raise _LocalBatchAdmissionRejected(
+ f"local canonical-cache batch admission {error}"
+ ) from error
def stats(self) -> dict[str, int]:
- return {
- "active": self._active,
- "pending": self._pending,
- "admitted": self._admitted,
- "rejected": self._rejected,
- "queue_wait_timeouts": self._queue_wait_timeouts,
- }
+ return self._lane.stats()
+
+
+
+class _QueryWorkPools:
+ """Small, explicit worker pools so cold reads cannot occupy hot threads."""
+
+ def __init__(self) -> None:
+ self._hot = ThreadPoolExecutor(max_workers=2, thread_name_prefix="qdl-query-hot")
+ self._cold = ThreadPoolExecutor(max_workers=4, thread_name_prefix="qdl-query-cold")
+ self._diagnostic = ThreadPoolExecutor(
+ max_workers=1, thread_name_prefix="qdl-query-diagnostic"
+ )
+ self._closed = False
+
+ # Every pool call holds its caller (and so the caller's admission permit)
+ # until the thread returns, also when the request is cancelled or times
+ # out; cold work is asked to stop at its next slice (KN-4 K4-T06).
+
+ async def hot(self, work: Callable, /, *args, **kwargs):
+ return await await_in_thread(self._hot, work, *args, **kwargs)
+
+ async def cold(self, work: Callable, /, *args, **kwargs):
+ # Cold threads run with a cooperative duty cycle (qdl.query.cold_work).
+ return await await_in_thread(self._cold, work, *args, cold=True, **kwargs)
+
+ async def diagnostic(self, work: Callable, /, *args, on_cancel=None, **kwargs):
+ return await await_in_thread(self._diagnostic, work, *args, on_cancel=on_cancel, **kwargs)
+
+ def close(self) -> None:
+ if self._closed:
+ return
+ self._closed = True
+ for pool in (self._hot, self._cold, self._diagnostic):
+ pool.shutdown(wait=False, cancel_futures=True)
class V2QueryService:
@@ -269,6 +429,9 @@ def __init__(
reference_batch: ReferenceBatch | None = None,
reference_source_id: Callable[[InstrumentRecord], str] | None = None,
execution_mark_index_reader: ExecutionMarkIndexReader | None = None,
+ small_local_warmup_lane: bool = False,
+ queued_local_batch_lane: bool = False,
+ alpha_mark_index_reader: ExecutionMarkIndexReader | None = None,
) -> None:
if reference_batch is not None and reference_source_id is None:
raise ValueError("reference batch requires an explicit source-id resolver")
@@ -286,7 +449,24 @@ def __init__(
self.reference_batch = reference_batch
self._reference_source_id = reference_source_id
self.execution_mark_index_reader = execution_mark_index_reader
- self._local_batch_admission = _LocalBatchAdmission()
+ # Alpha current MARK/INDEX reads; falls back to the execution reader.
+ self.alpha_mark_index_reader = alpha_mark_index_reader
+ # Opt-in: the stable runtime enables it; the default keeps every local
+ # warmup in the single-active lane.
+ self._small_local_warmup_lane = small_local_warmup_lane
+ self._queued_local_batch_lane = queued_local_batch_lane
+ self._local_batch_admission = (
+ _LocalBatchAdmission(policy=_queued_local_batch_lane_policy())
+ if queued_local_batch_lane
+ else _LocalBatchAdmission()
+ )
+ self._small_local_warmup_admission = _LocalBatchAdmission(
+ policy=_small_local_warmup_lane_policy()
+ )
+ self._hot_snapshot_admission = BoundedReadLane(_hot_snapshot_lane_policy())
+ self._hot_reference_admission = BoundedReadLane(_hot_reference_lane_policy())
+ self._query_work_pools = _QueryWorkPools()
+ self._gap_scan_task: asyncio.Task[tuple[GapRecord, ...]] | None = None
self.last_batch_evidence: dict[str, object] = {}
self.last_reference_batch_evidence: dict[str, object] = {}
@@ -328,6 +508,7 @@ def snapshot(
CoverageStatus.FULL,
request_id,
authoritative=item.source.authoritative,
+ item=item,
)
return QueryResult(
request_id,
@@ -336,6 +517,125 @@ def snapshot(
),
)
+ def _hot_snapshot_admission_for(self) -> BoundedReadLane:
+ admission = getattr(self, "_hot_snapshot_admission", None)
+ if admission is None:
+ admission = BoundedReadLane(_hot_snapshot_lane_policy())
+ self._hot_snapshot_admission = admission
+ return admission
+
+ def _hot_reference_admission_for(self) -> BoundedReadLane:
+ admission = getattr(self, "_hot_reference_admission", None)
+ if admission is None:
+ admission = BoundedReadLane(_hot_reference_lane_policy())
+ self._hot_reference_admission = admission
+ return admission
+
+ def _query_work_pools_for(self) -> _QueryWorkPools:
+ pools = getattr(self, "_query_work_pools", None)
+ if pools is None:
+ pools = _QueryWorkPools()
+ self._query_work_pools = pools
+ return pools
+
+ @staticmethod
+ def _consume_detached_lane_task(task: asyncio.Task) -> None:
+ """Drain shielded work after its request owner has disconnected."""
+
+ try:
+ task.result()
+ except asyncio.CancelledError:
+ pass
+ except Exception:
+ pass
+
+ @staticmethod
+ def _lane_error(
+ error: ReadLaneRejected,
+ *,
+ request_id: str,
+ instrument_uid: str | None = None,
+ ) -> QueryServiceError:
+ return QueryServiceError(
+ QueryProblem(CanonicalErrorCode.RATE_LIMITED, str(error), True),
+ request_id=request_id,
+ instrument_uid=instrument_uid,
+ )
+
+ async def snapshot_async(
+ self,
+ requirement: DataRequirement,
+ *,
+ purpose: AccessPurpose,
+ consumer_id: str,
+ request_id: str | None = None,
+ ) -> QueryResult:
+ """Serve a small latest view without borrowing cold/history workers."""
+
+ request_id = request_id or self.request_id()
+
+ async def execute() -> QueryResult:
+ return await self._query_work_pools_for().hot(
+ self.snapshot,
+ requirement,
+ purpose=purpose,
+ request_id=request_id,
+ )
+
+ task = asyncio.create_task(
+ self._hot_snapshot_admission_for().run(
+ execute,
+ consumer_id=consumer_id,
+ reserved_bytes=_HOT_SNAPSHOT_RESERVED_BYTES,
+ ),
+ name="qdl-v2-hot-snapshot",
+ )
+ try:
+ return await asyncio.shield(task)
+ except asyncio.CancelledError:
+ task.add_done_callback(self._consume_detached_lane_task)
+ raise
+ except ReadLaneRejected as error:
+ raise self._lane_error(
+ error,
+ request_id=request_id,
+ instrument_uid=requirement.instrument_uid,
+ ) from error
+
+ async def status_async(
+ self,
+ requirement: DataRequirement,
+ *,
+ consumer_id: str,
+ request_id: str | None = None,
+ ) -> QualityMetadata:
+ """Read current governed status on the same bounded hot cache lane."""
+
+ request_id = request_id or self.request_id()
+
+ async def execute() -> QualityMetadata:
+ return await self._query_work_pools_for().hot(self.status, requirement)
+
+ task = asyncio.create_task(
+ self._hot_snapshot_admission_for().run(
+ execute,
+ consumer_id=consumer_id,
+ reserved_bytes=_HOT_SNAPSHOT_RESERVED_BYTES,
+ ),
+ name="qdl-v2-hot-status",
+ )
+ try:
+ return await asyncio.shield(task)
+ except asyncio.CancelledError:
+ task.add_done_callback(self._consume_detached_lane_task)
+ raise
+ except ReadLaneRejected as error:
+ raise self._lane_error(
+ error,
+ request_id=request_id,
+ instrument_uid=requirement.instrument_uid,
+ ) from error
+
def warmup(
self,
requirement: DataRequirement,
@@ -389,19 +689,16 @@ def _warmup_from_history(
history.coverage,
request_id,
authoritative=history.items[-1].source.authoritative,
+ item=history.items[-1],
)
- return WarmupResult(
- request_id,
- replace(
- history,
- items=tuple(
- self._with_execution_eligibility(
- requirement, item, DataProduct.CANONICAL_HISTORY
- )
- for item in history.items
- ),
- ),
- )
+ def eligible_items():
+ for item in history.items:
+ cold_yield()
+ yield self._with_execution_eligibility(
+ requirement, item, DataProduct.CANONICAL_HISTORY
+ )
+
+ return WarmupResult(request_id, replace(history, items=tuple(eligible_items())))
def warmup_batch(
self,
@@ -426,9 +723,25 @@ def warmup_batch(
)
return BatchQueryResult(request_id, tuple(results))
- def _local_batch_admission_for(self) -> _LocalBatchAdmission:
- """Lazily preserve compatibility for focused service test doubles."""
+ def _local_batch_admission_for(
+ self, requirements: tuple[DataRequirement, ...] = (),
+ ) -> _LocalBatchAdmission:
+ """The lane for one local batch; lazily built for focused test doubles.
+
+ With the small-warmup lane enabled, a batch whose every item needs at
+ most two rows uses it; anything larger keeps the single-active lane.
+ """
+ if (
+ getattr(self, "_small_local_warmup_lane", False)
+ and requirements
+ and all(_is_small_local_warmup(item) for item in requirements)
+ ):
+ admission = getattr(self, "_small_local_warmup_admission", None)
+ if admission is None:
+ admission = _LocalBatchAdmission(policy=_small_local_warmup_lane_policy())
+ self._small_local_warmup_admission = admission
+ return admission
admission = getattr(self, "_local_batch_admission", None)
if admission is None:
admission = _LocalBatchAdmission()
@@ -456,13 +769,14 @@ async def warmup_async(
requirement: DataRequirement,
*,
purpose: AccessPurpose,
+ consumer_id: str = "qdl.v2.single-warmup",
request_id: str | None = None,
) -> WarmupResult:
"""Run one warmup through the same bounded policy as a batch item."""
request_id = request_id or self.request_id()
batch = await self.warmup_batch_async(
BatchRequirement(
- consumer_id="qdl.v2.single-warmup",
+ consumer_id=consumer_id,
requirements=(requirement,),
require_all=True,
),
@@ -541,6 +855,27 @@ def provider(requirement: DataRequirement) -> str:
local_history_lock = asyncio.Lock()
local_histories_task = None
prefetched_local_histories = None
+ local_reserved_bytes = self._local_history_reservation_bytes(local_requirements)
+
+ async def materialize_local_histories():
+ try:
+ return await self._local_batch_admission_for(local_requirements).run(
+ lambda: self._query_work_pools_for().cold(
+ history_many, local_requirements
+ ),
+ consumer_id=batch.consumer_id,
+ reserved_bytes=local_reserved_bytes,
+ wait_timeout_ms=local_admission_wait_ms,
+ )
+ except _LocalBatchAdmissionRejected as error:
+ return {
+ requirement: self._lane_error(
+ error,
+ request_id=request_id,
+ instrument_uid=requirement.instrument_uid,
+ )
+ for requirement in local_requirements
+ }
async def local_history(requirement: DataRequirement):
"""Share one immutable local snapshot after an item is admitted."""
@@ -553,7 +888,8 @@ async def local_history(requirement: DataRequirement):
async with local_history_lock:
if local_histories_task is None:
local_histories_task = asyncio.create_task(
- asyncio.to_thread(history_many, local_requirements)
+ materialize_local_histories(),
+ name="qdl-v2-cold-local-history",
)
task = local_histories_task
histories = await asyncio.shield(task)
@@ -568,13 +904,14 @@ async def work(requirement: DataRequirement) -> WarmupResult:
history = await local_history(requirement)
if isinstance(history, Exception):
raise history
- return self._warmup_from_history(
+ return await self._query_work_pools_for().cold(
+ self._warmup_from_history,
requirement,
history,
purpose=purpose,
request_id=request_id,
)
- return await asyncio.to_thread(
+ return await self._query_work_pools_for().cold(
self.warmup,
requirement,
purpose=purpose,
@@ -613,6 +950,15 @@ async def execute_items():
local_admission_wait_ms = min(
deadline(requirement) for requirement in local_requirements
) if local_requirements else None
+ if local_admission_wait_ms is not None and getattr(
+ self, "_queued_local_batch_lane", False
+ ):
+ # A queued large warmup must be refused while its client is still
+ # waiting: stage 20 (2026-09-23) saw 15 s client timeouts on queued
+ # 20 s waits, and the abandoned work then competed with hot reads.
+ local_admission_wait_ms = min(
+ local_admission_wait_ms, _QUEUED_LOCAL_BATCH_MAX_WAIT_MS
+ )
def assemble_batch(executions) -> BatchQueryResult:
results = []
@@ -692,7 +1038,7 @@ def assemble_batch(executions) -> BatchQueryResult:
),
"local_batch_items": len(local_requirements),
"local_batch_admission": (
- self._local_batch_admission_for().stats()
+ self._local_batch_admission_for(local_requirements).stats()
if local_requirements
else None
),
@@ -705,12 +1051,12 @@ async def complete(executions) -> _BatchCompletion:
return await completion(assemble_batch(executions))
if fully_local_batch:
- admission = self._local_batch_admission_for()
+ admission = self._local_batch_admission_for(local_requirements)
async def execute_whole_local_batch() -> _BatchCompletion:
nonlocal prefetched_local_histories
try:
- prefetched_local_histories = await asyncio.to_thread(
+ prefetched_local_histories = await self._query_work_pools_for().cold(
history_many, local_requirements
)
except Exception as error:
@@ -722,6 +1068,8 @@ async def execute_whole_local_batch() -> _BatchCompletion:
local_batch_task = asyncio.create_task(
admission.run(
execute_whole_local_batch,
+ consumer_id=batch.consumer_id,
+ reserved_bytes=local_reserved_bytes,
wait_timeout_ms=local_admission_wait_ms,
)
)
@@ -764,6 +1112,32 @@ def _warmup_backend_stats(self) -> dict[str, int]:
return {}
return {str(key): int(value) for key, value in stats().items()}
+ @staticmethod
+ def _local_history_reservation_bytes(
+ requirements: tuple[DataRequirement, ...],
+ ) -> int:
+ """Reserve a conservative bounded response budget before cache decode.
+
+ A row limit is a consumer lookback cap, not a byte cap. The admission
+ uses a deliberately conservative 1 KiB/row estimate, including an
+ envelope/decoded-object allowance, so a 50-item large batch cannot
+ build an unbounded in-process response queue. This does not change
+ the actual provider/cache result or its public V2 shape.
+ """
+
+ rows = 0
+ for requirement in requirements:
+ specification = requirement.warmup_specification
+ if specification is None:
+ rows += 1
+ elif specification.rows is not None:
+ rows += specification.rows
+ else:
+ # Time-range requests are capped by the public endpoint but
+ # not expressed as a row count. Reserve the legal maximum.
+ rows += 10_000
+ return max(_LOCAL_HISTORY_BASE_BYTES, rows * _LOCAL_HISTORY_BYTES_PER_ROW)
+
async def reference_data_batch_async(
self,
batch: ReferenceBatchRequirement,
@@ -799,6 +1173,7 @@ async def reference_data_batch_async(
if self.execution_mark_index_reader is not None
else {}
)
+ hot_reference_before = self._hot_reference_admission_for().stats()
results: list[ReferenceBatchItemResult | None] = [None] * len(batch.requirements)
admitted: list[tuple[int, ReferenceDataRequirement, ReferenceRequest]] = []
for index, requirement in enumerate(batch.requirements):
@@ -856,17 +1231,37 @@ async def work(
) -> ReferenceBatchResult:
_index, requirement, request = candidate
if self._uses_execution_mark_index_live_reader(requirement, request, purpose):
- # This is deliberately not a provider retry/cache path. The
- # active stream gateway either has one verified current view or
- # query returns its typed fail-closed reason to the consumer.
- result = await self.execution_mark_index_reader.fetch(
- request,
- max_freshness_ms=requirement.max_freshness_ms or 0,
- source_policy_id=requirement.source_policy_id,
- event_recency_policy=requirement.effective_event_recency_policy,
- max_session_liveness_ms=requirement.max_session_liveness_ms,
- deadline_ms=self._reference_deadline_ms(candidate, purpose),
- )
+ # For execution this is deliberately not a provider retry/cache
+ # path: the active stream gateway either has one verified
+ # current view or query returns its typed fail-closed reason.
+ try:
+ result = await self._fetch_execution_mark_index_hot(
+ request=request,
+ requirement=requirement,
+ consumer_id=batch.consumer_id,
+ deadline_ms=self._reference_deadline_ms(candidate, purpose),
+ )
+ except ReadLaneRejected:
+ if (
+ self._is_execution_mark_index_read(requirement, purpose)
+ or self.reference_batch is None
+ ):
+ raise
+ result = None
+ if result is None:
+ result = await self.reference_batch.fetch_one(
+ request, bypass_cache=bypass_cache
+ )
+ elif (
+ result.status is not ReferenceStatus.OK
+ and not self._is_execution_mark_index_read(requirement, purpose)
+ and self.reference_batch is not None
+ ):
+ # Alpha only: a view the stream cannot serve (handover,
+ # quiet component) returns to the venue snapshot path.
+ result = await self.reference_batch.fetch_one(
+ request, bypass_cache=bypass_cache
+ )
else:
result = await self.reference_batch.fetch_one(
request, bypass_cache=bypass_cache
@@ -936,12 +1331,18 @@ async def work(
index, requirement, request = execution.item
if execution.error is not None:
retry_after_ms = getattr(execution.error, "retry_after_ms", None)
+ if isinstance(execution.error, ReadLaneRejected):
+ code = CanonicalErrorCode.RATE_LIMITED
+ detail = str(execution.error)
+ else:
+ code = CanonicalErrorCode.SOURCE_UNAVAILABLE
+ detail = "reference batch provider lane did not complete"
results[index] = ReferenceBatchItemResult(
requirement,
- CanonicalErrorCode.SOURCE_UNAVAILABLE.value,
+ code.value,
problem=QueryProblem(
- CanonicalErrorCode.SOURCE_UNAVAILABLE,
- "reference batch provider lane did not complete",
+ code,
+ detail,
True,
retry_after_ms,
),
@@ -972,6 +1373,7 @@ async def work(
if self.execution_mark_index_reader is not None
else {}
)
+ hot_reference_after = self._hot_reference_admission_for().stats()
self.last_reference_batch_evidence = {
"request_id": request_id,
"item_count": len(resolved),
@@ -991,6 +1393,19 @@ async def work(
- execution_live_before.get(key, 0)
for key in execution_live_after
},
+ **{
+ f"hot_reference_{key}": hot_reference_after.get(key, 0)
+ - hot_reference_before.get(key, 0)
+ for key in hot_reference_after
+ if key
+ not in {
+ "active",
+ "pending",
+ "pending_bytes",
+ "active_reserved",
+ "pending_reserved",
+ }
+ },
}
return ReferenceBatchQueryResult(request_id, resolved)
@@ -999,14 +1414,45 @@ def _uses_execution_mark_index_live_reader(
requirement: ReferenceDataRequirement,
request: ReferenceRequest,
purpose: AccessPurpose,
+ ) -> bool:
+ if (
+ requirement.max_freshness_ms is None
+ or request.product is not ReferenceProduct.MARK_INDEX_PRICE
+ or request.is_history
+ ):
+ return False
+ if (
+ purpose is AccessPurpose.INTERNAL_EXECUTION
+ and requirement.consumer_grade is ConsumerGrade.EXECUTION
+ ):
+ return self.execution_mark_index_reader is not None
+ if self._alpha_mark_index_reader() is None:
+ return False
+ # Alpha reads of the current MARK/INDEX use the same verified live view
+ # of the ingested canonical record instead of a venue REST call. On
+ # 2026-09-23 (v2.1.1 Phase-3 stage 50) the REST path put OKX alpha
+ # reads at p50 420 ms: two replicas each refreshing five mark and five
+ # index ids every 0.75 s exceed OKX's market bucket (10/s), so provider
+ # admission deferred them. A view the stream cannot serve falls back to
+ # the REST path in ``work``, so alpha availability never gets worse.
+ return (
+ purpose is AccessPurpose.INTERNAL_ALPHA
+ and requirement.consumer_grade is ConsumerGrade.ALPHA
+ )
+
+ def _alpha_mark_index_reader(self) -> ExecutionMarkIndexReader | None:
+ return (
+ getattr(self, "alpha_mark_index_reader", None)
+ or self.execution_mark_index_reader
+ )
+
+ @staticmethod
+ def _is_execution_mark_index_read(
+ requirement: ReferenceDataRequirement, purpose: AccessPurpose
) -> bool:
return (
- self.execution_mark_index_reader is not None
- and purpose is AccessPurpose.INTERNAL_EXECUTION
+ purpose is AccessPurpose.INTERNAL_EXECUTION
and requirement.consumer_grade is ConsumerGrade.EXECUTION
- and requirement.max_freshness_ms is not None
- and request.product is ReferenceProduct.MARK_INDEX_PRICE
- and not request.is_history
)
def _reference_provider_lane(
@@ -1032,7 +1478,8 @@ def _reference_batch_identity(
# policy or deadline would make the result's admission ambiguous.
return (
*request.cache_key,
- "INTERNAL_EXECUTION",
+ purpose.value,
+ requirement.consumer_grade.value,
requirement.source_policy_id,
requirement.max_freshness_ms,
requirement.effective_event_recency_policy.value,
@@ -1052,6 +1499,40 @@ def _reference_deadline_ms(
return min(requirement.deadline_ms, requirement.max_freshness_ms)
return requirement.deadline_ms
+ async def _fetch_execution_mark_index_hot(
+ self,
+ *,
+ request: ReferenceRequest,
+ requirement: ReferenceDataRequirement,
+ consumer_id: str,
+ deadline_ms: int,
+ ) -> ReferenceBatchResult:
+ """Read an execution view without competing with provider history work."""
+
+ reader = (
+ self.execution_mark_index_reader
+ if requirement.consumer_grade is ConsumerGrade.EXECUTION
+ else self._alpha_mark_index_reader()
+ )
+ assert reader is not None
+
+ async def fetch() -> ReferenceBatchResult:
+ return await reader.fetch(
+ request,
+ max_freshness_ms=requirement.max_freshness_ms or 0,
+ source_policy_id=requirement.source_policy_id,
+ event_recency_policy=requirement.effective_event_recency_policy,
+ max_session_liveness_ms=requirement.max_session_liveness_ms,
+ deadline_ms=deadline_ms,
+ )
+
+ return await self._hot_reference_admission_for().run(
+ fetch,
+ consumer_id=consumer_id,
+ reserved_bytes=_HOT_REFERENCE_RESERVED_BYTES,
+ wait_timeout_ms=deadline_ms,
+ )
+
def _reference_snapshot_requires_refresh(
self,
requirement: ReferenceDataRequirement,
@@ -1323,8 +1804,72 @@ def status(self, requirement: DataRequirement) -> QualityMetadata:
DataProduct.CANONICAL_SNAPSHOT,
).quality
- def open_gaps(self):
- return self.backend.open_gaps()
+ def open_gaps(self) -> tuple[GapRecord, ...]:
+ """Compatibility path for internal synchronous callers.
+
+ Production HTTP callers use :meth:`open_gaps_async`, which coalesces a
+ bounded scan. Both paths select the bounded backend primitive when it
+ is available, so a direct caller cannot accidentally revive the old
+ catalog-wide retained-tail allocation pattern.
+ """
+
+ try:
+ scanner = getattr(self.backend, "open_gaps_bounded", None)
+ return scanner() if callable(scanner) else self.backend.open_gaps()
+ except QueryBackendError as error:
+ raise QueryServiceError(
+ error.problem,
+ request_id=self.request_id(),
+ ) from error
+
+ async def open_gaps_async(self) -> tuple[GapRecord, ...]:
+ """Coalesce one bounded global diagnostic scan per query service.
+
+ ``shield`` keeps an individual HTTP disconnect from cancelling the
+ shared task. The worker itself owns a finite deadline and receives a
+ cooperative cancellation flag on application shutdown, so releasing a
+ waiting client never leaves an unbounded thread behind.
+ """
+
+ task = self._gap_scan_task
+ if task is None or task.done():
+ task = asyncio.create_task(
+ self._run_bounded_gap_scan(),
+ name="qdl-v2-bounded-gap-diagnostic",
+ )
+ self._gap_scan_task = task
+
+ def clear(completed: asyncio.Task[tuple[GapRecord, ...]]) -> None:
+ if self._gap_scan_task is completed:
+ self._gap_scan_task = None
+
+ task.add_done_callback(clear)
+ try:
+ return await asyncio.shield(task)
+ except QueryBackendError as error:
+ raise QueryServiceError(
+ error.problem,
+ request_id=self.request_id(),
+ ) from error
+
+ async def _run_bounded_gap_scan(self) -> tuple[GapRecord, ...]:
+ cancelled = threading.Event()
+ try:
+ scanner = getattr(self.backend, "open_gaps_bounded", None)
+ if callable(scanner):
+ return await self._query_work_pools_for().diagnostic(
+ scanner, cancelled=cancelled.is_set, on_cancel=cancelled.set
+ )
+ return await self._query_work_pools_for().diagnostic(self.backend.open_gaps)
+ finally:
+ cancelled.set()
+
+ async def close(self) -> None:
+ """Release only local Query worker pools during reader shutdown."""
+
+ pools = getattr(self, "_query_work_pools", None)
+ if pools is not None:
+ pools.close()
def readiness(
self,
@@ -1359,6 +1904,20 @@ def readiness(
results=tuple(results),
)
+ async def readiness_async(
+ self,
+ batch: BatchRequirement,
+ *,
+ purpose: AccessPurpose,
+ ) -> ReadinessResult:
+ """Keep high-cardinality diagnostic work out of the default executor."""
+
+ return await self._query_work_pools_for().diagnostic(
+ self.readiness,
+ batch,
+ purpose=purpose,
+ )
+
def _enforce(
self,
requirement: DataRequirement,
@@ -1370,6 +1929,7 @@ def _enforce(
request_id: str,
*,
authoritative: bool,
+ item: MarketDataItem | None = None,
) -> None:
if quality.policy_id != requirement.source_policy_id:
raise QueryServiceError(
@@ -1417,8 +1977,31 @@ def _enforce(
request_id=request_id,
instrument_uid=requirement.instrument_uid,
quality_state=quality.state,
+ diagnostics=self._refusal_diagnostics(quality, source_id, item),
)
+ def _refusal_diagnostics(
+ self, quality: QualityMetadata, source_id: str, item: MarketDataItem | None
+ ) -> dict[str, Any]:
+ """The quality this refusal was decided on, taken now (not re-read)."""
+
+ return {
+ "evaluated_at_ns": self._clock_ns(),
+ "state": quality.state,
+ "freshness_ms": quality.freshness_ms,
+ "event_recency_state": quality.event_recency_state,
+ "provider_session_state": quality.provider_session_state,
+ "provider_session_liveness_ms": quality.provider_session_liveness_ms,
+ "execution_eligible": quality.execution_eligible,
+ "gap_open": quality.gap_open,
+ "complete": quality.complete,
+ "reason_codes": list(quality.flags)[:32],
+ "source_id": source_id,
+ "watermark_offset": item.watermark_offset if item is not None else None,
+ "observed_at_ns": item.observed_at_ns if item is not None else None,
+ "received_at_ns": (item.received_at_ns or None) if item is not None else None,
+ }
+
def _with_execution_eligibility(
self,
requirement: DataRequirement,
diff --git a/qdl/reference/local_mark_index.py b/qdl/reference/local_mark_index.py
new file mode 100644
index 00000000..79d51d1e
--- /dev/null
+++ b/qdl/reference/local_mark_index.py
@@ -0,0 +1,173 @@
+"""Alpha MARK/INDEX reads served inside the Query process from its own spool.
+
+Alpha reads of the current MARK/INDEX first moved from venue REST to the stream
+gateway's live view (OKX REST exceeded the venue bucket at stage 50). At stage
+35 (2026-09-23) that added HTTP work to the single stream process that also
+writes and fans out, and a market burst then left the writer 46 s behind. This
+reader keeps the same verified view and the same private endpoint code, but
+runs them in-process on the Query replica: before each read the instrument's
+latest canonical record is offered from the local spool (exactly as
+``hydrate_from_spool`` does on a lease change), then the unchanged endpoint and
+``HttpExecutionMarkIndexReader`` conversion apply every identity, freshness and
+gap gate. No network hop, no stream-process load, no venue call.
+
+Execution (TS) reads keep the stream gateway's live view: it is fed before the
+spool append and carries the quiet-session evidence execution requires.
+"""
+
+from __future__ import annotations
+
+import asyncio
+from dataclasses import replace
+import os
+
+import httpx
+from fastapi import FastAPI
+from google.protobuf.message import DecodeError
+
+from qdl.marketdata.v2 import market_data_pb2
+from qdl.reference.execution_live import HttpExecutionMarkIndexReader
+from qdl.runtime.execution_mark_index import (
+ ExecutionMarkIndexRead,
+ ExecutionMarkIndexLiveView,
+ install_execution_mark_index_read,
+)
+
+_LOCAL_EPOCH = 1
+# Upper bound of the request freshness the private endpoint accepts.
+_ALPHA_STALE_AFTER_MS = 300_000
+_LOCAL_URL = "http://localhost"
+
+
+class _LocalGateway:
+ """The Query replica is never a writer; its local view has one epoch."""
+
+ @staticmethod
+ def assert_active(epoch: int | None = None) -> int:
+ return _LOCAL_EPOCH
+
+
+class SpoolRefreshingMarkIndexView(ExecutionMarkIndexLiveView):
+ """The execution view, offered this replica's latest spooled record per read."""
+
+ def attach(self, *, spool, canonical_stream: str) -> "SpoolRefreshingMarkIndexView":
+ self._spool = spool
+ self._canonical_stream = canonical_stream
+ # Alpha reads are judged by the alpha's own declared freshness (the
+ # view bounds a read by min(request freshness, binding stale_after)).
+ # The binding's 2 s bound is the execution horizon; applied to alpha it
+ # pushed about 30 % of Binance reads (1 s mark cadence plus spool
+ # latency) back to venue REST. Execution reads never use this view.
+ self._bindings = {
+ uid: replace(binding, stale_after_ms=max(binding.stale_after_ms, _ALPHA_STALE_AFTER_MS))
+ for uid, binding in self._bindings.items()
+ }
+ return self
+
+ async def read(self, *, instrument_uid: str, **kwargs):
+ binding = self._bindings.get(instrument_uid)
+ if binding is not None:
+ rows = await asyncio.to_thread(
+ self._spool.read_tail,
+ stream=self._canonical_stream,
+ partition_key=binding.partition_key,
+ limit=1,
+ )
+ if rows:
+ stored = rows[-1]
+ try:
+ envelope = market_data_pb2.EventEnvelope.FromString(stored.event.payload)
+ except DecodeError:
+ envelope = None
+ if envelope is not None and envelope.WhichOneof("payload") == "mark_index_price":
+ await self.remember(
+ binding=binding, envelope=envelope, stored=stored,
+ gateway_epoch=_LOCAL_EPOCH,
+ )
+ return await super().read(instrument_uid=instrument_uid, **kwargs)
+
+
+class CacheRefreshingMarkIndexView(SpoolRefreshingMarkIndexView):
+ """The same view offered the market cache's latest record (KN-4 D31).
+
+ The Kafka-native Query backend has no spool: before each read it offers
+ the MARK_INDEX product's latest entry from the market cache (one READY
+ generation, read by ``KnMarketCacheQueryBackend``), then the unchanged
+ endpoint and conversion apply every identity, freshness and gap gate.
+ A product that is not ready offers nothing (the view answers unavailable).
+
+ Alpha reads relax the binding horizon exactly like the spool reader.
+ Execution reads keep the binding's own ``stale_after_ms`` and the quiet
+ evidence of the stream's view (the event's paired MARK/INDEX receipts,
+ the provider session files and the acquisition quiet policies): the Rust
+ Stream serves no private endpoint, and the cache holds the same
+ read-committed canonical record the Python stream view held.
+ """
+
+ def attach_cache(self, *, backend, relax_to_alpha: bool = True) -> "CacheRefreshingMarkIndexView":
+ self._backend = backend
+ if relax_to_alpha:
+ self._bindings = {
+ uid: replace(binding, stale_after_ms=max(binding.stale_after_ms, _ALPHA_STALE_AFTER_MS))
+ for uid, binding in self._bindings.items()
+ }
+ return self
+
+ async def read(self, *, instrument_uid: str, **kwargs):
+ binding = self._bindings.get(instrument_uid)
+ if binding is not None:
+ stored, state = await asyncio.to_thread(self._backend.latest_stored_event, binding)
+ reason = None if state == "OK" else f"MARKET_CACHE_{state}"
+ if stored is not None:
+ try:
+ envelope = market_data_pb2.EventEnvelope.FromString(stored.event.payload)
+ except DecodeError:
+ envelope = None
+ if envelope is None or envelope.WhichOneof("payload") != "mark_index_price":
+ reason = "LINEAGE_INVALID"
+ else:
+ try:
+ await self.remember(
+ binding=binding, envelope=envelope, stored=stored,
+ gateway_epoch=_LOCAL_EPOCH,
+ )
+ except ValueError:
+ reason = "LINEAGE_INVALID"
+ if reason is not None:
+ # D36: a cache, fencing or integrity failure (or a product
+ # without state) never lets a remembered price answer.
+ async with self._lock:
+ self._records.pop(instrument_uid, None)
+ return ExecutionMarkIndexRead(None, reason)
+ return await ExecutionMarkIndexLiveView.read(self, instrument_uid=instrument_uid, **kwargs)
+
+
+def build_cache_alpha_mark_index_reader(*, catalog, backend) -> HttpExecutionMarkIndexReader:
+ view = CacheRefreshingMarkIndexView.from_catalog(catalog).attach_cache(backend=backend)
+ return reader_for_view(view)
+
+
+def build_cache_execution_mark_index_reader(
+ *, catalog, backend, acquisition, session_liveness_reader,
+) -> HttpExecutionMarkIndexReader:
+ """Execution MARK/INDEX from the market cache with execution bounds (D31)."""
+
+ view = CacheRefreshingMarkIndexView.from_catalog(
+ catalog, acquisition=acquisition, session_liveness_reader=session_liveness_reader,
+ ).attach_cache(backend=backend, relax_to_alpha=False)
+ return reader_for_view(view)
+
+
+def build_local_alpha_mark_index_reader(*, catalog, spool) -> HttpExecutionMarkIndexReader:
+ view = SpoolRefreshingMarkIndexView.from_catalog(catalog).attach(
+ spool=spool, canonical_stream=catalog.canonical_stream,
+ )
+ return reader_for_view(view)
+
+
+def reader_for_view(view: SpoolRefreshingMarkIndexView) -> HttpExecutionMarkIndexReader:
+ secret = os.urandom(32)
+ app = FastAPI()
+ install_execution_mark_index_read(app, gateway=_LocalGateway(), view=view, secret=secret)
+ client = httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url=_LOCAL_URL)
+ return HttpExecutionMarkIndexReader(urls=(_LOCAL_URL,), secret=secret, client=client)
diff --git a/qdl/reference/runtime.py b/qdl/reference/runtime.py
index 28187e1e..58ea3a14 100644
--- a/qdl/reference/runtime.py
+++ b/qdl/reference/runtime.py
@@ -128,7 +128,10 @@ def build_default_reference_runtime(
never need a venue branch.
"""
- okx = OkxSwapReferenceAdapter(OkxRestClient())
+ okx = OkxSwapReferenceAdapter(
+ OkxRestClient(), statistics_admission=native_basis_admission,
+ require_statistics_admission=True,
+ )
return ReferenceRuntime(
ReferenceBatch({
("BINANCE", "USDM"): BinanceUsdmReferenceAdapter(
diff --git a/qdl/replay/cursor_v3.py b/qdl/replay/cursor_v3.py
new file mode 100644
index 00000000..5eb89e4c
--- /dev/null
+++ b/qdl/replay/cursor_v3.py
@@ -0,0 +1,280 @@
+"""Signed handoff cursor v3 (KN-1 K1.3): the Kafka-native recovery contract.
+
+Query issues the token with a snapshot; the native Rust Stream verifies it and
+re-signs one per delivered record. Both sides must therefore agree byte for
+byte, so the body is a canonical JSON object whose rules are small enough to
+implement identically in Python and Rust:
+
+* keys sorted by byte order, no whitespace, ``,``/``:`` separators;
+* values are strings drawn from ``_TOKEN_CHARSET`` (never escaped) or
+ unsigned integers ``0 <= n < 2**63`` written in decimal, never floats;
+* token = ``base64url(body) + "." + base64url(HMAC-SHA256(key, body))``
+ without padding. Verification uses the received body bytes, not a
+ re-serialization.
+
+Claims (guide 18.5, invariant 29): environment, authenticated consumer,
+normalized delivery-requirement digest, public schema major, canonical stream,
+logical product key, snapshot identity, source coordinate (Kafka topic id,
+physical partition, last applied canonical offset), partition-plan epoch,
+source-policy and catalog revisions, route generation, issue/expiry.
+
+Typed outcomes follow the SDK recovery contract: a token that is authentic but
+belongs to another generation, route, policy/catalog revision, schema major or
+an earlier cursor schema (v1/v2), or that has expired, is ``CursorExpired``
+(gRPC OUT_OF_RANGE -> SDK fresh snapshot). A token that is malformed, forged,
+signed with an unknown key, or bound to another consumer/environment/
+requirement is ``CursorInvalid`` (INVALID_ARGUMENT). The SDK raises on the
+latter, so nothing that a normal migration produces may land there.
+"""
+from __future__ import annotations
+
+import base64
+from dataclasses import dataclass, fields
+import hashlib
+import hmac
+import json
+import re
+from typing import Any, Mapping
+
+from qdl.transport.contracts import CursorExpired
+
+SCHEMA_V3 = "qdl.handoff-cursor.v3"
+LEGACY_SCHEMAS = frozenset({"qdl.handoff-cursor.v1", "qdl.handoff-cursor.v2"})
+REQUIREMENT_DIGEST_SCHEMA = "qdl.requirement-digest.v1"
+MAX_OFFSET = 2**63 - 1
+# Always ``fullmatch``: ``re.match`` with ``$`` also accepts a trailing "\n".
+_TOKEN_CHARSET = re.compile(r"[A-Za-z0-9._:/@|+=-]{1,256}")
+_HEX64 = re.compile(r"[0-9a-f]{64}")
+
+
+class CursorInvalid(ValueError):
+ """Malformed, forged or foreign token; the SDK does not auto-recover."""
+
+ def __init__(self, reason: str, detail: str = "") -> None:
+ super().__init__(f"CURSOR_INVALID:{reason}" + (f":{detail}" if detail else ""))
+ self.reason = reason
+
+
+class CursorV3Expired(CursorExpired):
+ """Authentic but no longer resumable here; the SDK takes a fresh snapshot."""
+
+ def __init__(self, reason: str, detail: str = "") -> None:
+ super().__init__(f"CURSOR_EXPIRED:{reason}" + (f":{detail}" if detail else ""))
+ self.reason = reason
+
+
+@dataclass(frozen=True)
+class CursorV3Claims:
+ key_id: str
+ environment: str
+ consumer_id: str
+ requirement_digest: str
+ schema_major: int
+ stream: str
+ product_key: str
+ snapshot_id: str
+ source_topic_id: str
+ source_partition: int
+ source_offset: int
+ partition_plan_epoch: int
+ source_policy_revision: int
+ catalog_revision: int
+ route_generation: str
+ issued_at_ns: int
+ expires_at_ns: int
+
+ def __post_init__(self) -> None:
+ for item in fields(self):
+ value = getattr(self, item.name)
+ if item.type == "int":
+ if isinstance(value, bool) or not isinstance(value, int) or not 0 <= value <= MAX_OFFSET:
+ raise CursorInvalid("FIELD_RANGE", item.name)
+ elif not isinstance(value, str) or not _TOKEN_CHARSET.fullmatch(value):
+ raise CursorInvalid("FIELD_CHARSET", item.name)
+ if not _HEX64.fullmatch(self.requirement_digest):
+ raise CursorInvalid("FIELD_CHARSET", "requirement_digest")
+ if self.expires_at_ns <= self.issued_at_ns:
+ raise CursorInvalid("FIELD_RANGE", "expires_at_ns")
+
+ def body(self) -> bytes:
+ return canonical_body({"schema": SCHEMA_V3, **{f.name: getattr(self, f.name) for f in fields(self)}})
+
+
+@dataclass(frozen=True)
+class CursorV3Expectation:
+ """What the verifying replica is configured to accept."""
+
+ environment: str
+ stream: str
+ source_topic_id: str
+ partition_plan_epoch: int
+ source_policy_revision: int
+ catalog_revision: int
+ route_generation: str
+ schema_major: int = 2
+
+
+def canonical_body(value: Mapping[str, Any]) -> bytes:
+ """Encode the restricted canonical JSON object (see module docstring)."""
+
+ parts = []
+ for key in sorted(value, key=lambda item: item.encode()):
+ item = value[key]
+ if isinstance(item, bool) or not isinstance(item, (int, str)):
+ raise CursorInvalid("FIELD_TYPE", key)
+ if isinstance(item, int):
+ if not 0 <= item <= MAX_OFFSET:
+ raise CursorInvalid("FIELD_RANGE", key)
+ encoded = str(item)
+ else:
+ if not _TOKEN_CHARSET.fullmatch(item):
+ raise CursorInvalid("FIELD_CHARSET", key)
+ encoded = f'"{item}"'
+ parts.append(f'"{key}":{encoded}')
+ return ("{" + ",".join(parts) + "}").encode("ascii")
+
+
+def _b64(value: bytes) -> str:
+ return base64.urlsafe_b64encode(value).rstrip(b"=").decode("ascii")
+
+
+def _unb64(value: str) -> bytes:
+ if not value or not re.fullmatch(r"[A-Za-z0-9_-]+", value) or len(value) % 4 == 1:
+ raise CursorInvalid("ENCODING")
+ try:
+ decoded = base64.urlsafe_b64decode(value + "=" * (-len(value) % 4))
+ except ValueError as error:
+ raise CursorInvalid("ENCODING") from error
+ if _b64(decoded) != value:
+ # Non-canonical trailing bits would make one token spellable many ways.
+ raise CursorInvalid("ENCODING")
+ return decoded
+
+
+def _reject_constant(name: str) -> Any:
+ # NaN/Infinity are not JSON; Python accepts them by default, Rust does not.
+ raise ValueError(name)
+
+
+def requirement_digest(requirement: Any) -> str:
+ """SHA-256 of the normalized *delivery* requirement.
+
+ Covers every field that changes what a stream delivers or when it blocks;
+ the historical horizon (``warmup_limit``/``warmup``) is excluded because a
+ stream resumed after a different warmup size is the same subscription.
+ Accepts ``qdl.query.contracts.DataRequirement`` (Query) and the same
+ semantics parsed from the proto by the native Stream.
+ """
+
+ def text(value: Any) -> str:
+ if value is None:
+ return ""
+ if isinstance(value, bool):
+ return "true" if value else "false"
+ if hasattr(value, "value"):
+ return str(value.value)
+ return str(value)
+
+ lines = [
+ REQUIREMENT_DIGEST_SCHEMA,
+ f"instrument_uid={text(requirement.instrument_uid)}",
+ f"feed={text(requirement.feed)}",
+ f"interval={text(requirement.interval)}",
+ f"consumer_grade={text(requirement.consumer_grade)}",
+ f"source_policy_id={text(requirement.source_policy_id)}",
+ f"max_freshness_ms={text(requirement.max_freshness_ms)}",
+ f"event_recency_policy={text(requirement.event_recency_policy)}",
+ f"max_session_liveness_ms={text(requirement.max_session_liveness_ms)}",
+ f"require_full_coverage={text(requirement.require_full_coverage)}",
+ f"require_final_bars={text(requirement.require_final_bars)}",
+ f"stale_policy={text(requirement.stale_policy)}",
+ f"gap_policy={text(requirement.gap_policy)}",
+ f"recovery={text(requirement.recovery)}",
+ f"bar_revision_policy={text(requirement.bar_revision_policy)}",
+ ]
+ return hashlib.sha256("\n".join(lines).encode("utf-8")).hexdigest()
+
+
+class SignedCursorV3Codec:
+ """HMAC-SHA256 cursor v3 with key rotation and typed verification."""
+
+ def __init__(self, keys: Mapping[str, bytes], *, active_key_id: str) -> None:
+ if active_key_id not in keys:
+ raise ValueError("active cursor-signing key is unavailable")
+ if any(len(secret) < 32 for secret in keys.values()):
+ raise ValueError("cursor-signing secrets must contain at least 256 bits")
+ for key_id in keys:
+ if not _TOKEN_CHARSET.fullmatch(key_id):
+ raise ValueError("cursor key id has characters outside the token charset")
+ self._keys = dict(keys)
+ self.active_key_id = active_key_id
+
+ def encode(self, claims: CursorV3Claims) -> str:
+ if claims.key_id != self.active_key_id:
+ raise ValueError("new cursors must use the active signing key")
+ body = claims.body()
+ signature = hmac.new(self._keys[claims.key_id], body, hashlib.sha256).digest()
+ return f"{_b64(body)}.{_b64(signature)}"
+
+ def verify(
+ self,
+ token: str,
+ *,
+ consumer_id: str,
+ environment: str,
+ requirement_digest_value: str,
+ expected: CursorV3Expectation,
+ now_ns: int,
+ ) -> CursorV3Claims:
+ if not isinstance(token, str) or token.count(".") != 1 or len(token) > 4096:
+ raise CursorInvalid("ENCODING")
+ encoded_body, encoded_signature = token.split(".")
+ body = _unb64(encoded_body)
+ signature = _unb64(encoded_signature)
+ try:
+ raw = json.loads(body.decode("utf-8"), parse_constant=_reject_constant)
+ except (UnicodeDecodeError, ValueError) as error:
+ raise CursorInvalid("ENCODING") from error
+ if not isinstance(raw, dict):
+ raise CursorInvalid("ENCODING")
+ schema = raw.get("schema")
+ # An array or object schema is unhashable: test the type before the
+ # set lookup so it is refused as SCHEMA, never raised as TypeError.
+ if isinstance(schema, str) and schema in LEGACY_SCHEMAS:
+ # An earlier spool-offset cursor can never be interpreted as a
+ # Kafka coordinate. Its only safe outcome is a fresh snapshot; a
+ # forged legacy body gains nothing beyond that authenticated reset.
+ raise CursorV3Expired("LEGACY_SCHEMA", str(schema))
+ if schema != SCHEMA_V3:
+ raise CursorInvalid("SCHEMA")
+ key = self._keys.get(raw.get("key_id")) if isinstance(raw.get("key_id"), str) else None
+ if key is None:
+ raise CursorInvalid("UNKNOWN_KEY")
+ if not hmac.compare_digest(signature, hmac.new(key, body, hashlib.sha256).digest()):
+ raise CursorInvalid("SIGNATURE")
+ names = {item.name for item in fields(CursorV3Claims)}
+ if set(raw) != names | {"schema"}:
+ raise CursorInvalid("FIELDS")
+ claims = CursorV3Claims(**{name: raw[name] for name in names})
+ if claims.body() != body:
+ raise CursorInvalid("NON_CANONICAL")
+ if claims.consumer_id != consumer_id:
+ raise CursorInvalid("CONSUMER")
+ if claims.environment != environment or environment != expected.environment:
+ raise CursorInvalid("ENVIRONMENT")
+ if claims.requirement_digest != requirement_digest_value:
+ raise CursorInvalid("REQUIREMENT")
+ for reason, actual, wanted in (
+ ("SCHEMA_MAJOR", claims.schema_major, expected.schema_major),
+ ("STREAM", claims.stream, expected.stream),
+ ("TOPIC_GENERATION", claims.source_topic_id, expected.source_topic_id),
+ ("PARTITION_PLAN", claims.partition_plan_epoch, expected.partition_plan_epoch),
+ ("SOURCE_POLICY", claims.source_policy_revision, expected.source_policy_revision),
+ ("CATALOG", claims.catalog_revision, expected.catalog_revision),
+ ("ROUTE_GENERATION", claims.route_generation, expected.route_generation),
+ ):
+ if actual != wanted:
+ raise CursorV3Expired(reason)
+ if now_ns >= claims.expires_at_ns:
+ raise CursorV3Expired("EXPIRED")
+ return claims
diff --git a/qdl/runtime/bar_history_demand.py b/qdl/runtime/bar_history_demand.py
new file mode 100644
index 00000000..7735912c
--- /dev/null
+++ b/qdl/runtime/bar_history_demand.py
@@ -0,0 +1,42 @@
+"""Demanded BAR history depth per binding, from the KN gateway bundle (KN-4 D47-3).
+
+Purpose: the BAR edge fills venue history only as deep as a consumer asks,
+with the same rule the projector uses for its retained caps
+(``rust/qdl-projector/src/products.rs`` ``retained_caps``, D15 as amended):
+per BAR product, the largest ``max_warmup_rows`` of a manifest that requires
+it (instrument, BAR, interval); 0 without demand. The retained cap adds the
+2,064-row headroom for retention only - the headroom is never fetched.
+
+Boundary: pure function over the bundle document (the single product-identity
+owner, ``scripts/kn_gateway_bundle.py``); no I/O besides reading that file.
+"""
+from __future__ import annotations
+
+import json
+from pathlib import Path
+from typing import Any, Mapping
+
+
+def demanded_history_rows(bundle: Mapping[str, Any]) -> dict[str, int]:
+ """BAR binding id -> demanded rows (0 when no manifest requires it)."""
+
+ requirements = [
+ (requirement["instrument_uid"], requirement.get("interval"), int(manifest["quotas"]["max_warmup_rows"]))
+ for manifest in bundle["manifests"]
+ for requirement in manifest["requirements"]
+ if requirement["feed"] == "BAR"
+ ]
+ demand: dict[str, int] = {}
+ for binding in bundle["catalog"]["bindings"]:
+ if binding["feed"] != "BAR":
+ continue
+ demand[binding["binding_id"]] = max(
+ (rows for uid, interval, rows in requirements
+ if uid == binding["instrument_uid"] and interval == binding.get("interval")),
+ default=0,
+ )
+ return demand
+
+
+def load_demanded_history_rows(path: str | Path) -> dict[str, int]:
+ return demanded_history_rows(json.loads(Path(path).read_text(encoding="utf-8")))
diff --git a/qdl/runtime/execution_mark_index.py b/qdl/runtime/execution_mark_index.py
index beb6af52..2027f9ff 100644
--- a/qdl/runtime/execution_mark_index.py
+++ b/qdl/runtime/execution_mark_index.py
@@ -17,6 +17,7 @@
from typing import Mapping
from fastapi import FastAPI, Header, HTTPException, Request, Response
+from google.protobuf.message import DecodeError
from qdl.common.v1 import common_pb2
from qdl.data_quality.binding_decision import (
@@ -291,6 +292,9 @@ async def remember(
or gateway_epoch < 1
):
raise ValueError("execution MARK/INDEX event identity/provenance is invalid")
+ # Every retained pair proves its Rust pairing lineage, whatever path
+ # later reads it (strict, quiet, or the KN cache view).
+ paired_mark_index_lineage(envelope)
canonical = envelope.SerializeToString(deterministic=True)
if stored is not None and (
stored.event.event_id != bytes(envelope.event_id)
@@ -430,6 +434,7 @@ async def read(
)
):
raise ValueError("execution MARK/INDEX quiet policy is invalid")
+ clock_given = now_ns is not None
now_ns = time.time_ns() if now_ns is None else now_ns
async with self._lock:
invalid = self._invalid.get(instrument_uid)
@@ -496,6 +501,11 @@ async def read(
config_revision=record.config_revision,
now_ns=now_ns,
)
+ if not clock_given:
+ # Event and component ages are judged after the session read, like
+ # the session's own age (the reader samples its clock after it).
+ now_ns = max(now_ns, time.time_ns())
+ event_age_ms = max(0, (now_ns - freshness_anchor_ns) // 1_000_000)
assert max_session_liveness_ms is not None
decision = evaluate_binding_quality(BindingQualityInput(
binding_id=f"execution-mark-index:{instrument_uid}",
diff --git a/qdl/runtime/history_backpressure.py b/qdl/runtime/history_backpressure.py
new file mode 100644
index 00000000..0881f2ae
--- /dev/null
+++ b/qdl/runtime/history_backpressure.py
@@ -0,0 +1,103 @@
+"""Downstream backpressure for venue history fills (KN-4 D47-3).
+
+Purpose: a full provider re-bootstrap once left a 601,622-record projector
+backlog. History (never live data) is admitted only while every pipeline stage
+keeps up: per stage, records its consumer group has not yet consumed on its
+input topic (end offset - committed offset, summed over partitions). The
+stages are the canonical core (raw topic), projector stage A (canonical topic,
+``kn-projector-v3-a``) and stage B (bars topic, ``kn-projector-v3-b``). Above a
+stage's limit the gate closes; the edge stops fetching more history until the
+backlog drains, and resumes from its checkpoint.
+
+Boundary: read-only Kafka metadata (group offsets, watermarks); never joins or
+commits a group; no venue call.
+"""
+from __future__ import annotations
+
+from dataclasses import dataclass
+from pathlib import Path
+from typing import Any, Callable, Mapping, Sequence
+
+
+@dataclass(frozen=True)
+class Stage:
+ name: str
+ group: str
+ topic: str
+ limit_records: int
+
+
+def stage_backlog(committed: Mapping[int, int], ends: Mapping[int, int]) -> int:
+ """Unconsumed records of one group on one topic; a partition never committed
+ counts from its beginning (0)."""
+
+ return sum(max(0, end - max(0, committed.get(partition, 0))) for partition, end in ends.items())
+
+
+class KafkaStageBacklog:
+ def __init__(self, stages: Sequence[Stage], *, read_committed: Callable[[str, str], Mapping[int, int]],
+ read_ends: Callable[[str], Mapping[int, int]]) -> None:
+ if not stages or any(stage.limit_records < 1 for stage in stages):
+ raise ValueError("backpressure needs stages with positive limits")
+ self.stages = tuple(stages)
+ self._read_committed = read_committed
+ self._read_ends = read_ends
+
+ def backlog(self) -> dict[str, int]:
+ return {stage.name: stage_backlog(self._read_committed(stage.group, stage.topic),
+ self._read_ends(stage.topic)) for stage in self.stages}
+
+ def __call__(self) -> tuple[bool, dict[str, Any]]:
+ """The edge's history gate: (admitted, detail). Unreadable -> closed."""
+
+ try:
+ backlog = self.backlog()
+ except Exception as error: # noqa: BLE001 - an unknown backlog never admits history
+ return False, {"error": f"{type(error).__name__}: {error}"[:200]}
+ over = {stage.name: backlog[stage.name] for stage in self.stages if backlog[stage.name] > stage.limit_records}
+ return not over, {"backlog": backlog, "over": over}
+
+
+def kafka_backlog_from_environment(environ: Mapping[str, str], stages: Sequence[Stage]) -> KafkaStageBacklog:
+ """Production metadata reads share the BAR publisher's mTLS identity."""
+ root = environ.get("QDL_KAFKA_CERT_ROOT", "").strip()
+ if not root:
+ raise ValueError("history backpressure requires the Kafka TLS cert root")
+ security = {"security.protocol": "ssl"}
+ for option, filename in (("ssl.ca.location", "ca.crt"),
+ ("ssl.certificate.location", "client.crt"),
+ ("ssl.key.location", "client.key")):
+ path = Path(root) / filename
+ if not path.is_file():
+ raise ValueError(f"history backpressure TLS file unavailable: {path}")
+ security[option] = str(path)
+ return kafka_backlog_from_config(environ["QDL_STABLE_BAR_BACKPRESSURE_BOOTSTRAP"], stages, security)
+
+
+def kafka_backlog_from_config(bootstrap: str, stages: Sequence[Stage],
+ security: Mapping[str, str] | None = None) -> KafkaStageBacklog:
+ """Wire the gate to a broker with confluent-kafka (admin group offsets + watermarks)."""
+
+ from confluent_kafka import Consumer, ConsumerGroupTopicPartitions, TopicPartition
+ from confluent_kafka.admin import AdminClient
+
+ config = {"bootstrap.servers": bootstrap, **dict(security or {})}
+ admin = AdminClient(config)
+ metadata = Consumer({**config, "group.id": "kn-history-backpressure-metadata", "enable.auto.commit": False})
+ partitions: dict[str, list[int]] = {}
+
+ def topic_partitions(topic: str) -> list[int]:
+ if topic not in partitions:
+ partitions[topic] = sorted(metadata.list_topics(topic, timeout=10).topics[topic].partitions)
+ return partitions[topic]
+
+ def read_committed(group: str, topic: str) -> dict[int, int]:
+ request = ConsumerGroupTopicPartitions(group, [TopicPartition(topic, p) for p in topic_partitions(topic)])
+ result = admin.list_consumer_group_offsets([request])[group].result(10)
+ return {item.partition: item.offset for item in result.topic_partitions if item.offset >= 0}
+
+ def read_ends(topic: str) -> dict[int, int]:
+ return {p: metadata.get_watermark_offsets(TopicPartition(topic, p), timeout=10)[1]
+ for p in topic_partitions(topic)}
+
+ return KafkaStageBacklog(stages, read_committed=read_committed, read_ends=read_ends)
diff --git a/qdl/runtime/kn_bar_readback.py b/qdl/runtime/kn_bar_readback.py
new file mode 100644
index 00000000..673dbca6
--- /dev/null
+++ b/qdl/runtime/kn_bar_readback.py
@@ -0,0 +1,355 @@
+"""KN-3 K3.6 BAR-edge readback from the Kafka-native market cache (decision D16b).
+
+Purpose: the BAR edge asks one question of the durable cache before it
+publishes provider history - "which of these opens of this binding are
+already durable final bars?" (``StableBinanceBarEdge._durable_final_bar_opens``).
+Today the answer comes from the canonical SQLite spool; this adapter answers
+the same question, with the same contract, from the market cache that the
+Rust projector stage B writes (``rust/qdl-projector/src/cache.rs`` +
+``apply.lua``):
+
+* product identity: the binding's ``LogicalProductKey`` built with exactly the
+ rule of the gateway bundle (``scripts/kn_gateway_bundle.py``), so edge,
+ Stream and projector name one product identically;
+* only the published READY generation is read (``ptr:`` field ``ready``);
+ a product without one is ``KnBarReadbackNotReady`` (fail closed) - except a
+ product that was never materialized in a built cache (KN-4 D47-1): no
+ pointer at all while stage B's checkpoint of the product's state partition
+ exists (a finished build always records it, ``stage_b.rs``
+ ``apply_pointer_ops``). That product holds nothing durable, so the answer is
+ empty and the edge fills it from the venue. A staging-only pointer
+ (rebuilding), a missing checkpoint (cache lost or still building) or a
+ Redis error never reads as empty;
+* only the asked opens are read: one ``HMGET`` per bucket
+ ``b:::`` with
+ ``BUCKET_OPENS`` = 112 (no SCAN/KEYS);
+* every returned row is decoded with ``decode_bar_row`` (trailer hash proven)
+ and must be a BAR of the binding's full identity (the same predicate as the
+ SQLite path, ``bar_envelope_matches_binding``) at the asked open; anything
+ else fails closed;
+* an open counts only when ``is_final`` and lifecycle FINAL/REVISED;
+* the pointer is read before and after; a READY generation (or fence) change
+ during the read raises, like ``_assert_canonical_cache_identity``.
+
+``cache_identity`` is the cache *epoch* (KN-4 D47-1): 32 hex over the
+environment, the bars topic and the state partitions of a binding set, valid
+only while stage B's checkpoint of each of those partitions exists. It does
+not change when one product becomes READY or is rebuilt - durable history
+lives in the compacted bars topic and a rebuild restores it - so the edge never
+rebases every binding because one product changed. ``generation_identities``
+gives each binding's READY generation in one round trip for the edge's
+per-product check.
+
+Boundary: read-only (``HMGET`` only, never a write), no key enumeration,
+bounded by the asked opens. The Redis client is injected; this module never
+touches the control/quota Redis. Selected by configuration in
+``stable_bar_edge.build_from_environment`` (``QDL_STABLE_BAR_READBACK=kn3``);
+the SQLite path stays the default until cutover (KN-5).
+"""
+from __future__ import annotations
+
+from collections import defaultdict
+from dataclasses import dataclass
+import hashlib
+from typing import Any, Iterable, Mapping
+
+from qdl.adapters.intervals import canonical_interval_ms
+from qdl.common.v1 import common_pb2
+from qdl.marketdata.v2 import market_data_pb2
+from qdl.projection.kn_state_codec import StateCodecError, decode_bar_row, state_partition
+from qdl.projection.state_contract import CacheReadState, LogicalProductKey
+
+# The listpack bucket size of the Rust cache (`cache.rs` BUCKET_OPENS): 112
+# opens (owner decision, Astra KN-3 review R1; the lowest bytes/row of the
+# real-mix sweep, `market_cache.bar_layout` in the KN v2.2.0 budget). Writer,
+# readback and checker must agree or reads miss rows.
+BUCKET_OPENS = 112
+# Buckets per pipeline round trip; 10,000 opens of any fixed interval span at
+# most 91 buckets (12,064 at most 109), so two round trips answer a full
+# warmup window.
+MAX_BUCKETS_PER_ROUND_TRIP = 64
+READBACK_ENV = "QDL_STABLE_BAR_READBACK"
+MARKET_CACHE_URL_ENV = "QDL_KN3_MARKET_CACHE_URL"
+MARKET_CACHE_ENVIRONMENT_ENV = "QDL_KN3_ENVIRONMENT"
+READBACK_BACKENDS = ("sqlite", "kn3")
+_FINAL_LIFECYCLES = frozenset({
+ market_data_pb2.BAR_LIFECYCLE_FINAL,
+ market_data_pb2.BAR_LIFECYCLE_REVISED,
+})
+
+try: # the client library is present in the runtime image; tests may inject a fake
+ from redis.exceptions import RedisError as _RedisError
+except ImportError: # pragma: no cover - host without redis-py
+ _RedisError = OSError
+
+
+class KnBarReadbackError(RuntimeError):
+ """The market cache cannot prove durable coverage (fail closed)."""
+
+
+class KnBarReadbackNotReady(KnBarReadbackError):
+ """The product has no published READY generation (typed NOT_READY)."""
+
+ def __init__(self, lpk: LogicalProductKey, reason: str = "NO_GENERATION") -> None:
+ self.state = CacheReadState.NOT_READY_NO_GENERATION
+ self.lpk = lpk
+ self.reason = reason
+ super().__init__(
+ f"stable BAR market cache product is {self.state.value} ({reason}): {lpk.encode()}")
+
+
+class KnBarReadbackEpochNotReady(KnBarReadbackError):
+ """A state partition of the binding set has no stage-B checkpoint: the cache
+ is lost or still building its first generation (fail closed)."""
+
+
+def binding_product_key(source: Any, environment: str) -> LogicalProductKey:
+ """The binding's LPK: the rule of ``scripts/kn_gateway_bundle.compile_bundle``."""
+
+ identity = source.instrument.identity
+ return LogicalProductKey.for_product(
+ environment=environment, venue=identity.venue, market=identity.market,
+ instrument_uid=identity.instrument_uid, feed=source.feed.value, interval=source.interval,
+ )
+
+
+def bar_envelope_matches_binding(envelope: market_data_pb2.EventEnvelope, source: Any) -> bool:
+ """A BAR of exactly this binding (the SQLite path's identity predicate)."""
+
+ if envelope.WhichOneof("payload") != "bar":
+ return False
+ expected_role = getattr(common_pb2, f"SOURCE_ROLE_{source.source_role}")
+ return (
+ envelope.instrument_uid == source.instrument.instrument_uid
+ and envelope.instrument_id == source.instrument.instrument_id
+ and source.accepts_instrument_revision(envelope.instrument_revision)
+ and envelope.venue == source.instrument.identity.venue
+ and envelope.market == source.instrument.identity.market
+ and envelope.product_type == source.instrument.identity.product_type.value
+ and envelope.native_symbol == source.instrument.native_symbol
+ and envelope.provider == source.provider
+ and envelope.source_id == source.source_id
+ and envelope.source_role == expected_role
+ and envelope.bar.interval == source.interval
+ )
+
+
+def bucket_of(open_ms: int, interval_ms: int) -> int:
+ """``cache.rs`` ``bucket_of``: ``open_ms div (BUCKET_OPENS x interval_ms)``."""
+
+ return open_ms // (BUCKET_OPENS * max(interval_ms, 1))
+
+
+@dataclass(frozen=True)
+class _Pointer:
+ ready: int | None
+ fence: int
+ staging: int | None = None
+
+
+def _decimal(value: Any) -> int | None:
+ if value is None:
+ return None
+ text = value.decode("ascii") if isinstance(value, (bytes, bytearray)) else str(value)
+ if not text.isdigit() or (len(text) > 1 and text[0] == "0"):
+ raise KnBarReadbackError(f"stable BAR market cache pointer field is not a decimal: {text!r}")
+ return int(text)
+
+
+class KnBarReadback:
+ """Read-only durable final-BAR coverage from the KN-3 market cache."""
+
+ def __init__(self, redis_client: Any, environment: str, *, bars_topic: str = "md.bars.v2",
+ bars_partitions: int = 6) -> None:
+ # Validates the environment exactly like an LPK field.
+ LogicalProductKey(environment, "V", "M", "u", "BAR", "1m")
+ if not bars_topic or bars_partitions < 1:
+ raise ValueError("stable BAR readback needs the bars topic and its partition count")
+ self.client = redis_client
+ self.environment = environment
+ self.prefix = f"kn3:{environment}:"
+ self.bars_topic = bars_topic
+ self.bars_partitions = bars_partitions
+
+ # -------------------------------------------------------------- layout (cache.rs)
+
+ def _key(self, *parts: str) -> str:
+ return self.prefix + ":".join(parts)
+
+ def pointer_key(self, lpk: LogicalProductKey) -> str:
+ return self._key("ptr", lpk.encode())
+
+ def bucket_key(self, generation: int, lpk: LogicalProductKey, bucket: int) -> str:
+ return self._key("b", str(generation), lpk.encode(), str(bucket))
+
+ # -------------------------------------------------------------- pointers
+
+ def product_key(self, source: Any) -> LogicalProductKey:
+ return binding_product_key(source, self.environment)
+
+ def _pointers(self, lpks: Iterable[LogicalProductKey]) -> list[_Pointer]:
+ lpks = list(lpks)
+ try:
+ pipe = self.client.pipeline(transaction=False)
+ for lpk in lpks:
+ pipe.hmget(self.pointer_key(lpk), ["ready", "fence", "staging"])
+ replies = pipe.execute()
+ except _RedisError as error:
+ raise KnBarReadbackError("stable BAR durable coverage is unavailable") from error
+ if len(replies) != len(lpks):
+ raise KnBarReadbackError("stable BAR market cache returned a short pointer reply")
+ return [_Pointer(_decimal(ready), _decimal(fence) or 0, _decimal(staging))
+ for ready, fence, staging in replies]
+
+ def state_partition_of(self, lpk: LogicalProductKey) -> int:
+ return state_partition(lpk, self.bars_partitions)
+
+ def checkpoint_key(self, partition: int) -> str:
+ return self._key("ckpt", self.bars_topic, str(partition))
+
+ def _built_partitions(self, partitions: Iterable[int]) -> dict[int, bool]:
+ """Whether stage B has checkpointed each bars state partition."""
+
+ partitions = sorted(set(partitions))
+ try:
+ pipe = self.client.pipeline(transaction=False)
+ for partition in partitions:
+ pipe.hget(self.checkpoint_key(partition), "next")
+ replies = pipe.execute()
+ except _RedisError as error:
+ raise KnBarReadbackError("stable BAR market cache checkpoint is unavailable") from error
+ if len(replies) != len(partitions):
+ raise KnBarReadbackError("stable BAR market cache returned a short checkpoint reply")
+ return {partition: reply is not None for partition, reply in zip(partitions, replies, strict=True)}
+
+ def generation_identity(self, source: Any) -> str:
+ """``kn3::@``; ``@-`` when not READY."""
+
+ lpk = self.product_key(source)
+ pointer = self._pointers([lpk])[0]
+ return self._identity(lpk, pointer)
+
+ def _identity(self, lpk: LogicalProductKey, pointer: _Pointer) -> str:
+ ready = "-" if pointer.ready is None else str(pointer.ready)
+ return f"{self.prefix}{lpk.encode()}@{ready}"
+
+ def cache_identity(self, sources: Iterable[Any]) -> str:
+ """The cache epoch of ``sources``: 32 hex over environment, bars topic and
+ their state partitions, valid only while each partition is built.
+
+ Stands in for the SQLite ``cache_id``. A product becoming READY or being
+ rebuilt does not change it (history lives in the compacted bars topic;
+ a rebuild restores it); a lost or unbuilt partition raises
+ ``KnBarReadbackEpochNotReady`` instead of producing a new identity.
+ """
+
+ lpks = {self.product_key(source) for source in sources}
+ if not lpks:
+ raise KnBarReadbackError("stable BAR market cache identity needs at least one binding")
+ partitions = sorted({self.state_partition_of(lpk) for lpk in lpks})
+ built = self._built_partitions(partitions)
+ missing = [partition for partition, present in built.items() if not present]
+ if missing:
+ raise KnBarReadbackEpochNotReady(
+ f"stable BAR market cache partitions are not built: {self.bars_topic} {missing}")
+ line = f"{self.prefix}|{self.bars_topic}|{self.bars_partitions}|{','.join(map(str, partitions))}"
+ return hashlib.sha256(line.encode("utf-8")).hexdigest()[:32]
+
+ def generation_identities(self, sources: Iterable[Any]) -> dict[str, int | None]:
+ """Binding id -> READY generation (``None`` when not READY), one round trip."""
+
+ sources = list(sources)
+ lpks = [self.product_key(source) for source in sources]
+ pointers = self._pointers(lpks)
+ return {source.binding_id: pointer.ready for source, pointer in zip(sources, pointers, strict=True)}
+
+ # -------------------------------------------------------------- coverage
+
+ def durable_final_bar_opens(self, source: Any, expected_opens: frozenset[int]) -> frozenset[int]:
+ """Opens of ``expected_opens`` that are durable final bars of ``source``."""
+
+ if not expected_opens:
+ return frozenset()
+ if source.feed.value != "BAR" or not source.interval:
+ raise KnBarReadbackError(f"stable BAR readback needs a BAR binding: {source.binding_id}")
+ lpk = self.product_key(source)
+ interval_ms = canonical_interval_ms(source.interval)
+ before = self._pointers([lpk])[0]
+ if before.ready is None:
+ # Staging only: a build/rebuild is materializing it - not provable yet.
+ if before.staging is not None:
+ raise KnBarReadbackNotReady(lpk, "REBUILDING")
+ # No pointer, or only its fence (a staging discarded unpublished,
+ # `apply.lua` op X): never served in this cache.
+ if not self._built_partitions([self.state_partition_of(lpk)])[self.state_partition_of(lpk)]:
+ raise KnBarReadbackNotReady(lpk, "PARTITION_NOT_BUILT")
+ if self._pointers([lpk])[0] != before:
+ raise KnBarReadbackError(f"stable BAR market cache product changed during readback {lpk.encode()}")
+ # Never materialized in a built cache: nothing of it is durable.
+ return frozenset()
+ buckets: dict[int, list[int]] = defaultdict(list)
+ for open_ms in sorted(expected_opens):
+ if isinstance(open_ms, bool) or not isinstance(open_ms, int) or open_ms < 0:
+ raise KnBarReadbackError(f"stable BAR readback open is invalid: {open_ms!r}")
+ buckets[bucket_of(open_ms, interval_ms)].append(open_ms)
+ covered: set[int] = set()
+ ordered = sorted(buckets.items())
+ for start in range(0, len(ordered), MAX_BUCKETS_PER_ROUND_TRIP):
+ chunk = ordered[start:start + MAX_BUCKETS_PER_ROUND_TRIP]
+ try:
+ pipe = self.client.pipeline(transaction=False)
+ for bucket, opens in chunk:
+ pipe.hmget(self.bucket_key(before.ready, lpk, bucket), [str(item) for item in opens])
+ replies = pipe.execute()
+ except _RedisError as error:
+ raise KnBarReadbackError("stable BAR durable coverage is unavailable") from error
+ if len(replies) != len(chunk):
+ raise KnBarReadbackError("stable BAR market cache returned a short bucket reply")
+ for (_bucket, opens), rows in zip(chunk, replies, strict=True):
+ if len(rows) != len(opens):
+ raise KnBarReadbackError("stable BAR market cache returned a short row reply")
+ for open_ms, row in zip(opens, rows, strict=True):
+ if row is not None and self._final_row(source, lpk, open_ms, row):
+ covered.add(open_ms)
+ after = self._pointers([lpk])[0]
+ if (after.ready, after.fence) != (before.ready, before.fence):
+ raise KnBarReadbackError(
+ "stable BAR market cache generation changed during readback "
+ f"{self._identity(lpk, before)} -> {self._identity(lpk, after)}"
+ )
+ return frozenset(covered)
+
+ @staticmethod
+ def _final_row(source: Any, lpk: LogicalProductKey, open_ms: int, row: bytes) -> bool:
+ try:
+ decoded = decode_bar_row(bytes(row), lpk)
+ envelope = market_data_pb2.EventEnvelope.FromString(decoded.canonical)
+ except (StateCodecError, ValueError) as error:
+ raise KnBarReadbackError(
+ f"stable BAR market cache row is unreadable binding={source.binding_id} open_ms={open_ms}"
+ ) from error
+ if not bar_envelope_matches_binding(envelope, source):
+ raise KnBarReadbackError(
+ f"stable BAR market cache row differs from its binding binding={source.binding_id} open_ms={open_ms}"
+ )
+ if envelope.bar.open_time_ns != open_ms * 1_000_000:
+ raise KnBarReadbackError(
+ f"stable BAR market cache row is filed under another open binding={source.binding_id} open_ms={open_ms}"
+ )
+ return envelope.bar.is_final and envelope.bar.lifecycle in _FINAL_LIFECYCLES
+
+
+def readback_from_environment(environ: Mapping[str, str]) -> KnBarReadback:
+ """Build the market-cache readback from ``QDL_KN3_MARKET_CACHE_URL``/``QDL_KN3_ENVIRONMENT``."""
+
+ url = environ.get(MARKET_CACHE_URL_ENV, "").strip()
+ environment = environ.get(MARKET_CACHE_ENVIRONMENT_ENV, "").strip()
+ if not url or not environment:
+ raise ValueError(
+ f"{READBACK_ENV}=kn3 requires {MARKET_CACHE_URL_ENV} and {MARKET_CACHE_ENVIRONMENT_ENV}"
+ )
+ import redis
+
+ return KnBarReadback(redis.Redis.from_url(url, decode_responses=False), environment,
+ bars_topic=environ.get("QDL_KN_BARS_TOPIC", "md.bars.v2").strip() or "md.bars.v2",
+ bars_partitions=int(environ.get("QDL_KN_BARS_PARTITIONS", "6")))
diff --git a/qdl/runtime/kn_market_cache.py b/qdl/runtime/kn_market_cache.py
new file mode 100644
index 00000000..7d9dde2e
--- /dev/null
+++ b/qdl/runtime/kn_market_cache.py
@@ -0,0 +1,598 @@
+"""KN-4 K4.1 read-only product views of the Kafka-native market cache (D25-D27).
+
+Purpose: the one place Python Query reads the market cache that the Rust
+projector stage B writes (``rust/qdl-projector/src/cache.rs`` + ``apply.lua``).
+It answers two questions per logical product, always from the product's
+published READY generation and always with a provable source boundary:
+
+* ``latest(lpk)`` - the product's latest entry ``l::`` (trailer +
+ full canonical bytes, canonical ``t/p/o``), read by one short read-only Lua
+ call together with the pointer and the source watermark;
+* ``bars(lpk, interval_ms, ...)`` - the BAR rows of the last ``N`` opens or of
+ an open-time range: one read-only Lua call for pointer, product source and
+ BAR meta, pipelined ``HGETALL`` of only the buckets the window needs (at
+ most ``MAX_BUCKETS_PER_ROUND_TRIP`` per round trip), then the pointer again.
+
+Source boundary (D27): ``offset`` is the highest canonical offset ``X`` of the
+product's canonical ``(topic id, partition)`` such that every fact of the
+product at ``<= X`` is in the view. Stage B raises the watermark field
+``s||`` of the state partition's ``ckpt`` hash in the
+script of each live batch; a state partition receives a product's frames in
+canonical order, so the watermark read *before* the data bounds the data.
+Latest: ``max(watermark, l:o)`` read atomically. BAR: the watermark read in
+the head call; a row whose trailer offset is above it proves the product
+changed during the read (its re-delivery on the stream would be a duplicate,
+never a gap), so the read is retried and, if it keeps changing, returned with
+``changed=True``. A BAR product without a canonical coordinate yet (legacy
+rows only) has no provable boundary: ``SOURCE_BOUNDARY_UNKNOWN``.
+
+Consistency (D26): a pointer (ready, fence) change between head and tail is
+retried (``attempts``) and then refused typed-retryable; rows of two
+generations are never merged. Every row is decoded with the state codec
+(trailer hash proven) and must sit under its own open.
+
+Boundary: read-only (Lua scripts carry ``flags=no-writes``; no SCAN/KEYS, no
+write), bounded by the requested window; the Redis client is injected and is
+never the control/quota Redis. No Kafka access.
+"""
+from __future__ import annotations
+
+from dataclasses import dataclass
+import json
+from typing import Any, Callable, Mapping
+
+from qdl.query.cold_work import cold_yield
+
+from qdl.projection.kn_state_codec import (
+ StateCodecError,
+ decode_bar_row,
+ decode_latest_value,
+ state_partition,
+)
+from qdl.projection.state_contract import MAX_OFFSET, LogicalProductKey
+from qdl.runtime.kn_bar_readback import BUCKET_OPENS, bucket_of
+
+MARKET_CACHE_URL_ENV = "QDL_KN3_MARKET_CACHE_URL"
+MARKET_CACHE_ENVIRONMENT_ENV = "QDL_KN3_ENVIRONMENT"
+LATEST_TOPIC_ENV = "QDL_KN_LATEST_TOPIC"
+BARS_TOPIC_ENV = "QDL_KN_BARS_TOPIC"
+LATEST_PARTITIONS_ENV = "QDL_KN_LATEST_PARTITIONS"
+BARS_PARTITIONS_ENV = "QDL_KN_BARS_PARTITIONS"
+MAX_BUCKETS_PER_ROUND_TRIP = 64
+DEFAULT_ATTEMPTS = 3
+
+try: # the client library is present in the runtime image; tests may inject a fake
+ from redis.exceptions import RedisError as _RedisError
+except ImportError: # pragma: no cover - host without redis-py
+ _RedisError = OSError
+
+# One short read each; never a write (the flag lets Redis run it under OOM).
+_LATEST_READ = """#!lua flags=no-writes
+local prefix, lpk, ckpt = ARGV[1], ARGV[2], ARGV[3]
+local ptr = redis.call('HMGET', prefix .. 'ptr:' .. lpk, 'ready', 'fence')
+if not ptr[1] then
+ return {'NO_GENERATION'}
+end
+local entry = redis.call('HMGET', prefix .. 'l:' .. ptr[1] .. ':' .. lpk, 'v', 't', 'p', 'o')
+if not entry[1] then
+ return {'MISSING', ptr[1], ptr[2] or '0'}
+end
+local mark = redis.call('HGET', ckpt, 's|' .. entry[2] .. '|' .. entry[3])
+return {'OK', ptr[1], ptr[2] or '0', entry[1], entry[2], entry[3], entry[4], mark or ''}
+"""
+
+_BAR_HEAD = """#!lua flags=no-writes
+local prefix, lpk, ckpt = ARGV[1], ARGV[2], ARGV[3]
+local ptr = redis.call('HMGET', prefix .. 'ptr:' .. lpk, 'ready', 'fence')
+if not ptr[1] then
+ return {'NO_GENERATION'}
+end
+local src = redis.call('HMGET', prefix .. 'src:' .. lpk, 't', 'p')
+local mark = ''
+if src[1] and src[2] then
+ mark = redis.call('HGET', ckpt, 's|' .. src[1] .. '|' .. src[2]) or ''
+end
+local meta = redis.call('HMGET', prefix .. 'bm:' .. ptr[1] .. ':' .. lpk,
+ 'floor', 'first', 'last', 'last_final', 'rows')
+return {'OK', ptr[1], ptr[2] or '0', src[1] or '', src[2] or '', mark,
+ meta[1] or '', meta[2] or '', meta[3] or '', meta[4] or '', meta[5] or ''}
+"""
+
+
+_BAR_DIAGNOSTIC = """#!lua flags=no-writes
+local replies, step, floor = {}, tonumber(ARGV[2]), tonumber(ARGV[3])
+for _, key in ipairs(KEYS) do
+ local suffix = string.sub(key, #('kn3:' .. ARGV[1] .. ':b:') + 1)
+ local summary = redis.call('GET', 'kn3:' .. ARGV[1] .. ':bs:' .. suffix)
+ if summary then
+ local ok, s = pcall(cjson.decode, summary)
+ if not ok or type(s) ~= 'table' or s[1] ~= 1 or s[2] ~= step
+ or s[3] ~= redis.call('HLEN', key)
+ or s[3] ~= redis.call('HLEN', 'kn3:' .. ARGV[1] .. ':bd:' .. suffix) then
+ return {'INVALID'}
+ end
+ local spans, flags = {}, {}
+ for _, span in ipairs(s[4]) do
+ if tonumber(span[2]) >= floor then
+ local first = tonumber(span[1])
+ if first < floor then first = first + math.ceil((floor - first) / step) * step end
+ table.insert(spans, {string.format('%.0f', first), span[2]})
+ end
+ end
+ for _, flag in ipairs(s[5]) do
+ if tonumber(flag[1]) >= floor then table.insert(flags, flag) end
+ end
+ table.insert(replies, {spans, flags})
+ else
+ local opens = redis.call('HKEYS', key)
+ local flat = redis.call('HGETALL', 'kn3:' .. ARGV[1] .. ':bd:' .. string.sub(key, #('kn3:' .. ARGV[1] .. ':b:') + 1))
+ if #opens * 2 ~= #flat then return {'MISSING'} end
+ if #opens > tonumber(ARGV[4]) then return {'INVALID'} end
+ local index, values, flags, spans = {}, {}, {}, {}
+ for i = 1, #flat, 2 do index[flat[i]] = flat[i + 1] end
+ for _, opened in ipairs(opens) do
+ local flag, n = index[opened], tonumber(opened)
+ if not flag then return {'MISSING'} end
+ if not string.match(opened, '^%d+$') or (#opened > 1 and string.sub(opened, 1, 1) == '0')
+ or not n or n > 9007199254740991
+ or math.floor(n / step / tonumber(ARGV[4])) ~= tonumber(string.match(key, ':(%d+)$'))
+ or (flag ~= 'N' and string.sub(flag, 1, 1) ~= 'G') then return {'INVALID'} end
+ if n >= floor then
+ table.insert(values, n)
+ if flag ~= 'N' then table.insert(flags, {opened, string.sub(flag, 2)}) end
+ end
+ end
+ table.sort(values)
+ for _, n in ipairs(values) do
+ if #spans > 0 and n == spans[#spans][2] + step then spans[#spans][2] = n
+ else table.insert(spans, {n, n}) end
+ end
+ for _, span in ipairs(spans) do
+ span[1], span[2] = string.format('%.0f', span[1]), string.format('%.0f', span[2])
+ end
+ table.insert(replies, {spans, flags})
+ end
+end
+return {'OK', cjson.encode(replies)}
+"""
+
+
+class KnDiagnosticIndexMissing(RuntimeError):
+ """Older materializer or incomplete index: use the verified row scanner."""
+
+
+class KnCacheError(RuntimeError):
+ """The market cache cannot answer now (typed retryable)."""
+
+
+class KnCacheNotReady(KnCacheError):
+ """The product has no servable view: ``NO_GENERATION``, ``MISSING`` or
+ ``SOURCE_BOUNDARY_UNKNOWN`` (typed DATA_NOT_READY, never an empty OK)."""
+
+ def __init__(self, lpk: LogicalProductKey, state: str) -> None:
+ self.lpk = lpk
+ self.state = state
+ super().__init__(f"market cache product is not ready ({state}): {lpk.encode()}")
+
+
+class KnCacheViewChanged(KnCacheError):
+ """The product's READY generation kept changing during the read."""
+
+
+class KnCacheIntegrityError(RuntimeError):
+ """A cache value failed its trailer/identity check (fail closed)."""
+
+
+@dataclass(frozen=True)
+class SourceBoundary:
+ """The view's canonical source coordinate (cursor v3 ``source_*``)."""
+
+ topic_id: str
+ partition: int
+ offset: int
+
+
+@dataclass(frozen=True)
+class CacheRow:
+ """One cache value: canonical bytes and its canonical offset (``None`` for
+ a legacy-imported BAR row, which has no canonical coordinate)."""
+
+ canonical: bytes
+ source_offset: int | None
+ open_ms: int | None = None
+
+
+@dataclass(frozen=True)
+class ProductView:
+ lpk: LogicalProductKey
+ generation: int
+ fence: int
+ rows: tuple[CacheRow, ...]
+ boundary: SourceBoundary
+ # A row above the boundary: the product changed during the read, so the
+ # stream may re-deliver facts the rows already hold (never a gap).
+ changed: bool = False
+
+
+def _text(value: Any) -> str:
+ if value is None:
+ return ""
+ return value.decode("utf-8") if isinstance(value, (bytes, bytearray)) else str(value)
+
+
+def _decimal(value: Any, what: str) -> int | None:
+ text = _text(value)
+ if text == "":
+ return None
+ if not text.isdigit() or (len(text) > 1 and text[0] == "0"):
+ raise KnCacheIntegrityError(f"market cache {what} is not a decimal: {text!r}")
+ number = int(text)
+ if number > MAX_OFFSET:
+ raise KnCacheIntegrityError(f"market cache {what} exceeds 2^63-1")
+ return number
+
+
+class KnMarketCacheReader:
+ """Consistent, read-only product views of the KN-3 market cache."""
+
+ def __init__(
+ self,
+ client: Any,
+ environment: str,
+ *,
+ latest_topic: str = "md.latest.v2",
+ bars_topic: str = "md.bars.v2",
+ latest_partitions: int = 6,
+ bars_partitions: int = 6,
+ attempts: int = DEFAULT_ATTEMPTS,
+ ) -> None:
+ # Validates the environment exactly like an LPK field.
+ LogicalProductKey(environment, "V", "M", "u", "BAR", "1m")
+ if min(latest_partitions, bars_partitions) < 1 or attempts < 1:
+ raise ValueError("market cache partitions and attempts must be positive")
+ for topic in (latest_topic, bars_topic):
+ if not topic or ":" in topic:
+ raise ValueError("market cache state topic name is invalid")
+ self.client = client
+ self.environment = environment
+ self.prefix = f"kn3:{environment}:"
+ self.latest_topic = latest_topic
+ self.bars_topic = bars_topic
+ self.latest_partitions = latest_partitions
+ self.bars_partitions = bars_partitions
+ self.attempts = attempts
+ self._latest_script = client.register_script(_LATEST_READ)
+ self._bar_head_script = client.register_script(_BAR_HEAD)
+ self._bar_diagnostic_script = client.register_script(_BAR_DIAGNOSTIC)
+
+ # ---------------------------------------------------------------- layout
+
+ def checkpoint_key(self, topic: str, partition: int) -> str:
+ return f"{self.prefix}ckpt:{topic}:{partition}"
+
+ def bucket_key(self, generation: int, lpk: LogicalProductKey, bucket: int) -> str:
+ return f"{self.prefix}b:{generation}:{lpk.encode()}:{bucket}"
+
+ def pointer_key(self, lpk: LogicalProductKey) -> str:
+ return f"{self.prefix}ptr:{lpk.encode()}"
+
+ def _call(self, script, lpk: LogicalProductKey, ckpt: str) -> list[Any]:
+ try:
+ reply = script(keys=[], args=[self.prefix, lpk.encode(), ckpt])
+ except _RedisError as error:
+ raise KnCacheError("market cache is unavailable") from error
+ if not isinstance(reply, list) or not reply:
+ raise KnCacheError("market cache returned a malformed read reply")
+ return reply
+
+ # ---------------------------------------------------------------- health
+
+ def ping(self) -> bool:
+ try:
+ return bool(self.client.ping())
+ except _RedisError:
+ return False
+
+ def ready_generations(self, lpks: list[LogicalProductKey]) -> list[int | None]:
+ """The READY generation of each product (one pipelined round trip)."""
+
+ try:
+ pipe = self.client.pipeline(transaction=False)
+ for lpk in lpks:
+ pipe.hget(self.pointer_key(lpk), "ready")
+ replies = pipe.execute()
+ except _RedisError as error:
+ raise KnCacheError("market cache is unavailable") from error
+ return [_decimal(value, "pointer") for value in replies]
+
+ # ---------------------------------------------------------------- latest
+
+ def latest(self, lpk: LogicalProductKey) -> ProductView:
+ if lpk.feed == "BAR":
+ raise ValueError("a BAR product has no latest entry; read bars()")
+ q = state_partition(lpk, self.latest_partitions)
+ reply = self._call(self._latest_script, lpk, self.checkpoint_key(self.latest_topic, q))
+ status = _text(reply[0])
+ if status == "NO_GENERATION":
+ raise KnCacheNotReady(lpk, "NO_GENERATION")
+ if status == "MISSING":
+ raise KnCacheNotReady(lpk, "MISSING")
+ if status != "OK" or len(reply) != 8:
+ raise KnCacheError("market cache returned a malformed latest reply")
+ generation = _decimal(reply[1], "generation")
+ fence = _decimal(reply[2], "fence") or 0
+ topic_id = _text(reply[4])
+ partition = _decimal(reply[5], "latest partition")
+ offset = _decimal(reply[6], "latest offset")
+ mark = _decimal(reply[7], "source watermark")
+ if generation is None or not topic_id or partition is None or offset is None:
+ raise KnCacheIntegrityError(f"market cache latest entry is incomplete: {lpk.encode()}")
+ try:
+ decoded = decode_latest_value(bytes(reply[3]))
+ except (StateCodecError, TypeError) as error:
+ raise KnCacheIntegrityError(
+ f"market cache latest value failed its trailer check: {lpk.encode()}"
+ ) from error
+ if decoded.source_offset != offset:
+ raise KnCacheIntegrityError(
+ f"market cache latest trailer offset differs from its coordinate: {lpk.encode()}"
+ )
+ boundary = SourceBoundary(topic_id, partition, max(offset, mark or 0))
+ return ProductView(
+ lpk, generation, fence,
+ (CacheRow(decoded.canonical, decoded.source_offset),),
+ boundary,
+ )
+
+ # ---------------------------------------------------------------- bars
+
+ def bars(
+ self,
+ lpk: LogicalProductKey,
+ interval_ms: int,
+ *,
+ last: int | None = None,
+ start_ms: int | None = None,
+ end_ms: int | None = None,
+ check_budget: Callable[[], None] | None = None,
+ ) -> ProductView:
+ """Rows of the last ``last`` opens, or of opens in ``[start_ms, end_ms)``."""
+
+ if lpk.feed != "BAR" or interval_ms < 1:
+ raise ValueError("bars() needs a BAR product and a positive interval")
+ if (last is None) == (start_ms is None) or (start_ms is None) != (end_ms is None):
+ raise ValueError("bars() takes either last or a start/end range")
+ if last is not None and last < 1:
+ raise ValueError("bars() last must be positive")
+ if start_ms is not None and (start_ms < 0 or end_ms <= start_ms):
+ raise ValueError("bars() range is empty")
+ ckpt = self.checkpoint_key(self.bars_topic, state_partition(lpk, self.bars_partitions))
+ view: ProductView | None = None
+ for _attempt in range(self.attempts):
+ if check_budget is not None:
+ check_budget()
+ head = self._bar_head(lpk, ckpt)
+ generation, fence, boundary, low, high = head
+ rows: dict[int, CacheRow] = {}
+ if high is not None:
+ rows = self._read_rows(lpk, generation, interval_ms, low, high,
+ last=last, start_ms=start_ms, end_ms=end_ms, check_budget=check_budget)
+ tail = self._bar_head(lpk, ckpt)
+ if (tail[0], tail[1]) != (generation, fence):
+ continue
+ # Opens below the retained floor are never served (the floor op
+ # deletes them; a reader never depends on that having happened).
+ ordered = tuple(rows[open_ms] for open_ms in sorted(rows) if open_ms >= low)
+ if last is not None:
+ ordered = ordered[-last:]
+ changed = any(
+ row.source_offset is not None and row.source_offset > boundary.offset
+ for row in ordered
+ )
+ view = ProductView(lpk, generation, fence, ordered, boundary, changed)
+ if not changed:
+ return view
+ if view is None:
+ raise KnCacheViewChanged(
+ f"market cache READY generation kept changing during the read: {lpk.encode()}"
+ )
+ return view
+
+ def bar_diagnostics(self, lpk, interval_ms, *, last, check_budget):
+ """Expanded oracle view; production diagnostics use compact ranges."""
+ boundary, spans, flags = self.bar_diagnostic_ranges(
+ lpk, interval_ms, last=last, check_budget=check_budget)
+ sequences = dict(flags)
+ return boundary, tuple((opened, sequences.get(opened)) for first, end in spans
+ for opened in range(first, end + interval_ms, interval_ms))
+
+ def bar_diagnostic_ranges(self, lpk, interval_ms, *, last, check_budget):
+ """Atomically materialized runs, with exact legacy-index scan fallback.
+
+ Run summaries are written by the same Rust transaction as rows/index.
+ The bounded read-only script checks counts; legacy indexes check every key.
+ Complete head/floor/source fences still surround the reads. Each script
+ examines at most eight buckets to avoid monopolizing hot Redis reads.
+ """
+ if lpk.feed != "BAR" or interval_ms < 1 or last < 1:
+ raise ValueError("BAR diagnostics requires a bounded BAR window")
+ ckpt = self.checkpoint_key(self.bars_topic, state_partition(lpk, self.bars_partitions))
+ for _attempt in range(self.attempts):
+ check_budget()
+ head = self._bar_head(lpk, ckpt)
+ generation, _fence, boundary, low, high = head
+ spans, flags, count = [], [], 0
+ if high is not None:
+ top, bottom = bucket_of(high, interval_ms), bucket_of(low, interval_ms)
+ while top >= bottom and count < last:
+ check_budget()
+ start = max(bottom, top - MAX_BUCKETS_PER_ROUND_TRIP + 1)
+ keys = [self.bucket_key(generation, lpk, b) for b in range(start, top + 1)]
+ try:
+ with self.client.pipeline(transaction=False) as pipe:
+ for begin in range(0, len(keys), 8):
+ self._bar_diagnostic_script(keys=keys[begin:begin + 8],
+ args=[self.environment, interval_ms, low, BUCKET_OPENS], client=pipe)
+ replies = pipe.execute()
+ except _RedisError as error:
+ raise KnCacheError("market cache diagnostic unavailable") from error
+ for reply in replies:
+ check_budget()
+ if reply == [b"MISSING"]:
+ raise KnDiagnosticIndexMissing(lpk.encode())
+ if not isinstance(reply, list) or len(reply) != 2 or _text(reply[0]) != "OK":
+ raise KnCacheIntegrityError("malformed diagnostic bucket")
+ try:
+ buckets = json.loads(reply[1])
+ for runs, sequences in buckets:
+ for first, end in runs:
+ first, end = _decimal(first, "range start"), _decimal(end, "range end")
+ if first is None or end is None or end < first:
+ raise ValueError("invalid range")
+ spans.append((first, end))
+ count += (end - first) // interval_ms + 1
+ flags.extend((int(opened), sequence) for opened, sequence in sequences)
+ except (ValueError, TypeError) as error:
+ raise KnCacheIntegrityError("malformed diagnostic bulk reply") from error
+ top = start - 1
+ check_budget()
+ if self._bar_head(lpk, ckpt) != head:
+ continue
+ selected, remaining = [], last
+ for first, end in sorted(spans, reverse=True):
+ rows = min(remaining, (end - first) // interval_ms + 1)
+ selected.append((end - (rows - 1) * interval_ms, end))
+ remaining -= rows
+ if remaining == 0:
+ break
+ selected.reverse()
+ lower = selected[0][0] if selected else 0
+ return boundary, tuple(selected), tuple((o, seq) for o, seq in flags if o >= lower)
+ raise KnCacheViewChanged("diagnostic source/generation changed during scan")
+
+ def _bar_head(
+ self, lpk: LogicalProductKey, ckpt: str
+ ) -> tuple[int, int, SourceBoundary, int | None, int | None]:
+ reply = self._call(self._bar_head_script, lpk, ckpt)
+ status = _text(reply[0])
+ if status == "NO_GENERATION":
+ raise KnCacheNotReady(lpk, "NO_GENERATION")
+ if status != "OK" or len(reply) != 11:
+ raise KnCacheError("market cache returned a malformed BAR head reply")
+ generation = _decimal(reply[1], "generation")
+ fence = _decimal(reply[2], "fence") or 0
+ topic_id = _text(reply[3])
+ partition = _decimal(reply[4], "product partition")
+ mark = _decimal(reply[5], "source watermark")
+ if generation is None:
+ raise KnCacheIntegrityError(f"market cache pointer is malformed: {lpk.encode()}")
+ if not topic_id or partition is None or mark is None:
+ raise KnCacheNotReady(lpk, "SOURCE_BOUNDARY_UNKNOWN")
+ floor = _decimal(reply[6], "BAR floor")
+ first = _decimal(reply[7], "BAR first")
+ high = _decimal(reply[8], "BAR last")
+ low = max(value for value in (floor, first, 0) if value is not None)
+ return generation, fence, SourceBoundary(topic_id, partition, mark), low, high
+
+ def _read_rows(
+ self,
+ lpk: LogicalProductKey,
+ generation: int,
+ interval_ms: int,
+ low: int,
+ high: int,
+ *,
+ last: int | None,
+ start_ms: int | None,
+ end_ms: int | None,
+ check_budget: Callable[[], None] | None = None,
+ ) -> dict[int, CacheRow]:
+ lowest = bucket_of(low, interval_ms)
+ rows: dict[int, CacheRow] = {}
+ if start_ms is not None:
+ first_bucket = max(bucket_of(start_ms, interval_ms), lowest)
+ last_bucket = min(bucket_of(max(end_ms - 1, 0), interval_ms), bucket_of(high, interval_ms))
+ buckets = list(range(first_bucket, last_bucket + 1))
+ for index in range(0, len(buckets), MAX_BUCKETS_PER_ROUND_TRIP):
+ self._fetch(lpk, generation, buckets[index:index + MAX_BUCKETS_PER_ROUND_TRIP], rows, interval_ms=interval_ms, check_budget=check_budget)
+ return {open_ms: row for open_ms, row in rows.items() if start_ms <= open_ms < end_ms}
+ assert last is not None
+ top = bucket_of(high, interval_ms)
+ # Contiguous opens need ceil(last / BUCKET_OPENS) + 1 buckets; missing
+ # opens extend the walk downward, never below the retained floor.
+ want = min(-(-last // BUCKET_OPENS) + 1, MAX_BUCKETS_PER_ROUND_TRIP)
+ while top >= lowest and len(rows) < last:
+ bottom = max(lowest, top - want + 1)
+ self._fetch(lpk, generation, list(range(bottom, top + 1)), rows, interval_ms=interval_ms, check_budget=check_budget)
+ top = bottom - 1
+ want = MAX_BUCKETS_PER_ROUND_TRIP
+ return rows
+
+ def _fetch(
+ self,
+ lpk: LogicalProductKey,
+ generation: int,
+ buckets: list[int],
+ rows: dict[int, CacheRow],
+ *,
+ interval_ms: int,
+ check_budget: Callable[[], None] | None = None,
+ ) -> None:
+ cold_yield()
+ if check_budget is not None:
+ check_budget()
+ if not buckets:
+ return
+ try:
+ pipe = self.client.pipeline(transaction=False)
+ for bucket in buckets:
+ pipe.hgetall(self.bucket_key(generation, lpk, bucket))
+ replies = pipe.execute()
+ except _RedisError as error:
+ raise KnCacheError("market cache is unavailable") from error
+ if len(replies) != len(buckets):
+ raise KnCacheError("market cache returned a short bucket reply")
+ for bucket, fields in zip(buckets, replies, strict=True):
+ for raw_open, raw_row in fields.items():
+ cold_yield()
+ if check_budget is not None:
+ check_budget()
+ open_ms = _decimal(raw_open, "BAR open")
+ try:
+ if open_ms is None or bucket_of(open_ms, interval_ms) != bucket:
+ raise StateCodecError("OPEN_TIME_BUCKET_MISMATCH")
+ decoded = decode_bar_row(bytes(raw_row), lpk, expected_open_ms=open_ms)
+ except (StateCodecError, TypeError, ValueError) as error:
+ raise KnCacheIntegrityError(
+ f"market cache BAR row failed its trailer check: {lpk.encode()} open_ms={open_ms}"
+ ) from error
+ rows[open_ms] = CacheRow(
+ decoded.canonical,
+ None if decoded.source_offset == MAX_OFFSET else decoded.source_offset,
+ open_ms,
+ )
+
+
+def reader_from_environment(environ: Mapping[str, str]) -> KnMarketCacheReader:
+ """Build the reader from ``QDL_KN3_MARKET_CACHE_URL``/``QDL_KN3_ENVIRONMENT``
+ and the state-topic names/partition counts (``QDL_KN_*``, projector names)."""
+
+ url = environ.get(MARKET_CACHE_URL_ENV, "").strip()
+ environment = environ.get(MARKET_CACHE_ENVIRONMENT_ENV, "").strip()
+ if not url or not environment:
+ raise ValueError(
+ f"the kn3 Query backend requires {MARKET_CACHE_URL_ENV} and {MARKET_CACHE_ENVIRONMENT_ENV}"
+ )
+ import redis
+
+ client = redis.Redis.from_url(
+ url, decode_responses=False, socket_timeout=5.0, socket_connect_timeout=2.0,
+ health_check_interval=30,
+ )
+ return KnMarketCacheReader(
+ client, environment,
+ latest_topic=environ.get(LATEST_TOPIC_ENV, "md.latest.v2"),
+ bars_topic=environ.get(BARS_TOPIC_ENV, "md.bars.v2"),
+ latest_partitions=int(environ.get(LATEST_PARTITIONS_ENV, "6")),
+ bars_partitions=int(environ.get(BARS_PARTITIONS_ENV, "6")),
+ )
diff --git a/qdl/runtime/kn_query_backend.py b/qdl/runtime/kn_query_backend.py
new file mode 100644
index 00000000..ad6b27d9
--- /dev/null
+++ b/qdl/runtime/kn_query_backend.py
@@ -0,0 +1,702 @@
+"""KN-4 K4.1 Query backend over the Kafka-native market cache (decisions D25-D28).
+
+Purpose: serve the existing Query API from the market cache the Rust
+projector writes, without a second semantic owner. ``KnMarketCacheQueryBackend``
+subclasses ``StableSpoolQueryBackend``: request windows, record selection,
+lineage validation, gap detection, quality (``evaluate_binding_quality``),
+item projection and the public history/coverage rules are the unchanged
+spool code. Only the record source differs: each product's view comes from
+``KnMarketCacheReader`` (one READY generation, a proven source boundary),
+never from SQLite or Kafka.
+
+Semantics that differ from the spool because the cache differs (D25/D27):
+
+* one row per BAR open (the KN-3 revision rule), so a revised BAR is never
+ returned twice;
+* a latest-state product (every non-BAR feed) keeps only its latest record;
+ its history is that one record (every declared non-BAR requirement has
+ ``warmup_limit`` 0 and the SDK consumers read ``data[-1]``);
+* every item and the history carry the view's source boundary as
+ ``watermark_offset`` - the SDK starts the stream handoff there - and the
+ cursor placeholder ``kn3-source:::`` that only
+ ``KnCursorV3Issuer`` turns into a signed cursor v3 (the placeholder never
+ leaves the process: the issuer refuses anything else);
+* ``snapshot_id`` hashes (product, topic id, partition, boundary); the cache
+ generation never enters it (contract section 5).
+
+``KnCursorV3Issuer`` signs with the Stream's own key set and expectation
+(same env names as ``qdl-stream-gateway``: ``QDL_KN_CURSOR_KEYS_FILE``,
+``QDL_KN_CURSOR_ACTIVE_KEY_ID``, ``QDL_KN_TOPIC_ID``,
+``QDL_KN_PARTITION_PLAN_EPOCH``, ``QDL_KN_ROUTE_GENERATION``,
+``QDL_KN_CURSOR_TTL_SECONDS``): Query issues, Stream verifies.
+
+Boundary: read-only; no Kafka reader, no SQLite, no write to any Redis.
+Selected by ``QDL_STABLE_QUERY_BACKEND=kn3`` (``qdl/runtime/stable.py``); the
+spool stays the default until the KN-5 cutover.
+"""
+from __future__ import annotations
+
+from dataclasses import dataclass, fields, replace
+import hashlib
+import json
+from pathlib import Path
+import re
+import time
+from typing import Callable, Mapping
+
+from qdl.adapters.intervals import canonical_interval_ms
+from qdl.common.v1 import common_pb2
+from qdl.marketdata.v2 import market_data_pb2
+from qdl.query import DataRequirement, FeedType, GapRecord, HistoryResult, MarketDataItem, RecoveryPolicy
+from qdl.query.contracts import CanonicalErrorCode, QueryProblem
+from qdl.query.results import NON_REPLAYABLE_STREAM_CURSOR, QueryBackendError, GapScanResult
+from qdl.query.row_cache import BoundedRowCache
+from qdl.replay.cursor_v3 import CursorV3Claims, SignedCursorV3Codec, requirement_digest
+from qdl.runtime.kn_bar_readback import binding_product_key
+from qdl.runtime.kn_market_cache import (
+ KnCacheError,
+ KnCacheIntegrityError,
+ KnCacheNotReady,
+ KnMarketCacheReader,
+ ProductView,
+)
+from qdl.runtime.stable_capacity import (
+ STABLE_GAP_DIAGNOSTIC_MAX_EXPECTED_BARS,
+ STABLE_GAP_DIAGNOSTIC_MAX_PAGE_PAYLOAD_BYTES,
+ STABLE_GAP_DIAGNOSTIC_MAX_RESULTS,
+ STABLE_GAP_DIAGNOSTIC_MAX_WORK_MS,
+ STABLE_GAP_DIAGNOSTIC_PAGE_ROWS,
+ STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW,
+)
+from qdl.runtime.stable_catalog import StableSourceBinding, StableSourceCatalog
+from qdl.runtime.stable_source import (
+ StableSpoolQueryBackend,
+ _GapDiagnosticIncomplete,
+ _interval_ns,
+ _ParsedStoredEvent,
+)
+from qdl.domain.calendar import trading_calendar_for_id
+from qdl.transport import Cursor, StoredEvent
+from qdl.transport.contracts import DurableEvent
+
+PLACEHOLDER_PREFIX = "kn3-source:"
+_PLACEHOLDER = re.compile(r"kn3-source:([A-Za-z0-9._@|+=-]{1,256}):([0-9]{1,10}):([0-9]{1,19})")
+QUERY_BACKEND_ENV = "QDL_STABLE_QUERY_BACKEND"
+QUERY_BACKENDS = ("spool", "kn3")
+CURSOR_KEYS_FILE_ENV = "QDL_KN_CURSOR_KEYS_FILE"
+CURSOR_ACTIVE_KEY_ENV = "QDL_KN_CURSOR_ACTIVE_KEY_ID"
+TOPIC_ID_ENV = "QDL_KN_TOPIC_ID"
+PARTITION_PLAN_EPOCH_ENV = "QDL_KN_PARTITION_PLAN_EPOCH"
+ROUTE_GENERATION_ENV = "QDL_KN_ROUTE_GENERATION"
+CURSOR_TTL_ENV = "QDL_KN_CURSOR_TTL_SECONDS"
+DEFAULT_ROW_CACHE_ENTRIES = 20_000
+# Item fields rebuilt per request (time/request dependent); never cached.
+_DYNAMIC_ITEM_FIELDS = frozenset({"quality", "watermark_offset", "cursor", "snapshot_id", "render_key"})
+
+
+@dataclass
+class _RowEntry:
+ """Derivations of one immutable row (D30): its envelope, whether its
+ lineage was proven against the catalog binding, and its static item
+ fields. Quality, cursor and watermark are not here."""
+
+ envelope: market_data_pb2.EventEnvelope
+ validated: bool = False
+ static: dict | None = None
+
+
+def source_placeholder(view: ProductView) -> str:
+ boundary = view.boundary
+ return f"{PLACEHOLDER_PREFIX}{boundary.topic_id}:{boundary.partition}:{boundary.offset}"
+
+
+def parse_placeholder(value: str | None) -> tuple[str, int, int]:
+ match = _PLACEHOLDER.fullmatch(value or "")
+ if match is None:
+ raise ValueError("kn3 Query cursor has no source coordinate to sign")
+ return match.group(1), int(match.group(2)), int(match.group(3))
+
+
+def view_snapshot_id(view: ProductView) -> str:
+ boundary = view.boundary
+ digest = hashlib.sha256(
+ f"kn3|{view.lpk.encode()}|{boundary.topic_id}|{boundary.partition}|{boundary.offset}".encode()
+ ).hexdigest()
+ return f"qdl-v2-{digest[:32]}"
+
+
+def _not_ready(detail: str) -> QueryBackendError:
+ return QueryBackendError(QueryProblem(
+ CanonicalErrorCode.DATA_NOT_READY, detail, True, retry_after_ms=1_000,
+ ))
+
+
+class KnMarketCacheQueryBackend(StableSpoolQueryBackend):
+ """The stable Query semantics over the KN-3 market cache."""
+
+ def __init__(
+ self,
+ reader: KnMarketCacheReader,
+ catalog: StableSourceCatalog,
+ *,
+ schema_digest: str,
+ topic_id: str,
+ config_revision: int = 1,
+ session_liveness_root: str | None = None,
+ clock_ns=time.time_ns,
+ monotonic_ns=time.monotonic_ns,
+ gap_scan_max_results: int = STABLE_GAP_DIAGNOSTIC_MAX_RESULTS,
+ gap_scan_max_expected_bars: int = STABLE_GAP_DIAGNOSTIC_MAX_EXPECTED_BARS,
+ gap_scan_max_work_ms: int = STABLE_GAP_DIAGNOSTIC_MAX_WORK_MS,
+ row_cache_entries: int = DEFAULT_ROW_CACHE_ENTRIES,
+ diagnostic_exclusions: Mapping[str, str] | None = None,
+ ) -> None:
+ self._diagnostic_exclusions = dict(diagnostic_exclusions or {})
+ unknown = self._diagnostic_exclusions.keys() - {b.binding_id for b in catalog.bindings}
+ if unknown:
+ raise ValueError("diagnostic exclusions must reference catalog bindings")
+ super().__init__(
+ None, # no spool: every read below goes to the market cache
+ catalog,
+ schema_digest=schema_digest,
+ config_revision=config_revision,
+ session_liveness_root=session_liveness_root,
+ clock_ns=clock_ns,
+ monotonic_ns=monotonic_ns,
+ gap_scan_max_results=gap_scan_max_results,
+ gap_scan_max_expected_bars=gap_scan_max_expected_bars,
+ gap_scan_max_work_ms=gap_scan_max_work_ms,
+ gap_scan_page_rows=STABLE_GAP_DIAGNOSTIC_PAGE_ROWS,
+ gap_scan_max_page_payload_bytes=STABLE_GAP_DIAGNOSTIC_MAX_PAGE_PAYLOAD_BYTES,
+ )
+ if not topic_id or ":" in topic_id:
+ raise ValueError("kn3 Query backend needs the canonical topic id")
+ self.reader = reader
+ self.topic_id = topic_id
+ self.environment = reader.environment
+ self.rows = BoundedRowCache(row_cache_entries)
+
+ # ------------------------------------------------------------ cache view
+
+ def product_key(self, binding: StableSourceBinding):
+ return binding_product_key(binding, self.environment)
+
+ def _view(
+ self,
+ binding: StableSourceBinding,
+ *,
+ last: int | None = None,
+ start_ns: int | None = None,
+ end_ns: int | None = None,
+ check_budget: Callable[[], None] | None = None,
+ ) -> ProductView | None:
+ """The product's view; ``None`` when it has no state (DATA_NOT_READY)."""
+
+ lpk = self.product_key(binding)
+ try:
+ if binding.feed is not FeedType.BAR:
+ view = self.reader.latest(lpk)
+ elif start_ns is not None:
+ view = self.reader.bars(
+ lpk, canonical_interval_ms(binding.interval or ""),
+ start_ms=start_ns // 1_000_000, end_ms=end_ns // 1_000_000,
+ check_budget=check_budget,
+ )
+ else:
+ view = self.reader.bars(
+ lpk, canonical_interval_ms(binding.interval or ""), last=last or 1,
+ check_budget=check_budget,
+ )
+ except KnCacheNotReady as error:
+ if error.state == "SOURCE_BOUNDARY_UNKNOWN":
+ raise _not_ready(
+ f"SOURCE_BOUNDARY_UNKNOWN: {lpk.encode()} has no canonical fact in the cache yet"
+ ) from error
+ return None
+ except KnCacheIntegrityError as error:
+ raise QueryBackendError(QueryProblem(
+ CanonicalErrorCode.INTERNAL_ERROR, f"market cache integrity: {error}", False,
+ )) from error
+ except KnCacheError as error:
+ raise QueryBackendError(QueryProblem(
+ CanonicalErrorCode.DEPENDENCY_UNAVAILABLE, f"market cache: {error}", True,
+ retry_after_ms=500,
+ )) from error
+ if view.boundary.topic_id != self.topic_id:
+ raise _not_ready(
+ f"SOURCE_TOPIC_GENERATION: {lpk.encode()} was applied from another canonical topic"
+ )
+ return view
+
+ @staticmethod
+ def _row_key(binding: StableSourceBinding, payload_sha256: str) -> str:
+ return f"{binding.binding_id}|{payload_sha256}"
+
+ def _row(self, binding: StableSourceBinding, payload_sha256: str, canonical: bytes) -> _RowEntry:
+ key = self._row_key(binding, payload_sha256)
+ entry = self.rows.get(key)
+ if entry is None:
+ entry = _RowEntry(market_data_pb2.EventEnvelope.FromString(canonical))
+ self.rows.put(key, entry)
+ return entry
+
+ def _parsed(
+ self, binding: StableSourceBinding, view: ProductView
+ ) -> tuple[_ParsedStoredEvent, ...]:
+ cursor = Cursor(binding.canonical_stream, binding.partition_key, view.boundary.offset)
+ parsed = []
+ for row in view.rows:
+ payload_sha256 = hashlib.sha256(row.canonical).hexdigest()
+ envelope = self._row(binding, payload_sha256, row.canonical).envelope
+ stored = StoredEvent(
+ event=DurableEvent(
+ stream=binding.canonical_stream,
+ partition_key=binding.partition_key,
+ event_id=bytes(envelope.event_id),
+ payload=row.canonical,
+ accepted_at_ns=max(1, int(envelope.received_at_ns)),
+ ),
+ # D27: every item carries the view boundary (the handoff start).
+ cursor=cursor,
+ committed_at_ns=max(1, int(envelope.received_at_ns)),
+ payload_sha256=payload_sha256,
+ )
+ parsed.append(_ParsedStoredEvent(stored=stored, envelope=envelope))
+ return self._select_records(binding, tuple(parsed), limit=max(1, len(parsed)))
+
+ def latest_stored_event(self, binding: StableSourceBinding) -> tuple[StoredEvent | None, str]:
+ """The product's latest record for the MARK/INDEX views (D31/D36).
+
+ Returns ``(stored, "OK")`` or ``(None, state)`` with a state the view
+ must not paper over with a remembered price: ``NOT_READY`` (no READY
+ generation or no entry - the product has no state), ``UNAVAILABLE``
+ (the cache cannot answer now or its generation kept changing),
+ ``INTEGRITY`` (a value failed its trailer/identity check) or
+ ``FENCED`` (the entry was applied from another canonical topic
+ generation or has no provable source boundary).
+ """
+
+ try:
+ view = self._view(binding, last=1)
+ except QueryBackendError as error:
+ code = error.problem.code
+ if code is CanonicalErrorCode.DATA_NOT_READY:
+ return None, "FENCED"
+ if code is CanonicalErrorCode.INTERNAL_ERROR:
+ return None, "INTEGRITY"
+ return None, "UNAVAILABLE"
+ if view is None:
+ return None, "NOT_READY"
+ records = self._parsed(binding, view)
+ if not records:
+ return None, "NOT_READY"
+ return records[-1].stored, "OK"
+
+ # ------------------------------------------------------------ row derivations (D30)
+
+ def _validate_records(self, binding, records) -> None:
+ """Prove each row's lineage once per content; the verdict is immutable."""
+
+ for parsed in records:
+ entry = self._row(binding, parsed.stored.payload_sha256, parsed.stored.event.payload)
+ if not entry.validated:
+ super()._validate_records(binding, (parsed,))
+ entry.validated = True
+
+ def _item(self, requirement, binding, stored, envelope, gap_open):
+ """Static fields from the row cache; quality rebuilt for this request."""
+
+ key = self._row_key(binding, stored.payload_sha256)
+ entry = self._row(binding, stored.payload_sha256, stored.event.payload)
+ if entry.static is None:
+ item = super()._item(requirement, binding, stored, envelope, gap_open)
+ entry.static = {
+ item_field.name: getattr(item, item_field.name)
+ for item_field in fields(item)
+ if item_field.name not in _DYNAMIC_ITEM_FIELDS
+ }
+ return replace(item, render_key=key)
+ quality = self._quality(
+ requirement, binding, envelope, gap_open=gap_open, watermark_offset=stored.cursor.offset,
+ )
+ return MarketDataItem(
+ **entry.static, quality=quality, watermark_offset=stored.cursor.offset, render_key=key,
+ )
+
+ def warmup_stats(self) -> dict[str, int]:
+ return {f"row_cache_{name}": value for name, value in self.rows.stats().items()}
+
+ # ------------------------------------------------------------ backend API
+
+ def latest(self, requirement: DataRequirement) -> MarketDataItem | None:
+ binding = self.catalog.binding_for(requirement)
+ requested = 1
+ if binding.feed is FeedType.BAR:
+ requested, _start, _end, _opens = self._requested_window(requirement)
+ view = self._view(binding, last=max(2, requested) if binding.feed is FeedType.BAR else 1)
+ if view is None:
+ return None
+ records = self._parsed(binding, view)
+ if not records:
+ return None
+ quality_records = (
+ records[-max(2, requested):] if binding.feed is FeedType.BAR else records[-1:]
+ )
+ self._validate_records(binding, quality_records)
+ items = self._items(requirement, quality_records)
+ if not items:
+ return None
+ return replace(items[-1], cursor=source_placeholder(view), snapshot_id=view_snapshot_id(view))
+
+ def history(self, requirement: DataRequirement) -> HistoryResult | None:
+ return self.history_with_envelopes(requirement)[0]
+
+ def history_with_envelopes(
+ self, requirement: DataRequirement
+ ) -> tuple[HistoryResult | None, tuple[market_data_pb2.EventEnvelope, ...]]:
+ """The history and the canonical envelopes of its rows, from ONE view
+ (the Stream's GetSnapshot read view, D29)."""
+
+ requested, start_ns, end_ns, expected_opens = self._requested_window(requirement)
+ binding = self.catalog.binding_for(requirement)
+ view, records = self._history_view(binding, requested, start_ns, end_ns)
+ if view is None:
+ return None, ()
+ result = self._history_from_records(
+ requirement, binding, records,
+ requested=requested, start_ns=start_ns, end_ns=end_ns, expected_opens=expected_opens,
+ )
+ if result is None:
+ return None, ()
+ selected = records
+ if start_ns is not None:
+ selected = tuple(
+ parsed for parsed in records if start_ns <= parsed.envelope.bar.open_time_ns < end_ns
+ )
+ envelopes = tuple(parsed.envelope for parsed in selected[-requested:])
+ snapshot_id = view_snapshot_id(view)
+ return replace(
+ result,
+ snapshot_id=snapshot_id,
+ stream_cursor=source_placeholder(view),
+ watermark_offset=view.boundary.offset,
+ items=tuple(replace(item, snapshot_id=snapshot_id) for item in result.items),
+ ), envelopes
+
+ def _history_view(self, binding, requested, start_ns, end_ns):
+ if binding.feed is not FeedType.BAR:
+ view = self._view(binding, last=1)
+ elif start_ns is not None:
+ view = self._view(binding, start_ns=start_ns, end_ns=end_ns)
+ else:
+ view = self._view(binding, last=requested)
+ if view is None:
+ return None, ()
+ return view, self._parsed(binding, view)
+
+ def history_many(
+ self,
+ requirements: tuple[DataRequirement, ...],
+ ) -> dict[DataRequirement, HistoryResult | None | Exception]:
+ """One bounded batch; every item is its own product view (per-item
+ watermark, never an atomic global snapshot - contract section 5)."""
+
+ if len(requirements) > 100:
+ raise ValueError("stable history batch exceeds the public request bound")
+ results: dict[DataRequirement, HistoryResult | None | Exception] = {}
+ for requirement in requirements:
+ try:
+ results[requirement] = self.history(requirement)
+ except Exception as error: # per-item outcome, as the spool batch
+ results[requirement] = error
+ return results
+
+ def stored_events(self, requirement: DataRequirement) -> tuple[StoredEvent, ...]:
+ requested, start_ns, end_ns, _ = self._requested_window(requirement)
+ binding = self.catalog.binding_for(requirement)
+ _view, rows = self._history_view(binding, requested, start_ns, end_ns)
+ if start_ns is None:
+ selected = rows[-requested:]
+ else:
+ selected = tuple(
+ parsed for parsed in rows if start_ns <= parsed.envelope.bar.open_time_ns < end_ns
+ )
+ self._validate_records(binding, selected)
+ return tuple(item.stored for item in selected)
+
+ # ------------------------------------------------------------ diagnostics
+
+ def open_gaps_bounded(self, *, cancelled=None):
+ stop = cancelled or (lambda: False)
+ deadline = self._monotonic_ns() + self._gap_scan_max_work_ns
+ detected = self._clock_ns()
+ gaps, coverage = [], []
+
+ def budget():
+ if stop() or self._monotonic_ns() >= deadline:
+ raise _GapDiagnosticIncomplete("retained-window diagnostic cancelled or deadline exceeded")
+
+ def append(gap):
+ budget()
+ if len(gaps) >= self._gap_scan_max_results:
+ raise _GapDiagnosticIncomplete("retained-window diagnostic result bound exceeded")
+ gaps.append(gap)
+
+ try:
+ for binding in self.catalog.bindings:
+ budget()
+ row = {"binding_id": binding.binding_id, "instrument_uid": binding.instrument.instrument_uid,
+ "feed": binding.feed.value, "interval": binding.interval,
+ "state": "SCANNED", "retained_rows": None,
+ "first_open_ns": None, "last_open_ns": None}
+ if binding.binding_id in self._diagnostic_exclusions:
+ row.update(state="EXCLUDED", reason=self._diagnostic_exclusions[binding.binding_id])
+ else:
+ try:
+ self._scan_binding_gaps_bounded(binding, detected_at_ns=detected,
+ append_gap=append, check_budget=budget, cancelled=stop, coverage=row)
+ except QueryBackendError as error:
+ if error.problem.code is not CanonicalErrorCode.DATA_NOT_READY:
+ raise
+ row.update(state="UNAVAILABLE", reason=error.problem.detail)
+ coverage.append(row)
+ except _GapDiagnosticIncomplete as error:
+ raise QueryBackendError(QueryProblem(CanonicalErrorCode.PARTIAL_RESULT,
+ str(error), True, retry_after_ms=1000)) from error
+ return GapScanResult(sorted(gaps, key=lambda g: (g.detected_at_ns, g.gap_id)), coverage)
+
+ def _scan_binding_gaps_bounded(
+ self,
+ binding: StableSourceBinding,
+ *,
+ detected_at_ns: int,
+ append_gap: Callable[[GapRecord], None],
+ check_budget: Callable[[], None],
+ cancelled: Callable[[], bool],
+ coverage: dict | None = None,
+ ) -> None:
+ """One product's retained window, inside the existing global budget."""
+
+ from qdl.runtime.kn_market_cache import KnDiagnosticIndexMissing
+
+ observed_opens: set[int] = set()
+ indexed = False
+ if binding.feed is FeedType.BAR:
+ try:
+ boundary, spans, flags = self.reader.bar_diagnostic_ranges(
+ self.product_key(binding), canonical_interval_ms(binding.interval or ""),
+ last=STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW, check_budget=check_budget,
+ )
+ if not spans:
+ raise _not_ready(f"empty retained BAR view: {binding.binding_id}")
+ if coverage is not None:
+ step = canonical_interval_ms(binding.interval or "")
+ coverage.update(retained_rows=sum((end-first)//step+1 for first,end in spans),
+ first_open_ns=spans[0][0]*1_000_000, last_open_ns=spans[-1][1]*1_000_000)
+ if boundary.topic_id != self.topic_id:
+ raise _not_ready("diagnostic source topic generation mismatch")
+ for _opened_ms, sequence in flags:
+ append_gap(self._gap(binding, f"sequence:{sequence}", sequence, detected_at_ns))
+ if binding.continuous_calendar:
+ step_ms = canonical_interval_ms(binding.interval or "")
+ if spans and (spans[-1][1] - spans[0][0]) // step_ms + 1 > self._gap_scan_max_expected_bars:
+ raise _GapDiagnosticIncomplete("global gap diagnostic expected-bar window exceeds its bound")
+ for (_first, prior_end), (next_start, _end) in zip(spans, spans[1:]):
+ for opened in range(prior_end + step_ms, next_start, step_ms):
+ check_budget()
+ ns = opened * 1_000_000
+ append_gap(self._gap(binding, str(ns), "MISSING", detected_at_ns))
+ return
+ observed_opens.update(opened * 1_000_000 for first, end in spans
+ for opened in range(first, end + canonical_interval_ms(binding.interval or ""),
+ canonical_interval_ms(binding.interval or "")))
+ indexed = True
+ except KnDiagnosticIndexMissing:
+ pass # old projector: exact verified scan, never an empty success
+ except KnCacheNotReady as error:
+ raise _not_ready(str(error)) from error
+ except KnCacheIntegrityError as error:
+ raise QueryBackendError(QueryProblem(
+ CanonicalErrorCode.INTERNAL_ERROR, f"diagnostic integrity: {error}", False,
+ )) from error
+ except KnCacheError as error:
+ raise QueryBackendError(QueryProblem(
+ CanonicalErrorCode.DEPENDENCY_UNAVAILABLE, str(error), True,
+ )) from error
+ if not indexed:
+ try:
+ view = self._view(
+ binding,
+ last=STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW if binding.feed is FeedType.BAR else 1,
+ check_budget=check_budget,
+ )
+ except QueryBackendError:
+ raise
+ if view is None or not view.rows:
+ raise _not_ready(f"empty retained view: {binding.binding_id}")
+ if coverage is not None:
+ coverage["retained_rows"] = len(view.rows)
+ for row in view.rows:
+ check_budget()
+ envelope = market_data_pb2.EventEnvelope.FromString(row.canonical)
+ if common_pb2.QUALITY_FLAG_SEQUENCE_GAP_BEFORE in envelope.quality_flags:
+ append_gap(self._gap(
+ binding, f"sequence:{envelope.source_sequence}", envelope.source_sequence,
+ detected_at_ns,
+ ))
+ if binding.feed is FeedType.BAR:
+ observed_opens.add(int(envelope.bar.open_time_ns))
+ if binding.feed is not FeedType.BAR or not observed_opens:
+ return
+ step = _interval_ns(binding.interval or "")
+ first_open, last_open = min(observed_opens), max(observed_opens)
+ if coverage is not None:
+ coverage.update(first_open_ns=first_open, last_open_ns=last_open)
+ if binding.continuous_calendar:
+ if ((last_open - first_open) // step) + 1 > self._gap_scan_max_expected_bars:
+ raise _GapDiagnosticIncomplete(
+ "global gap diagnostic expected-bar window exceeds its bound"
+ )
+ expected_opens = range(first_open, last_open + step, step)
+ else:
+ try:
+ expected_opens = trading_calendar_for_id(
+ binding.instrument.session_calendar_id
+ ).bar_opens_between_ns(
+ start_ns=first_open, end_ns=last_open + step, interval_ns=step,
+ max_rows=self._gap_scan_max_expected_bars,
+ )
+ except ValueError as error:
+ raise _GapDiagnosticIncomplete(
+ "global gap diagnostic expected-bar window exceeds its bound"
+ ) from error
+ for expected_open in expected_opens:
+ check_budget()
+ if expected_open not in observed_opens:
+ append_gap(self._gap(binding, str(expected_open), "MISSING", detected_at_ns))
+
+ # ------------------------------------------------------------ readiness
+
+ def readiness_summary(self) -> tuple[int, int]:
+ """(READY products, bound products) of the catalog - per product, never
+ a global flag (D32)."""
+
+ lpks = [self.product_key(binding) for binding in self.catalog.bindings]
+ generations = self.reader.ready_generations(lpks)
+ return sum(1 for generation in generations if generation is not None), len(lpks)
+
+
+@dataclass(frozen=True)
+class KnCursorSettings:
+ keys: Mapping[str, bytes]
+ active_key_id: str
+ environment: str
+ topic_id: str
+ partition_plan_epoch: int
+ route_generation: str
+ ttl_seconds: int
+
+ @classmethod
+ def from_environment(cls, environ: Mapping[str, str], *, environment: str) -> "KnCursorSettings":
+ path = environ.get(CURSOR_KEYS_FILE_ENV, "").strip()
+ if not path:
+ raise ValueError(f"the kn3 Query backend requires {CURSOR_KEYS_FILE_ENV}")
+ raw = json.loads(Path(path).read_text(encoding="utf-8"))
+ if not isinstance(raw, dict) or not raw:
+ raise ValueError("cursor key file must map key ids to hex secrets")
+ keys = {str(key_id): bytes.fromhex(str(secret)) for key_id, secret in raw.items()}
+ for name in (CURSOR_ACTIVE_KEY_ENV, TOPIC_ID_ENV, ROUTE_GENERATION_ENV):
+ if not environ.get(name, "").strip():
+ raise ValueError(f"the kn3 Query backend requires {name}")
+ return cls(
+ keys=keys,
+ active_key_id=environ[CURSOR_ACTIVE_KEY_ENV].strip(),
+ environment=environment.lower(),
+ topic_id=environ[TOPIC_ID_ENV].strip(),
+ partition_plan_epoch=int(environ.get(PARTITION_PLAN_EPOCH_ENV, "1")),
+ route_generation=environ[ROUTE_GENERATION_ENV].strip(),
+ ttl_seconds=int(environ.get(CURSOR_TTL_ENV, "3600")),
+ )
+
+
+class KnCursorV3Issuer:
+ """Signs the backend's source coordinate as a cursor v3 (D28).
+
+ Same ``bind_item``/``bind_history`` surface as ``StableConsumerCursorIssuer``.
+ The claims are exactly what the Rust Stream expects: bundle canonical
+ stream and revisions come from the same catalog, the product key from the
+ bundle LPK rule, the digest from the normalized requirement.
+ """
+
+ def __init__(
+ self,
+ settings: KnCursorSettings,
+ catalog: StableSourceCatalog,
+ *,
+ clock_ns=time.time_ns,
+ ) -> None:
+ if settings.ttl_seconds < 1:
+ raise ValueError("cursor TTL must be positive")
+ self.settings = settings
+ self.catalog = catalog
+ self.codec = SignedCursorV3Codec(settings.keys, active_key_id=settings.active_key_id)
+ self._clock_ns = clock_ns
+
+ def bind_item(
+ self, requirement: DataRequirement, item: MarketDataItem, *, consumer_id: str
+ ) -> MarketDataItem:
+ if self._preserve_non_replayable(requirement, item.cursor, item.watermark_offset):
+ return item
+ token = self._issue(requirement, consumer_id, item.snapshot_id or "", item.cursor)
+ return replace(item, cursor=token)
+
+ def bind_history(
+ self, requirement: DataRequirement, history: HistoryResult, *, consumer_id: str
+ ) -> HistoryResult:
+ if self._preserve_non_replayable(requirement, history.stream_cursor, history.watermark_offset):
+ return history
+ token = self._issue(requirement, consumer_id, history.snapshot_id, history.stream_cursor)
+ return replace(
+ history,
+ stream_cursor=token,
+ items=tuple(
+ replace(item, snapshot_id=history.snapshot_id, cursor=token) for item in history.items
+ ),
+ )
+
+ @staticmethod
+ def _preserve_non_replayable(requirement: DataRequirement, cursor: str | None, offset: int) -> bool:
+ if cursor != NON_REPLAYABLE_STREAM_CURSOR:
+ return False
+ if requirement.recovery is not RecoveryPolicy.FRESH_SNAPSHOT or offset != 0:
+ raise ValueError("non-replayable cursor requires FRESH_SNAPSHOT and zero watermark")
+ return True
+
+ def _issue(
+ self, requirement: DataRequirement, consumer_id: str, snapshot_id: str, placeholder: str | None
+ ) -> str:
+ topic_id, partition, offset = parse_placeholder(placeholder)
+ if topic_id != self.settings.topic_id:
+ raise ValueError("kn3 Query cursor coordinate belongs to another canonical topic")
+ binding = self.catalog.binding_for(requirement)
+ now = self._clock_ns()
+ claims = CursorV3Claims(
+ key_id=self.codec.active_key_id,
+ environment=self.settings.environment,
+ consumer_id=consumer_id,
+ requirement_digest=requirement_digest(requirement),
+ schema_major=2,
+ stream=self.catalog.canonical_stream,
+ product_key=binding_product_key(binding, self.settings.environment).encode(),
+ snapshot_id=snapshot_id,
+ source_topic_id=topic_id,
+ source_partition=partition,
+ source_offset=offset,
+ partition_plan_epoch=self.settings.partition_plan_epoch,
+ source_policy_revision=self.catalog.source_policy_revision,
+ catalog_revision=self.catalog.catalog_revision,
+ route_generation=self.settings.route_generation,
+ issued_at_ns=now,
+ expires_at_ns=now + self.settings.ttl_seconds * 1_000_000_000,
+ )
+ return self.codec.encode(claims)
diff --git a/qdl/runtime/kn_read_view.py b/qdl/runtime/kn_read_view.py
new file mode 100644
index 00000000..898b9e35
--- /dev/null
+++ b/qdl/runtime/kn_read_view.py
@@ -0,0 +1,166 @@
+"""KN-4 D29: the private read view behind the native Stream's GetSnapshot/GetFeedStatus.
+
+Purpose: the Rust Stream gateway keeps one semantic owner for the two unary
+read RPCs. After its own access sequence (authenticated consumer, permission,
+manifest requirement - ``qdl-stream-gateway`` ``service.rs``) it asks the
+paired Query replica here, and this endpoint runs the unchanged Python
+oracle of ``qdl/stream/grpc_service.py`` over the market-cache backend:
+
+* ``SNAPSHOT`` - ``requirement_from_proto``, the service's own warmup
+ enforcement (``_warmup_from_history``: readiness, content, quality, policy)
+ on ONE product view, the cursor v3 issuer, and the canonical envelopes of
+ that same view (the spool oracle read the window twice);
+* ``STATUS`` - ``V2QueryService.status_async`` on the hot lane.
+
+Protocol: ``POST /internal/v2/kn/read-view`` (not in the public schema),
+JSON ``{"schema": "qdl.v2.kn-read-view.v1", "kind": "SNAPSHOT"|"STATUS",
+"consumer_id": ..., "requirement": base64(query_pb2.DataRequirement)}``,
+signed ``X-QDL-Stable-Signature: sha256=`` like the
+existing private edges; mutual TLS is the Query listener's. Replies: 200
+``application/x-protobuf`` (the gRPC response message), 409 JSON
+``{"code", "detail"}`` for a typed ``QueryServiceError`` (the gateway maps it
+to ``FAILED_PRECONDITION "{code}:{detail}"`` exactly like the Python
+handler), 400 JSON ``{"detail"}`` for an invalid request (INVALID_ARGUMENT),
+401 for a bad signature.
+
+Boundary: read-only; bounded by the existing hot lane (status) and by one
+in-flight history read per replica for snapshots with history. A product
+outside the catalog is typed ``UNSUPPORTED_FEED`` (the spool oracle failed
+it as an internal error).
+"""
+from __future__ import annotations
+
+import asyncio
+import base64
+import binascii
+import hmac
+import json
+
+from fastapi import FastAPI, Header, HTTPException, Request, Response
+from fastapi.responses import JSONResponse
+
+from qdl.query import AccessPurpose, ConsumerGrade
+from qdl.query.cold_work import await_in_thread
+from qdl.query.contracts import CanonicalErrorCode, QueryProblem
+from qdl.query.service import QueryServiceError
+from qdl.runtime.internal_auth import stable_hmac_signature
+from qdl.stream.grpc_service import requirement_from_proto
+
+READ_VIEW_PATH = "/internal/v2/kn/read-view"
+READ_VIEW_SCHEMA = "qdl.v2.kn-read-view.v1"
+READ_VIEW_SECRET_FILE_ENV = "QDL_KN_READ_VIEW_SECRET_FILE"
+_PURPOSE = {
+ ConsumerGrade.ALPHA: AccessPurpose.INTERNAL_ALPHA,
+ ConsumerGrade.RESEARCH: AccessPurpose.INTERNAL_RESEARCH,
+ ConsumerGrade.EXECUTION: AccessPurpose.INTERNAL_EXECUTION,
+}
+
+
+def _problem(error: QueryServiceError) -> JSONResponse:
+ return JSONResponse(
+ status_code=409,
+ content={"code": error.problem.code.value, "detail": error.problem.detail},
+ )
+
+
+def install_kn_read_view(app: FastAPI, *, service, backend, issuer, secret: bytes) -> None:
+ """Install the private read view on a Query app (kn3 backend only)."""
+
+ if len(secret) < 32:
+ raise ValueError("KN read-view secret must contain at least 256 bits")
+ from qdl.query.v2 import query_pb2
+
+ history_reads = asyncio.Semaphore(1)
+
+ def snapshot_work(requirement, consumer_id: str):
+ try:
+ backend.catalog.binding_for(requirement)
+ except KeyError as error:
+ raise QueryServiceError(
+ QueryProblem(
+ CanonicalErrorCode.UNSUPPORTED_FEED,
+ "the native read view serves catalog-bound products only",
+ False,
+ ),
+ request_id=service.request_id(),
+ instrument_uid=requirement.instrument_uid,
+ ) from error
+ request_id = service.request_id()
+ try:
+ history, envelopes = backend.history_with_envelopes(requirement)
+ except Exception as error:
+ problem = getattr(error, "problem", None)
+ if problem is None:
+ raise
+ raise QueryServiceError(
+ problem, request_id=request_id, instrument_uid=requirement.instrument_uid,
+ ) from error
+ result = service._warmup_from_history(
+ requirement, history, purpose=_PURPOSE[requirement.consumer_grade], request_id=request_id,
+ )
+ bound = issuer.bind_history(requirement, result.history, consumer_id=consumer_id)
+ return query_pb2.GetSnapshotResponse(
+ request_id=result.request_id,
+ snapshot_id=bound.snapshot_id,
+ stream_cursor=bound.stream_cursor,
+ data_as_of_ns=bound.data_as_of_ns,
+ watermark_offset=bound.watermark_offset,
+ events=envelopes,
+ )
+
+ @app.post(READ_VIEW_PATH, include_in_schema=False)
+ async def read_view(
+ request: Request,
+ signature: str | None = Header(None, alias="X-QDL-Stable-Signature"),
+ ):
+ body = await request.body()
+ if not signature or not hmac.compare_digest(signature, stable_hmac_signature(secret, body)):
+ raise HTTPException(status_code=401, detail="invalid stable read signature")
+ try:
+ payload = json.loads(body)
+ if (
+ not isinstance(payload, dict)
+ or set(payload) != {"schema", "kind", "consumer_id", "requirement"}
+ or payload["schema"] != READ_VIEW_SCHEMA
+ or payload["kind"] not in {"SNAPSHOT", "STATUS"}
+ or not isinstance(payload["consumer_id"], str)
+ or not payload["consumer_id"].strip()
+ or not isinstance(payload["requirement"], str)
+ ):
+ raise ValueError("KN read-view request schema is invalid")
+ proto = query_pb2.DataRequirement.FromString(
+ base64.b64decode(payload["requirement"], validate=True)
+ )
+ requirement = requirement_from_proto(proto)
+ except (TypeError, ValueError, binascii.Error, json.JSONDecodeError) as error:
+ return JSONResponse(status_code=400, content={"detail": f"INVALID_ARGUMENT:{error}"})
+ except Exception as error: # protobuf DecodeError
+ return JSONResponse(status_code=400, content={"detail": f"INVALID_ARGUMENT:{type(error).__name__}"})
+ consumer_id = payload["consumer_id"]
+ try:
+ if payload["kind"] == "STATUS":
+ status = await service.status_async(requirement, consumer_id=consumer_id)
+ message = query_pb2.GetFeedStatusResponse(
+ state=status.state,
+ freshness_ms=status.freshness_ms,
+ gap_open=status.gap_open,
+ complete=status.complete,
+ execution_eligible=status.execution_eligible,
+ policy_id=status.policy_id,
+ flags=status.flags,
+ event_recency_state=status.event_recency_state,
+ provider_session_state=status.provider_session_state,
+ provider_session_liveness_ms=status.provider_session_liveness_ms or 0,
+ )
+ elif requirement.warmup_specification is None:
+ message = await await_in_thread(None, snapshot_work, requirement, consumer_id)
+ else:
+ async with history_reads:
+ message = await await_in_thread(
+ None, snapshot_work, requirement, consumer_id, cold=True,
+ )
+ except QueryServiceError as error:
+ return _problem(error)
+ except ValueError as error:
+ return JSONResponse(status_code=400, content={"detail": f"INVALID_ARGUMENT:{error}"})
+ return Response(content=message.SerializeToString(), media_type="application/x-protobuf")
diff --git a/qdl/runtime/mark_index_lineage.py b/qdl/runtime/mark_index_lineage.py
index f1c6a322..cfd543ca 100644
--- a/qdl/runtime/mark_index_lineage.py
+++ b/qdl/runtime/mark_index_lineage.py
@@ -51,13 +51,19 @@ def paired_mark_index_lineage(
except ValueError as error:
raise ValueError("derived MARK_INDEX source sequence is invalid") from error
if (
- any(value < 0 for value in source_times)
- or source_times[2] <= 0
- or source_times[3] <= 0
+ any(value <= 0 for value in source_times)
or len(mark_capture_id) != 16
or len(index_capture_id) != 16
):
raise ValueError("derived MARK_INDEX source sequence is invalid")
+ # The envelope clocks are derived from the components (the pair is as old
+ # as its oldest source value and its oldest confirmation), never set apart
+ # from them: ``qdl-realtime-core`` pair emission.
+ if (
+ int(envelope.source_event_time_ns) != min(source_times[0], source_times[1]) * 1_000_000
+ or int(envelope.received_at_ns) != min(source_times[2], source_times[3])
+ ):
+ raise ValueError("derived MARK_INDEX envelope times differ from its components")
digest = hashlib.sha256()
digest.update(_CAPTURE_DOMAIN)
digest.update(mark_capture_id)
diff --git a/qdl/runtime/production_catalog.py b/qdl/runtime/production_catalog.py
index ee46f0d5..31e21ec5 100644
--- a/qdl/runtime/production_catalog.py
+++ b/qdl/runtime/production_catalog.py
@@ -421,6 +421,13 @@ def build_from_records(
selected: dict[str, InstrumentRecord] = {}
bindings: list[dict[str, Any]] = []
acquisitions: list[dict[str, Any]] = []
+ # An execution symbol has realtime demand beyond BAR; a symbol demanded
+ # only for bars (the D48 daily market-cap universe) needs one final bar
+ # per boundary, so it stays on the shared REST final lane.
+ execution_symbols = {
+ (item.venue, item.market, item.native_symbol)
+ for item in demand.demands if item.feed is not FeedType.BAR
+ }
for item in demand.demands:
key = (item.venue, item.market, item.native_symbol)
try:
@@ -435,7 +442,9 @@ def build_from_records(
selected[record.instrument_id] = record
binding_id = self._binding_id(item)
bindings.append(self._source_binding(binding_id, item, record))
- acquisitions.append(self._acquisition(binding_id, item))
+ acquisitions.append(self._acquisition(
+ binding_id, item, execution_symbol=key in execution_symbols
+ ))
source = {
"schema": _SOURCE_SCHEMA,
"canonical_stream": self.canonical_stream,
@@ -689,7 +698,9 @@ def _book_source_stem(item: ProductionDemand) -> str:
return f"{item.venue.lower()}-{item.market.lower()}-{symbol}-book"
@staticmethod
- def _acquisition(binding_id: str, item: ProductionDemand) -> dict[str, Any]:
+ def _acquisition(
+ binding_id: str, item: ProductionDemand, *, execution_symbol: bool = True
+ ) -> dict[str, Any]:
if item.venue == "BINANCE":
# The provider kind and the stream endpoint both follow the market:
# a Spot demand generated with USD-M kinds would subscribe the wrong
@@ -771,7 +782,7 @@ def _acquisition(binding_id: str, item: ProductionDemand) -> dict[str, Any]:
mode, kind, channel, sequence = (
"RUST_NATIVE", "okx_mark_index", "mark-price", "NONE"
)
- elif item.feed is FeedType.BAR and item.market == "SWAP":
+ elif item.feed is FeedType.BAR and item.market == "SWAP" and execution_symbol:
# A bounded real-provider gate proved the shared OKX business
# candle lane emits ``confirm=1`` final rows with canonical
# OHLCV parity and lower first-final latency than REST. The
@@ -784,7 +795,9 @@ def _acquisition(binding_id: str, item: ProductionDemand) -> dict[str, Any]:
okx_candle_channel(item.interval or "1m"), "NONE",
)
else:
- # Only OKX Swap passed the native final-bar provider gate.
+ # Only OKX Swap passed the native final-bar provider gate, and
+ # only an execution symbol uses it: a bar-only universe symbol
+ # needs one final row per boundary, not a streaming candle.
# Other OKX markets retain the shared REST final lane until
# they carry equivalent real-provider evidence.
mode, kind, channel, sequence = (
diff --git a/qdl/runtime/routed_query.py b/qdl/runtime/routed_query.py
index 39855317..57ded24f 100644
--- a/qdl/runtime/routed_query.py
+++ b/qdl/runtime/routed_query.py
@@ -153,6 +153,12 @@ def feed_status(self, requirement: DataRequirement) -> QualityMetadata | None:
def open_gaps(self) -> tuple[GapRecord, ...]:
# Only materialised bindings can hold an open gap. A pass-through window
# is validated at fetch time and never becomes a tracked gap.
+ return self.open_gaps_bounded()
+
+ def open_gaps_bounded(self, *, cancelled=None) -> tuple[GapRecord, ...]:
+ scanner = getattr(self.spool, "open_gaps_bounded", None)
+ if callable(scanner):
+ return scanner(cancelled=cancelled)
return self.spool.open_gaps()
def warmup_stats(self) -> dict[str, int]:
diff --git a/qdl/runtime/session_liveness.py b/qdl/runtime/session_liveness.py
index eb2f924d..976bc093 100644
--- a/qdl/runtime/session_liveness.py
+++ b/qdl/runtime/session_liveness.py
@@ -11,9 +11,11 @@
from __future__ import annotations
import json
+import os
import re
from dataclasses import dataclass
from pathlib import Path
+from typing import Callable
SESSION_LIVENESS_SCHEMA = "qdl.provider-session-liveness.v1"
@@ -95,10 +97,61 @@ class ProviderSessionStatus:
class StableSessionLivenessReader:
- """Read bounded, session-scoped liveness records from stable_state."""
-
- def __init__(self, root: str | Path) -> None:
+ """Read bounded, session-scoped liveness records from stable_state.
+
+ ``now_ns`` is the caller's clock, sampled before this read. With
+ ``clock_ns`` (the caller's own clock source) every record is judged at a
+ clock sampled after the read (never earlier than ``now_ns``): an old
+ heartbeat is aged by the full read, and one the ingestor rewrote during
+ the read is not mistaken for a skewed clock; a transport time still in the
+ future after the read is a real skew and fails closed. Without
+ ``clock_ns`` the caller's sample is the only clock.
+ """
+
+ def __init__(self, root: str | Path, *, clock_ns: Callable[[], int] | None = None) -> None:
self.root = Path(root)
+ self._clock_ns = clock_ns
+ # Parsed file contents by directory and name, keyed by the file's
+ # (inode, mtime, size). Only content is kept - never a verdict: age,
+ # skew and the session match are judged on every call.
+ self._parsed: dict[str, dict[str, tuple[tuple[int, int, int], ProviderSessionLiveness | None]]] = {}
+
+ def _records(
+ self, directory: Path, names: list[str]
+ ) -> list[ProviderSessionLiveness | None]:
+ """The records of ``names``, each re-read only when its file changed.
+
+ The ingestor replaces a record by rename (a new inode), so the stat key
+ names one content exactly; a file that changes between the stat and the
+ read is stored under the older key and re-read on the next call. The
+ cache holds only the files listed now (at most ``_MAX_STATE_FILES``).
+ """
+
+ previous = self._parsed.get(str(directory), {})
+ current: dict[str, tuple[tuple[int, int, int], ProviderSessionLiveness | None]] = {}
+ records: list[ProviderSessionLiveness | None] = []
+ for name in names:
+ path = directory / name
+ try:
+ stat = os.stat(path)
+ except OSError:
+ records.append(None)
+ continue
+ key = (stat.st_ino, stat.st_mtime_ns, stat.st_size)
+ cached = previous.get(name)
+ if cached is not None and cached[0] == key:
+ record = cached[1]
+ else:
+ try:
+ record = ProviderSessionLiveness.from_mapping(
+ json.loads(path.read_text(encoding="utf-8"))
+ )
+ except (OSError, UnicodeError, json.JSONDecodeError, ValueError):
+ record = None
+ current[name] = (key, record)
+ records.append(record)
+ self._parsed[str(directory)] = current
+ return records
@staticmethod
def _directory(*, venue: str, market: str) -> str:
@@ -131,27 +184,26 @@ def status(
return ProviderSessionStatus("UNKNOWN", None, ("SOURCE_SESSION_INVALID",))
try:
candidates = []
- for path in directory.iterdir():
- if path.is_file() and _SAFE_FILE.fullmatch(path.name):
- candidates.append(path)
- if len(candidates) > _MAX_STATE_FILES:
- return ProviderSessionStatus(
- "UNKNOWN", None, ("SOURCE_SESSION_UNAVAILABLE",)
- )
+ with os.scandir(directory) as entries:
+ for entry in entries:
+ if entry.is_file() and _SAFE_FILE.fullmatch(entry.name):
+ candidates.append(entry.name)
+ if len(candidates) > _MAX_STATE_FILES:
+ return ProviderSessionStatus(
+ "UNKNOWN", None, ("SOURCE_SESSION_UNAVAILABLE",)
+ )
candidates.sort()
except FileNotFoundError:
return ProviderSessionStatus("UNKNOWN", None, ("SOURCE_SESSION_UNAVAILABLE",))
except OSError:
return ProviderSessionStatus("UNKNOWN", None, ("SOURCE_SESSION_UNREADABLE",))
if not candidates:
+ self._parsed.pop(str(directory), None)
return ProviderSessionStatus("UNKNOWN", None, ("SOURCE_SESSION_UNAVAILABLE",))
match: ProviderSessionLiveness | None = None
malformed = False
- for path in candidates:
- try:
- raw = json.loads(path.read_text(encoding="utf-8"))
- record = ProviderSessionLiveness.from_mapping(raw)
- except (OSError, UnicodeError, json.JSONDecodeError, ValueError):
+ for record in self._records(directory, candidates):
+ if record is None:
malformed = True
continue
if (
@@ -166,7 +218,14 @@ def status(
return ProviderSessionStatus("UNKNOWN", None, (flag,))
if match.config_revision != config_revision:
return ProviderSessionStatus("UNKNOWN", None, ("SOURCE_SESSION_CONFIG_MISMATCH",))
- if match.last_transport_at_ns > now_ns:
+ # The record is judged at the end of this read, never at the caller's
+ # earlier sample: that sample would under-state the age of an old
+ # heartbeat (1,999 ms at the sample, 2,019 ms after the read passed a
+ # 2,000 ms SLA) and over-state skew for one rewritten meanwhile.
+ evaluated_ns = now_ns
+ if self._clock_ns is not None:
+ evaluated_ns = max(now_ns, int(self._clock_ns()))
+ if match.last_transport_at_ns > evaluated_ns:
return ProviderSessionStatus("UNKNOWN", None, ("SOURCE_SESSION_CLOCK_SKEW",))
- age_ms = (now_ns - match.last_transport_at_ns) // 1_000_000
+ age_ms = (evaluated_ns - match.last_transport_at_ns) // 1_000_000
return ProviderSessionStatus(match.state, int(age_ms))
diff --git a/qdl/runtime/stable.py b/qdl/runtime/stable.py
index f9ac3c00..33e9e85a 100644
--- a/qdl/runtime/stable.py
+++ b/qdl/runtime/stable.py
@@ -1,11 +1,13 @@
from __future__ import annotations
import asyncio
+import gc
import hashlib
import json
import logging
import os
import ssl
+import sys
import time
from dataclasses import asdict, dataclass
from pathlib import Path
@@ -56,6 +58,21 @@
build_stable_query_stack,
)
from qdl.reference.execution_live import HttpExecutionMarkIndexReader
+from qdl.reference.local_mark_index import (
+ build_cache_alpha_mark_index_reader,
+ build_cache_execution_mark_index_reader,
+)
+from qdl.runtime.kn_market_cache import reader_from_environment as kn_reader_from_environment
+from qdl.query.row_cache import ROW_CACHE_ENTRIES_ENV
+from qdl.runtime.kn_read_view import READ_VIEW_SECRET_FILE_ENV, install_kn_read_view
+from qdl.runtime.kn_query_backend import (
+ DEFAULT_ROW_CACHE_ENTRIES,
+ QUERY_BACKEND_ENV,
+ QUERY_BACKENDS,
+ KnCursorSettings,
+ KnCursorV3Issuer,
+ KnMarketCacheQueryBackend,
+)
from qdl.security import (
AuditChain,
DataPlaneIdentityService,
@@ -572,12 +589,15 @@ def build_stable_handoff(
def stable_readiness(
config: StableRuntimeConfig,
manifests: ConsumerManifestRegistry,
- spool: SQLiteDurableSpool,
+ spool: SQLiteDurableSpool | None,
*,
quota: RedisMinuteQuota | None = None,
extra_probes=(),
+ market_cache_backend=None,
) -> MeasuredRuntimeReadiness:
async def cache():
+ if market_cache_backend is not None:
+ return await market_cache_readiness(market_cache_backend)
summary = await asyncio.to_thread(spool.readiness_summary)
return _ready(
"query_cache",
@@ -616,6 +636,22 @@ async def redis_probe():
)
+async def market_cache_readiness(backend) -> ComponentReadiness:
+ """KN-4 D32: the market cache is readable and every bound product's READY
+ coverage is reported (never a global flag). Query is ready when the cache
+ answers; a product without a READY generation answers DATA_NOT_READY on
+ its own reads."""
+
+ try:
+ ready, bound = await asyncio.to_thread(backend.readiness_summary)
+ except Exception as error: # the cache is a dependency: typed NOT_READY
+ return ComponentReadiness(
+ "query_cache", ComponentState.NOT_READY,
+ detail=f"market cache unavailable: {type(error).__name__}", checked_at_ns=time.time_ns(),
+ )
+ return _ready("query_cache", detail=f"market cache readable ready_products={ready}/{bound}")
+
+
def install_stable_health(app, readiness, manifest) -> None:
@app.get("/health/live", include_in_schema=False)
async def live():
@@ -642,23 +678,93 @@ async def dependencies():
}
+# A cold 2,500/5,000-row warmup keeps one or two threads CPU-bound for
+# seconds. At CPython's default 5 ms switch interval every GIL acquisition by
+# the event loop or a hot-read thread may wait that long, and a hot read needs
+# several: on 2026-09-23 (v2.1.1 Phase-3 stage 5, lock and throttling already
+# removed) QUOTE snapshots still reached p95 ~280 ms and p99 ~1.2 s inside the
+# cold window against a 9 ms median. 1 ms trades a little throughput for
+# bounded hot-read waits in this latency-first reader.
+QUERY_GIL_SWITCH_INTERVAL_SECONDS = 0.001
+# A 5,000-row warmup keeps its rows alive through the render, so the default
+# thresholds (700, 10, 10) ran ~526 collections per warmup including 3 full
+# sweeps of 75-217 ms, each holding the GIL (offline, one real partition,
+# 2026-09-23). (100_000, 50, 100) measured 2-3 collections, no full sweep,
+# at most 31 ms. Most objects are freed by reference counting either way.
+QUERY_GC_THRESHOLDS = (100_000, 50, 100)
+
+
+def configure_query_interpreter() -> None:
+ """Process-wide interpreter settings for a Query reader."""
+
+ sys.setswitchinterval(QUERY_GIL_SWITCH_INTERVAL_SECONDS)
+ gc.set_threshold(*QUERY_GC_THRESHOLDS)
+
+
+def freeze_query_startup_heap() -> None:
+ """Keep the start-up heap (catalog, manifests, identity) out of later sweeps."""
+
+ gc.collect()
+ gc.freeze()
+
+
def create_stable_query_app(config: StableRuntimeConfig | None = None) -> FastAPI:
+ configure_query_interpreter()
config = config or StableRuntimeConfig.from_environment("query_v2")
config.state_dir.mkdir(parents=True, exist_ok=True)
manifests = load_stable_manifests(config)
identity = build_stable_identity(config, manifests)
catalog = StableSourceCatalog.load(config.source_bindings_path)
- spool = build_stable_spool(config, catalog)
- handoff = build_stable_handoff(config, spool)
- execution_mark_index_reader = (
- HttpExecutionMarkIndexReader(
- config.execution_mark_index_urls,
- config.internal_ingest_secret,
- ssl_context=stable_client_ssl_context(config),
+ query_backend = os.environ.get(QUERY_BACKEND_ENV, "spool").strip() or "spool"
+ if query_backend not in QUERY_BACKENDS:
+ raise ValueError(f"{QUERY_BACKEND_ENV} must be one of {QUERY_BACKENDS}")
+ kn_backend = kn_issuer = kn_alpha_reader = None
+ if query_backend == "kn3":
+ # KN-4 D25: the Kafka-native market cache, no spool/handoff at all.
+ spool = handoff = None
+ reader = kn_reader_from_environment(os.environ)
+ settings = KnCursorSettings.from_environment(os.environ, environment=config.environment)
+ kn_backend = KnMarketCacheQueryBackend(
+ reader, catalog, schema_digest=config.schema_digest, topic_id=settings.topic_id,
+ session_liveness_root=str(config.session_liveness_dir),
+ row_cache_entries=int(os.environ.get(ROW_CACHE_ENTRIES_ENV, str(DEFAULT_ROW_CACHE_ENTRIES))),
+ diagnostic_exclusions={b.binding_id: "ACQUISITION_DISABLED"
+ for b in StableAcquisitionPlan.load(config.acquisition_bindings_path, catalog=catalog).bindings
+ if not b.enabled},
+ )
+ kn_issuer = KnCursorV3Issuer(settings, catalog)
+ kn_alpha_reader = lambda: build_cache_alpha_mark_index_reader( # noqa: E731
+ catalog=catalog, backend=kn_backend,
+ )
+ if config.execution_mark_index_urls:
+ # D31: never reach a stream's private endpoint from this backend
+ # (a shadow Query must not call the production stream).
+ raise ValueError(
+ "QDL_STABLE_QUERY_BACKEND=kn3 serves execution MARK/INDEX from the market "
+ "cache; unset QDL_STABLE_EXECUTION_MARK_INDEX_URLS_JSON"
+ )
+ execution_mark_index_reader = (
+ build_cache_execution_mark_index_reader(
+ catalog=catalog, backend=kn_backend,
+ acquisition=StableAcquisitionPlan.load(config.acquisition_bindings_path, catalog=catalog),
+ session_liveness_reader=StableSessionLivenessReader(
+ config.session_liveness_dir, clock_ns=time.time_ns),
+ )
+ if config.reference_data_enabled
+ else None
+ )
+ else:
+ spool = build_stable_spool(config, catalog)
+ handoff = build_stable_handoff(config, spool)
+ execution_mark_index_reader = (
+ HttpExecutionMarkIndexReader(
+ config.execution_mark_index_urls,
+ config.internal_ingest_secret,
+ ssl_context=stable_client_ssl_context(config),
+ )
+ if config.execution_mark_index_urls
+ else None
)
- if config.execution_mark_index_urls
- else None
- )
service, _backend, issuer = build_stable_query_stack(
spool=spool, catalog=catalog, schema_digest=config.schema_digest,
handoff=handoff, cursor_ttl_seconds=config.cursor_ttl_seconds,
@@ -668,9 +774,11 @@ def create_stable_query_app(config: StableRuntimeConfig | None = None) -> FastAP
provider_admission_secret=config.internal_ingest_secret,
session_liveness_root=str(config.session_liveness_dir),
execution_mark_index_reader=execution_mark_index_reader,
+ backend=kn_backend, issuer=kn_issuer,
+ alpha_mark_index_reader_factory=kn_alpha_reader,
)
readiness = stable_readiness(
- config, manifests, spool, quota=identity.quota,
+ config, manifests, spool, quota=identity.quota, market_cache_backend=kn_backend,
extra_probes=(CallableReadinessProbe("instrument_catalog", lambda: _ready(
"instrument_catalog", detail=f"bindings={len(catalog.bindings)}",
revision=str(catalog.catalog_revision),
@@ -683,6 +791,14 @@ def create_stable_query_app(config: StableRuntimeConfig | None = None) -> FastAP
contract_version="2.0.0", authority="INTERNAL_STABLE",
)
app.state.runtime_manifest = config.public_manifest()
+ app.state.stable_query_backend = query_backend
+ read_view_secret_file = os.environ.get(READ_VIEW_SECRET_FILE_ENV, "").strip()
+ if kn_backend is not None and read_view_secret_file:
+ # D29: the native Stream's GetSnapshot/GetFeedStatus read view.
+ install_kn_read_view(
+ app, service=service, backend=kn_backend, issuer=kn_issuer,
+ secret=bytes.fromhex(Path(read_view_secret_file).read_text(encoding="utf-8").strip()),
+ )
app.state.stable_spool = spool
app.state.stable_audit = AuditChain(config.audit_path)
app.state.execution_mark_index_reader = execution_mark_index_reader
@@ -692,9 +808,12 @@ def create_stable_query_app(config: StableRuntimeConfig | None = None) -> FastAP
async def close_stable_query():
if execution_mark_index_reader is not None:
await execution_mark_index_reader.close()
- await asyncio.to_thread(spool.close)
+ await service.close()
+ if spool is not None:
+ await asyncio.to_thread(spool.close)
await asyncio.to_thread(identity.quota.close)
+ freeze_query_startup_heap()
return app
@@ -759,7 +878,7 @@ def create_stable_stream_runtime(
catalog,
acquisition=acquisition,
session_liveness_reader=StableSessionLivenessReader(
- config.session_liveness_dir
+ config.session_liveness_dir, clock_ns=time.time_ns
),
)
@@ -853,8 +972,13 @@ async def serve_stable_stream() -> None:
level=os.environ.get("LOG_LEVEL", "INFO"),
format="%(asctime)s %(levelname)s %(name)s %(message)s",
)
+ # The stream process both writes (ingest append) and fans out; the same
+ # GIL and GC settings as the Query reader keep a burst of subscription work
+ # from holding the writer's thread for a whole collection or switch period.
+ configure_query_interpreter()
runtime = create_stable_stream_runtime()
await runtime.start()
+ freeze_query_startup_heap()
server = uvicorn.Server(uvicorn.Config(
runtime.health_app, host="0.0.0.0", port=runtime.config.http_port,
log_level="info", access_log=False, log_config=None,
diff --git a/qdl/runtime/stable_bar_edge.py b/qdl/runtime/stable_bar_edge.py
index a7d61c31..37abddf5 100644
--- a/qdl/runtime/stable_bar_edge.py
+++ b/qdl/runtime/stable_bar_edge.py
@@ -13,6 +13,7 @@
from pathlib import Path
from qdl.adapters.intervals import (
+ BarHistoryGapError,
canonical_interval_ms,
is_valid_bar_open_ms,
latest_closed_boundary_ms,
@@ -31,6 +32,7 @@
from qdl.common.v1 import common_pb2
from qdl.marketdata.v2 import market_data_pb2
from qdl.runtime.heartbeat import write_heartbeat
+from qdl.runtime.kn_bar_readback import KnBarReadbackError
from qdl.runtime.stable_catalog import StableSourceBinding, StableSourceCatalog
from qdl.runtime.stable_capacity import (
STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW,
@@ -61,6 +63,18 @@
# reports real coverage rather than inventing missing rows.
_BOOTSTRAP_HISTORY_LOOKBACK_DAYS = 1_095
_BOOTSTRAP_HISTORY_LOOKBACK_MS = _BOOTSTRAP_HISTORY_LOOKBACK_DAYS * 86_400_000
+# Native websocket BAR delivery is primary. These bounds only govern the
+# provider-history repair path after durable evidence proves a native hole.
+_NATIVE_RECOVERY_LOOKBACK_ROWS = 3
+_NATIVE_RECOVERY_GRACE_SECONDS = 3.0
+_NATIVE_RECOVERY_VISIBILITY_SECONDS = 10.0
+_NATIVE_RECOVERY_MAX_CONCURRENT_REQUESTS = 4
+# KN-4 D47-1: published history is "served" only when the market cache reads it
+# back; a binding still unserved after this long is reported overdue (never
+# re-fetched from the venue while the cache is catching up).
+_SERVE_OVERDUE_SECONDS = 900.0
+# Bindings whose serving is verified per loop turn (bounded cache reads).
+_SERVE_VERIFY_PER_TURN = 8
@dataclass(frozen=True, slots=True)
@@ -122,10 +136,10 @@ def _bar_interval_ms(interval: str) -> int:
raise ValueError(f"stable BAR interval is unsupported: {interval}") from error
-def durable_bar_history_capacity_rows(interval: str) -> int:
- """Return the truthful retained-row ceiling for one durable BAR interval."""
-
- return max(1, _BOOTSTRAP_HISTORY_LOOKBACK_MS // _bar_interval_ms(interval))
+def durable_bar_history_capacity_rows(interval: str, *, kafka_native: bool = False) -> int:
+ """Legacy spool sizing horizon or the KN public row bound, not listing age."""
+ step = _bar_interval_ms(interval)
+ return _MAX_DURABLE_BAR_ROWS if kafka_native else max(1, _BOOTSTRAP_HISTORY_LOOKBACK_MS // step)
def _source_provider(source: StableSourceBinding) -> str:
@@ -158,6 +172,17 @@ def _latest_source_closed_boundary_ms(
)
+def native_recovery_bar_bindings(pairs: tuple) -> tuple:
+ """Return Rust-native BARs eligible only for bounded gap recovery.
+
+ This is deliberately distinct from recurring REST polling. A native lane
+ remains the normal final-BAR authority; the edge consults provider history
+ only after its durable tail proves an unresolved gap beyond the grace.
+ """
+
+ return tuple(pair for pair in pairs if pair[1].mode == "RUST_NATIVE")
+
+
def recurring_rest_bar_bindings(pairs: tuple) -> tuple:
"""The BAR bindings this edge keeps polling once the bootstrap has run.
@@ -200,12 +225,21 @@ def __init__(
final_settlement_max_reads: int = 10,
final_settlement_min_age_seconds: float = 6.0,
max_concurrent_requests: int = 32,
+ native_recovery_lookback_rows: int = _NATIVE_RECOVERY_LOOKBACK_ROWS,
+ native_recovery_grace_seconds: float = _NATIVE_RECOVERY_GRACE_SECONDS,
+ native_recovery_visibility_seconds: float = _NATIVE_RECOVERY_VISIBILITY_SECONDS,
state_path: str | Path | None = None,
canonical_cache_id: str | None = None,
canonical_cache_path: str | Path | None = None,
+ bar_readback=None,
repair_only: bool = False,
clock=time.time,
generation_clock_ns=time.time_ns,
+ provider_admission=None,
+ history_demand=None,
+ history_gate=None,
+ history_end_ms: int | None = None,
+ history_only: bool = False,
) -> None:
if not 1 <= warmup_rows <= _MAX_DURABLE_BAR_ROWS:
raise ValueError(
@@ -229,6 +263,14 @@ def __init__(
raise ValueError("stable BAR retry bounds are invalid")
if not 1 <= max_concurrent_requests <= 64:
raise ValueError("stable BAR request concurrency must be between 1 and 64")
+ if not 2 <= native_recovery_lookback_rows <= max_catchup_rows:
+ raise ValueError(
+ "stable native BAR recovery lookback must be between 2 and max catch-up rows"
+ )
+ if not 0.10 <= native_recovery_grace_seconds <= 30.0:
+ raise ValueError("stable native BAR recovery grace must be between 0.10 and 30 seconds")
+ if not 0.10 <= native_recovery_visibility_seconds <= 60.0:
+ raise ValueError("stable native BAR recovery visibility wait must be between 0.10 and 60 seconds")
self.catalog = catalog
self.acquisition = acquisition
self.authority = authority
@@ -244,6 +286,9 @@ def __init__(
self.final_settlement_min_age_seconds = final_settlement_min_age_seconds
self.settlement_reads = 0
self.max_concurrent_requests = max_concurrent_requests
+ self.native_recovery_lookback_rows = native_recovery_lookback_rows
+ self.native_recovery_grace_seconds = native_recovery_grace_seconds
+ self.native_recovery_visibility_seconds = native_recovery_visibility_seconds
self.state_path = Path(state_path) if state_path is not None else None
self.repair_only = repair_only
if repair_only and (self.state_path is None or not self.state_path.is_file()):
@@ -265,6 +310,13 @@ def __init__(
raise ValueError("stable BAR canonical cache identity is invalid")
if self.canonical_cache_path is not None and self.canonical_cache_id is None:
raise ValueError("stable BAR canonical cache path requires its identity")
+ # KN-3 market-cache readback (`kn_bar_readback`) replaces the SQLite
+ # cache path and derives the cache identity itself (below).
+ self.bar_readback = bar_readback
+ if bar_readback is not None and (
+ self.canonical_cache_path is not None or self.canonical_cache_id is not None
+ ):
+ raise ValueError("stable BAR market-cache readback replaces the SQLite cache identity")
self.clock = clock
self.generation_clock_ns = generation_clock_ns
authority_revision = int(authority.get("revision", 0))
@@ -276,7 +328,37 @@ def __init__(
self._retry_attempts: dict[str, int] = {}
self._next_retry_at: dict[str, float] = {}
self._last_retry_log: dict[str, float] = {}
+ self._native_recovery_next_at: dict[str, float] = {}
+ self._native_gap_first_seen_at: dict[str, float] = {}
+ self._native_recovery_pending: dict[str, frozenset[int]] = {}
+ self._native_recovery_verified_open: dict[str, int] = {}
+ self._native_recovery_visible_after: dict[str, float] = {}
self._history_bootstrapped = False
+ # KN-4 D47-1: per-product READY generations seen by the edge, and the
+ # serving progress of published history (kn3 readback only).
+ self._product_generations: dict[str, int | None] = {}
+ # KN-4 D47-2: venue calls behind the Rust provider admission (None keeps
+ # the direct clients). BATCH for history/recovery, REALTIME for live bars.
+ self.provider_admission = provider_admission
+ self._admitted_clients: dict[tuple[str, str], object] = {}
+ # KN-4 D47-3: history depth by demand (binding id -> rows; None keeps
+ # the global bound), a downstream backpressure gate checked before each
+ # binding's history, and truthful short venue history.
+ self.history_demand = dict(history_demand) if history_demand is not None else None
+ self.history_gate = history_gate
+ self._history_short: dict[str, tuple[int, int]] = {}
+ self._history_gate_closed_at: float | None = None
+ # KN-4 D47-4: the history/live join. History holds bars closed before
+ # ``history_end_ms`` (the live log's start, e.g. the mirror start);
+ # ``history_only`` leaves every live bar to that log (no REST poll, no
+ # native recovery) so two live sources never overlap.
+ if history_end_ms is not None and history_end_ms <= 0:
+ raise ValueError("stable BAR history end must be a positive epoch millisecond")
+ self.history_end_ms = history_end_ms
+ self.history_only = bool(history_only)
+ self._serving_pending: dict[str, tuple[frozenset[int], float]] = {}
+ self._served: set[str] = set()
+ self._serve_overdue: set[str] = set()
self._stopped = threading.Event()
source_by_id = {item.binding_id: item for item in catalog.bindings}
@@ -312,6 +394,19 @@ def __init__(
# Native websocket BARs stay owned by their Rust acquisition lane.
self.bindings = recurring_rest_bar_bindings(self.history_bindings)
self.okx_bindings = recurring_rest_bar_bindings(self.history_okx_bindings)
+ self.native_recovery_bindings = native_recovery_bar_bindings(self.history_bindings)
+ self.native_recovery_okx_bindings = native_recovery_bar_bindings(
+ self.history_okx_bindings
+ )
+ self._native_recovery_active = bool(
+ self.native_recovery_bindings or self.native_recovery_okx_bindings
+ )
+ self._native_recovery_next_at = {
+ source.binding_id: 0.0
+ for source, _acquisition in (
+ self.native_recovery_bindings + self.native_recovery_okx_bindings
+ )
+ }
self._heartbeat_path = os.environ.get("QDL_STABLE_HEARTBEAT_PATH") or None
# Keyed by binding id so a capture can ask what channel the core has this
# binding registered under; see `_binance_binding`.
@@ -338,9 +433,13 @@ def __init__(
"stable crypto BAR edge does not bootstrap every configured BAR "
"binding: " + ",".join(sorted(expected_history - history_owned))
)
+ if self.bar_readback is not None:
+ self.canonical_cache_id = self._observed_canonical_cache_id()
validate_shared_authority_record(authority)
self._history_bootstrap_active = bool(expected_history)
- self._rest_fallback_active = bool(self.bindings or self.okx_bindings)
+ self._rest_fallback_active = bool(self.bindings or self.okx_bindings) and not self.history_only
+ if self.history_only:
+ self._native_recovery_active = False
if self._history_bootstrap_active:
self._restore_state()
if self.repair_only:
@@ -565,7 +664,7 @@ def _checkpoint_history_gaps(
the normal real-provider pipeline on the next edge loop.
"""
- if self.canonical_cache_path is None:
+ if not self._durable_cache_configured:
return {}
sources = {
source.binding_id: source
@@ -578,6 +677,8 @@ def _checkpoint_history_gaps(
expected_opens = frozenset(
last_open_ms - index * interval_ms
for index in range(self._bootstrap_rows_for(source))
+ if (getattr(self, "bar_readback", None) is None
+ or last_open_ms - index * interval_ms > 0)
)
missing = len(expected_opens - self._durable_final_bar_opens(
source, expected_opens
@@ -723,8 +824,11 @@ def _apply_history_repair_plan(
)
self._assert_canonical_cache_identity()
if advance_watermark:
+ # Publish progress: the live watermark may move on the Kafka ACK.
self._last_open_ms[plan.source.binding_id] = max(plan.expected_opens)
self._persist_state()
+ self._record_serving(plan.source.binding_id, plan.expected_opens,
+ published=bool(current.missing_envelopes))
logger.info(
"stable provider final BAR history ACK binding=%s venue=%s expected_rows=%s "
"published_rows=%s existing_durable_rows=%s advance_watermark=%s",
@@ -770,6 +874,41 @@ def _publish_history(
advance_watermark=True,
)
+ def _admitted(self, venue: str, priority_name: str):
+ """The shared admitted venue client (one per venue and priority), or None."""
+
+ admission = getattr(self, "provider_admission", None)
+ if admission is None:
+ return None
+ key = (venue, priority_name)
+ client = self._admitted_clients.get(key)
+ if client is None:
+ from qdl.admission.contracts import AdmissionPriority
+
+ priority = AdmissionPriority(priority_name)
+ if venue == "BINANCE":
+ from qdl.adapters.binance.admitted_klines import AdmittedBinanceKlines
+
+ client = AdmittedBinanceKlines(admission, priority=priority)
+ else:
+ from qdl.adapters.okx.admitted_rest import AdmittedOkxRestClient
+
+ client = AdmittedOkxRestClient(admission, priority=priority)
+ self._admitted_clients[key] = client
+ return client
+
+ def _binance_kwargs(self, priority_name: str) -> dict:
+ fetcher = self._admitted("BINANCE", priority_name)
+ return {} if fetcher is None else {"fetcher": fetcher}
+
+ def _okx_kwargs(self, priority_name: str) -> dict:
+ client = self._admitted("OKX", priority_name)
+ if client is None:
+ return {}
+ from qdl.adapters.okx.history import OkxHistoricalClient
+
+ return {"history_client": OkxHistoricalClient(client)}
+
def _fetch_history(
self,
source: StableSourceBinding,
@@ -777,7 +916,9 @@ def _fetch_history(
*,
rows: int,
observed_ms: int,
+ allow_short: bool = False,
) -> tuple[object, ...]:
+ short = {"allow_short": True} if allow_short else {}
if acquisition.runtime == "BINANCE":
return tuple(fetch_binance_history(
self._binance_binding(source),
@@ -785,6 +926,8 @@ def _fetch_history(
now_ms=observed_ms,
attempts=4,
test_provenance=False,
+ **self._binance_kwargs("BATCH"),
+ **short,
))
if acquisition.runtime == "OKX":
return tuple(asyncio.run(fetch_okx_history(
@@ -792,6 +935,8 @@ def _fetch_history(
limit=rows,
now_ms=observed_ms,
test_provenance=False,
+ **self._okx_kwargs("BATCH"),
+ **short,
)))
raise ValueError("stable crypto BAR runtime is unsupported")
@@ -824,7 +969,9 @@ def prepare_history_repair(
# never couple it to the live loop's configured warmup size.
maximum_rows = min(
_MAX_DURABLE_BAR_ROWS,
- durable_bar_history_capacity_rows(source.interval or ""),
+ durable_bar_history_capacity_rows(
+ source.interval or "", kafka_native=getattr(self, "bar_readback", None) is not None
+ ),
)
if rows > maximum_rows:
raise ValueError(
@@ -870,12 +1017,29 @@ def history_repair_remaining_rows(self, plan: StableBarHistoryRepairPlan) -> int
covered = self._durable_final_bar_opens(plan.source, plan.expected_opens)
return len(plan.expected_opens - covered)
+ @property
+ def _durable_cache_configured(self) -> bool:
+ return (
+ self.canonical_cache_path is not None
+ or getattr(self, "bar_readback", None) is not None
+ )
+
+ def _observed_canonical_cache_id(self) -> str:
+ """The SQLite cache_id, or the KN-3 market-cache generation identity."""
+ readback = getattr(self, "bar_readback", None)
+ if readback is not None:
+ return readback.cache_identity(
+ source
+ for source, _acquisition in self.history_bindings + self.history_okx_bindings
+ )
+ return _canonical_cache_id(self.canonical_cache_path)
+
def _assert_canonical_cache_identity(self) -> None:
"""Refuse to certify a bootstrap if its durable generation changed."""
- if self.canonical_cache_path is None:
+ if not self._durable_cache_configured:
return
assert self.canonical_cache_id is not None
- if _canonical_cache_id(self.canonical_cache_path) != self.canonical_cache_id:
+ if self._observed_canonical_cache_id() != self.canonical_cache_id:
raise RuntimeError("stable BAR canonical cache generation changed during bootstrap")
def _rebase_if_canonical_cache_generation_changed(self) -> bool:
@@ -888,16 +1052,21 @@ def _rebase_if_canonical_cache_generation_changed(self) -> bool:
edge's watermarks, issue a new provider-session generation, and let the
existing bounded provider-history bootstrap replenish the cache.
"""
- if self.canonical_cache_path is None:
+ if not self._durable_cache_configured:
return False
assert self.canonical_cache_id is not None
- observed_cache_id = _canonical_cache_id(self.canonical_cache_path)
+ observed_cache_id = self._observed_canonical_cache_id()
if observed_cache_id == self.canonical_cache_id:
return False
previous_cache_id = self.canonical_cache_id
self.canonical_cache_id = observed_cache_id
self._last_open_ms.clear()
+ self._native_recovery_pending.clear()
+ self._native_recovery_verified_open.clear()
+ self._native_gap_first_seen_at.clear()
+ self._native_recovery_visible_after.clear()
+ self._native_recovery_next_at = {key: 0.0 for key in self._native_recovery_next_at}
self._retry_attempts.clear()
self._next_retry_at.clear()
self._last_retry_log.clear()
@@ -926,9 +1095,14 @@ def _durable_final_bar_opens(
captured durable event and fill only missing opens; reconciliation is a
distinct, explicitly revisioned product.
"""
- if not expected_opens or self.canonical_cache_path is None:
+ if not expected_opens or not self._durable_cache_configured:
return frozenset()
self._assert_canonical_cache_identity()
+ readback = getattr(self, "bar_readback", None)
+ if readback is not None:
+ covered = readback.durable_final_bar_opens(source, expected_opens)
+ self._assert_canonical_cache_identity()
+ return covered
connection = None
try:
connection = sqlite3.connect(
@@ -1004,10 +1178,41 @@ def _bootstrap_rows_for(self, source: StableSourceBinding) -> int:
a long BAR bootstrap bounded and honest while keeping minute/hour
warmups at the configured maximum.
"""
- return min(
- self.warmup_rows,
- durable_bar_history_capacity_rows(source.interval or ""),
+ # KN discovers real listing/provider history through bounded pagination.
+ # The old three-year spool sizing horizon is not a provider capability.
+ capacity = durable_bar_history_capacity_rows(
+ source.interval or "", kafka_native=getattr(self, "bar_readback", None) is not None
)
+ rows = min(self.warmup_rows, capacity)
+ demand = getattr(self, "history_demand", None)
+ if demand is not None:
+ # The largest max_warmup_rows of a manifest requiring the product
+ # (the D15 rule); a product nobody demands keeps one bar, enough
+ # for the live watermark. 12,064 is a retention ceiling, not a fill.
+ rows = min(rows, max(1, int(demand.get(source.binding_id, 0))))
+ return rows
+
+ def _history_short_empty(self) -> set[str]:
+ return {binding for binding, (_requested, available) in
+ getattr(self, "_history_short", {}).items() if available == 0}
+
+ def _history_gate_open(self) -> bool:
+ """Downstream backpressure (KN-4 D47-3): history waits, live does not."""
+
+ gate = getattr(self, "history_gate", None)
+ if gate is None:
+ return True
+ admitted, detail = gate()
+ if not admitted:
+ if self._history_gate_closed_at is None:
+ self._history_gate_closed_at = self.clock()
+ logger.warning("stable BAR history paused by downstream backlog %s", detail)
+ return False
+ if self._history_gate_closed_at is not None:
+ logger.info("stable BAR history resumed after %.1fs",
+ self.clock() - self._history_gate_closed_at)
+ self._history_gate_closed_at = None
+ return True
def _settled_observed_ms(self) -> int:
"""Return the real observation clock for provider finality checks.
@@ -1085,50 +1290,161 @@ def _clear_retry(self, binding_id: str) -> None:
def _retry_is_due(self, binding_id: str, *, now: float) -> bool:
return getattr(self, "_next_retry_at", {}).get(binding_id, 0.0) <= now
- def bootstrap_history(self) -> int:
+ # ------------------------------------------------------------------
+ # KN-4 D47-1: per-product rebase and serving progress (kn3 readback)
+
+ def _rebase_changed_products(self) -> tuple[str, ...]:
+ """A product whose READY generation changed loses only its own checkpoint.
+
+ The first READY (``None`` -> g) is the normal transition of a product
+ the edge is filling. A later change (rebuilt, or unpublished because
+ its log held nothing) re-verifies that one binding through the normal
+ bootstrap, which publishes only the opens the cache does not hold; no
+ other binding is touched.
+ """
+
+ readback = getattr(self, "bar_readback", None)
+ if readback is None:
+ return ()
+ sources = [source for source, _acquisition in self.history_bindings + self.history_okx_bindings]
+ current = readback.generation_identities(sources)
+ known = self._product_generations
+ rebased = []
+ for binding_id, generation in current.items():
+ previous = known.get(binding_id)
+ if previous is not None and generation != previous:
+ rebased.append(binding_id)
+ self._last_open_ms.pop(binding_id, None)
+ for store in (self._native_recovery_pending, self._native_recovery_verified_open,
+ self._native_gap_first_seen_at, self._native_recovery_visible_after,
+ self._retry_attempts, self._next_retry_at, self._serving_pending):
+ store.pop(binding_id, None)
+ if binding_id in self._native_recovery_next_at:
+ self._native_recovery_next_at[binding_id] = 0.0
+ self._served.discard(binding_id)
+ self._serve_overdue.discard(binding_id)
+ known[binding_id] = generation
+ if rebased:
+ self._history_bootstrapped = False
+ self._persist_state()
+ logger.warning("stable BAR market cache product generation changed; rebased only bindings=%s",
+ ",".join(sorted(rebased)))
+ return tuple(rebased)
+
+ def _record_serving(self, binding_id: str, opens: frozenset[int], *, published: bool) -> None:
+ if getattr(self, "bar_readback", None) is None:
+ return
+ if published:
+ self._serving_pending[binding_id] = (opens, self.clock())
+ self._served.discard(binding_id)
+ else: # every open was already read back durable
+ self._serving_pending.pop(binding_id, None)
+ self._served.add(binding_id)
+ self._serve_overdue.discard(binding_id)
+
+ def verify_serving(self) -> dict[str, int]:
+ """Promote published history to served once the cache reads it back.
+
+ A Kafka ACK proves publication only; the rows are served when the
+ projector has materialized them. At most ``_SERVE_VERIFY_PER_TURN``
+ bindings are read per call; a binding the cache cannot answer yet stays
+ pending, one past ``_SERVE_OVERDUE_SECONDS`` is reported overdue and is
+ not fetched again from the venue.
+ """
+
+ if getattr(self, "bar_readback", None) is None:
+ return {}
+ sources = {source.binding_id: source
+ for source, _acquisition in self.history_bindings + self.history_okx_bindings}
+ now = self.clock()
+ for binding_id, (opens, published_at) in list(self._serving_pending.items())[:_SERVE_VERIFY_PER_TURN]:
+ try:
+ covered = self._durable_final_bar_opens(sources[binding_id], opens)
+ except KnBarReadbackError:
+ covered = frozenset()
+ if covered == opens:
+ self._serving_pending.pop(binding_id, None)
+ self._served.add(binding_id)
+ self._serve_overdue.discard(binding_id)
+ else:
+ # Rotate so every pending binding is checked in turn.
+ self._serving_pending.pop(binding_id)
+ self._serving_pending[binding_id] = (opens, published_at)
+ if now - published_at > _SERVE_OVERDUE_SECONDS:
+ self._serve_overdue.add(binding_id)
+ return self.serving_status()
+
+ def serving_status(self) -> dict[str, int]:
+ return {"bindings": len(self._binding_ids), "published": len(self._last_open_ms),
+ "served": len(self._served), "pending": len(self._serving_pending),
+ "overdue": len(self._serve_overdue), "short": len(getattr(self, "_history_short", {})),
+ "history_failed": len(getattr(self, "_history_retry", {})),
+ "gate_closed": int(getattr(self, "_history_gate_closed_at", None) is not None)}
+
+ def bootstrap_history(self, *, max_bindings: int | None = None) -> int:
if self.repair_only:
raise RuntimeError("stable BAR repair cannot bootstrap as writer")
self._rebase_if_canonical_cache_generation_changed()
+ self._rebase_changed_products()
if not self._history_bootstrap_active:
return 0
if self._history_bootstrapped:
return 0
observed_ms = self._settled_observed_ms()
+ history_end_ms = getattr(self, "history_end_ms", None)
+ if history_end_ms is not None:
+ observed_ms = min(observed_ms, history_end_ms)
+ if max_bindings is not None and max_bindings < 1:
+ raise ValueError("history binding quantum must be positive")
published = 0
- for source, acquisition in self.history_bindings:
- if source.binding_id in self._last_open_ms:
+ attempted = 0
+ kn_mode = getattr(self, "bar_readback", None) is not None
+ failures = getattr(self, "_history_retry", {})
+ self._history_retry = failures
+ for source, acquisition in self.history_bindings + self.history_okx_bindings:
+ if source.binding_id in self._last_open_ms or source.binding_id in self._history_short_empty():
continue
- bootstrap_rows = self._bootstrap_rows_for(source)
- published += self._publish_history(
- source,
- acquisition,
- self._fetch_history(
- source,
- acquisition,
- rows=bootstrap_rows,
- observed_ms=observed_ms,
- ),
- expected_rows=bootstrap_rows,
- )
- for source, acquisition in self.history_okx_bindings:
- if source.binding_id in self._last_open_ms:
+ if kn_mode and not self._history_gate_open():
+ return published # resumed on a later turn; live bars keep flowing
+ attempt, retry_at = failures.get(source.binding_id, (0, 0))
+ if kn_mode and self.clock() < retry_at:
continue
+ if max_bindings is not None and attempted >= max_bindings:
+ return published
+ attempted += 1
bootstrap_rows = self._bootstrap_rows_for(source)
+ try:
+ values = self._fetch_history(source, acquisition, rows=bootstrap_rows,
+ observed_ms=observed_ms, allow_short=kn_mode)
+ except BarHistoryGapError as error:
+ if not kn_mode:
+ raise
+ attempt += 1
+ failures[source.binding_id] = (attempt, self.clock() + min(2 ** min(attempt, 6), 30))
+ logger.error("stable BAR provider history refused binding=%s attempt=%s error=%s",
+ source.binding_id, attempt, error)
+ continue
+ failures.pop(source.binding_id, None)
+ if len(values) < bootstrap_rows:
+ # The venue has no older bars (new listing / long interval):
+ # reported, never invented, never retried as an error.
+ self._history_short[source.binding_id] = (bootstrap_rows, len(values))
+ logger.warning("stable BAR provider history is short binding=%s requested=%s available=%s",
+ source.binding_id, bootstrap_rows, len(values))
+ if not values:
+ continue
published += self._publish_history(
source,
acquisition,
- self._fetch_history(
- source,
- acquisition,
- rows=bootstrap_rows,
- observed_ms=observed_ms,
- ),
- expected_rows=bootstrap_rows,
+ values,
+ expected_rows=len(values),
)
self._history_bootstrapped = (
- set(self._last_open_ms) == set(self._binding_ids)
+ set(self._last_open_ms) | self._history_short_empty() == set(self._binding_ids)
)
if not self._history_bootstrapped:
+ if kn_mode and failures:
+ return published # other bindings progressed; failed histories are not complete
raise RuntimeError("stable BAR bootstrap did not checkpoint every binding")
logger.info(
"stable multi-venue BAR bootstrap complete bindings=%s rows=%s",
@@ -1192,6 +1508,7 @@ def _pending_for_binding(
now_ms=observed_ms,
attempts=4,
test_provenance=False,
+ **self._binance_kwargs("BATCH"),
)
else:
values = asyncio.run(fetch_okx_history(
@@ -1199,6 +1516,7 @@ def _pending_for_binding(
limit=pending_rows,
now_ms=observed_ms,
test_provenance=False,
+ **self._okx_kwargs("BATCH"),
))
opens = tuple(self._open_time_ms(acquisition, item) for item in values)
@@ -1222,6 +1540,215 @@ def _binding_is_due(self, source: StableSourceBinding, *, observed_ms: int) -> b
previous_open = self._last_open_ms.get(source.binding_id)
return previous_open is None or previous_open < newest_closed_open
+ def _native_expected_opens(
+ self,
+ source: StableSourceBinding,
+ *,
+ observed_ms: int,
+ ) -> frozenset[int]:
+ """Return the small current final-BAR window used to detect a native hole."""
+
+ newest_open_ms = self._expected_closed_open_ms(
+ source, observed_ms=observed_ms
+ )
+ if newest_open_ms is None:
+ return frozenset()
+ interval_ms = _bar_interval_ms(source.interval or "")
+ verified = self._native_recovery_verified_open.get(source.binding_id)
+ if verified is None:
+ rows = self.native_recovery_lookback_rows
+ else:
+ rows = max(self.native_recovery_lookback_rows, (newest_open_ms - verified) // interval_ms)
+ maximum = min(self.max_catchup_rows, durable_bar_history_capacity_rows(
+ source.interval or "", kafka_native=getattr(self, "bar_readback", None) is not None
+ ))
+ if rows > maximum:
+ raise RuntimeError(
+ f"stable native BAR recovery exceeds bounded history binding={source.binding_id} "
+ f"required={rows} maximum={maximum}"
+ )
+ opens = frozenset(
+ newest_open_ms - index * interval_ms
+ for index in range(rows)
+ )
+ if any(value <= 0 for value in opens):
+ return frozenset()
+ return opens
+
+ def _next_native_recovery_check_at(
+ self,
+ source: StableSourceBinding,
+ *,
+ observed_ms: int,
+ now: float,
+ ) -> float:
+ interval_ms = _bar_interval_ms(source.interval or "")
+ boundary_ms = _latest_source_closed_boundary_ms(source, observed_ms)
+ return max(
+ now + 0.01,
+ (boundary_ms + interval_ms) / 1000 + self.settlement_delay_seconds,
+ )
+
+ def _prepare_native_history_repair(
+ self,
+ source: StableSourceBinding,
+ acquisition: StableAcquisitionBinding,
+ *,
+ expected_opens: frozenset[int],
+ observed_ms: int,
+ ) -> StableBarHistoryRepairPlan:
+ """Fetch exactly the observed native-gap window, never a wider tail."""
+
+ plan = self.prepare_history_repair(
+ source.binding_id,
+ rows=len(expected_opens),
+ observed_ms=observed_ms,
+ )
+ if plan.expected_opens != expected_opens:
+ raise RuntimeError(
+ "stable native BAR recovery provider window differs from the durable gap "
+ f"binding={source.binding_id}"
+ )
+ if plan.acquisition != acquisition:
+ raise RuntimeError("stable native BAR recovery acquisition differs from binding")
+ return plan
+
+ def run_native_recovery_cycle(self) -> int:
+ """Repair a proven native BAR hole without polling the healthy fast path."""
+
+ if self.repair_only or not getattr(self, "_native_recovery_active", False):
+ return 0
+ observed_ms = self._settled_observed_ms()
+ now = observed_ms / 1000
+ next_at = self._native_recovery_next_at
+ due = tuple(
+ (source, acquisition)
+ for source, acquisition in (
+ self.native_recovery_bindings + self.native_recovery_okx_bindings
+ )
+ if next_at.get(source.binding_id, 0.0) <= now
+ )
+ if not due:
+ return 0
+
+ candidates: list[tuple[StableSourceBinding, StableAcquisitionBinding, frozenset[int]]] = []
+ for source, acquisition in due:
+ expected_opens = self._native_recovery_pending.get(source.binding_id)
+ if expected_opens is None:
+ try:
+ expected_opens = self._native_expected_opens(source, observed_ms=observed_ms)
+ except Exception as error:
+ self._schedule_retry(source.binding_id, now=now, error=error)
+ next_at[source.binding_id] = self._next_retry_at[source.binding_id]
+ continue
+ if not expected_opens:
+ next_at[source.binding_id] = self._next_native_recovery_check_at(
+ source, observed_ms=observed_ms, now=now
+ )
+ continue
+ covered = self._durable_final_bar_opens(source, expected_opens)
+ if covered == expected_opens:
+ self._native_recovery_pending.pop(source.binding_id, None)
+ self._native_recovery_verified_open[source.binding_id] = max(expected_opens)
+ self._native_gap_first_seen_at.pop(source.binding_id, None)
+ self._native_recovery_visible_after.pop(source.binding_id, None)
+ self._clear_retry(source.binding_id)
+ newest = self._expected_closed_open_ms(source, observed_ms=observed_ms)
+ next_at[source.binding_id] = (
+ now + 0.01 if newest is not None and max(expected_opens) < newest
+ else self._next_native_recovery_check_at(source, observed_ms=observed_ms, now=now)
+ )
+ continue
+
+ # Retain the original hole across provider failures and wall-clock
+ # advances; a healthy newer suffix does not repair missing history.
+ self._native_recovery_pending[source.binding_id] = expected_opens
+ first_seen = self._native_gap_first_seen_at.setdefault(
+ source.binding_id, now
+ )
+ visible_after = self._native_recovery_visible_after.get(
+ source.binding_id, 0.0
+ )
+ retry_at = self._next_retry_at.get(source.binding_id, 0.0)
+ eligible_at = max(
+ first_seen + self.native_recovery_grace_seconds,
+ visible_after,
+ retry_at,
+ )
+ if now < eligible_at:
+ next_at[source.binding_id] = eligible_at
+ continue
+ candidates.append((source, acquisition, expected_opens))
+
+ if not candidates:
+ return 0
+
+ prepared: list[tuple[StableSourceBinding, StableAcquisitionBinding, StableBarHistoryRepairPlan]] = []
+ # Recovery is exceptional and provider-bound. Keep it below the
+ # normal edge polling concurrency so a multi-binding native outage
+ # cannot turn the repair loop into a provider rate-limit incident.
+ workers = min(
+ len(candidates),
+ self.max_concurrent_requests,
+ _NATIVE_RECOVERY_MAX_CONCURRENT_REQUESTS,
+ )
+ with ThreadPoolExecutor(
+ max_workers=workers,
+ thread_name_prefix="qdl-native-bar-repair",
+ ) as executor:
+ futures = {
+ executor.submit(
+ self._prepare_native_history_repair,
+ source,
+ acquisition,
+ expected_opens=expected_opens,
+ observed_ms=max(expected_opens) + _bar_interval_ms(source.interval or "")
+ + max(1, int(self.settlement_delay_seconds * 1000) + 1),
+ ): (source, acquisition)
+ for source, acquisition, expected_opens in candidates
+ }
+ for future in as_completed(futures):
+ source, acquisition = futures[future]
+ try:
+ prepared.append((source, acquisition, future.result()))
+ except Exception as error:
+ self._schedule_retry(source.binding_id, now=now, error=error)
+ next_at[source.binding_id] = self._next_retry_at[source.binding_id]
+
+ published = 0
+ for source, _acquisition, plan in prepared:
+ try:
+ emitted = self.apply_history_repair(
+ plan,
+ expected_missing_rows=len(plan.missing_envelopes),
+ )
+ except Exception as error:
+ self._schedule_retry(source.binding_id, now=now, error=error)
+ next_at[source.binding_id] = self._next_retry_at[source.binding_id]
+ continue
+ published += emitted
+ self._clear_retry(source.binding_id)
+ if emitted:
+ # Kafka acknowledgement precedes canonical/projector visibility.
+ # Wait once before inspecting again so a healthy projector cannot
+ # induce duplicate provider recovery requests.
+ visible_at = self.clock() + self.native_recovery_visibility_seconds
+ self._native_recovery_visible_after[source.binding_id] = visible_at
+ next_at[source.binding_id] = visible_at
+ logger.warning(
+ "stable native final BAR recovery ACK binding=%s venue=%s rows=%s",
+ source.binding_id,
+ plan.acquisition.runtime,
+ emitted,
+ )
+ else:
+ self._native_gap_first_seen_at.pop(source.binding_id, None)
+ self._native_recovery_visible_after.pop(source.binding_id, None)
+ next_at[source.binding_id] = self._next_native_recovery_check_at(
+ source, observed_ms=observed_ms, now=now
+ )
+ return published
+
def _next_ready_at(self, now: float) -> float:
"""Wake for a due target retry or the next provider BAR boundary."""
candidates = []
@@ -1254,6 +1781,10 @@ def _next_ready_at(self, now: float) -> float:
(boundary_ms + interval_ms) / 1000
+ self.settlement_delay_seconds
)
+ candidates.extend(
+ max(now, value)
+ for value in getattr(self, "_native_recovery_next_at", {}).values()
+ )
return min(candidates) if candidates else now + 60.0
def _fetch_latest(
@@ -1272,6 +1803,7 @@ def _fetch_latest(
now_ms=observed_ms,
attempts=1,
test_provenance=False,
+ **self._binance_kwargs("REALTIME"),
confirmations=self.final_settlement_confirmations,
confirm_interval_seconds=self.final_settlement_interval_seconds,
max_reads=self.final_settlement_max_reads,
@@ -1285,6 +1817,7 @@ def _fetch_latest(
now_ms=observed_ms,
attempts=1,
test_provenance=False,
+ **self._okx_kwargs("REALTIME"),
))
raise ValueError("stable crypto BAR runtime is unsupported")
@@ -1298,7 +1831,8 @@ def run_cycle(self) -> int:
due = tuple(
(source, acquisition)
for source, acquisition in self.bindings + self.okx_bindings
- if self._binding_is_due(source, observed_ms=observed_ms)
+ if self._live_history_ready(source.binding_id)
+ and self._binding_is_due(source, observed_ms=observed_ms)
and self._retry_is_due(source.binding_id, now=now)
)
if not due:
@@ -1388,12 +1922,30 @@ def run_cycle(self) -> int:
)
return len(acknowledgements)
+ def _live_history_ready(self, binding_id: str) -> bool:
+ # Live progress and the bootstrap checkpoint share last_open_ms. Do not
+ # let a first live close falsely complete an unbootstrapped history.
+ return (getattr(self, "bar_readback", None) is None
+ or not getattr(self, "_history_bootstrap_active", False)
+ or binding_id in self._last_open_ms)
+
+ def _history_loop_delay(self, now: float) -> float | None:
+ if (getattr(self, "bar_readback", None) is None
+ or not getattr(self, "_history_bootstrap_active", False)
+ or getattr(self, "_history_bootstrapped", False)):
+ return None
+ retries = getattr(self, "_history_retry", {})
+ missing = set(self._binding_ids) - set(self._last_open_ms) - self._history_short_empty()
+ if not missing:
+ return None
+ return max(.1, min(max(0., retries.get(key, (0, now))[1] - now) for key in missing))
+
def _loop_sleep_seconds(self, now: float) -> float:
- if not self._rest_fallback_active:
- return 60.0
- # The configured 100ms first poll/retry cannot work when the outer
- # scheduler imposes a larger arbitrary sleep floor.
- return max(0.01, self._next_ready_at(now) - now)
+ delay = 60.0
+ if self._rest_fallback_active or getattr(self, "_native_recovery_active", False):
+ delay = max(0.01, self._next_ready_at(now) - now)
+ history_delay = self._history_loop_delay(now)
+ return delay if history_delay is None else min(delay, history_delay)
def run_forever(self) -> None:
if self.repair_only:
@@ -1415,17 +1967,28 @@ def run_forever(self) -> None:
# accommodation `_source_provider` already makes for them.
heartbeat_path = getattr(self, "_heartbeat_path", None)
if heartbeat_path is not None:
+ serving = self.serving_status() if getattr(self, "bar_readback", None) is not None else {}
write_heartbeat(heartbeat_path, role="stable_bar_edge",
- detail=f"bindings={len(self.history_bindings)}")
+ detail=f"bindings={len(self.history_bindings)}"
+ + "".join(f" {name}={value}" for name, value in serving.items()))
try:
# Bootstrap is a bounded latest-closed history read. It must
# run immediately after process start; `_next_ready_at()` is
# deliberately a recurring-poll scheduler and moves a settled
# boundary to the next interval. Using it here would defer an
# empty checkpoint forever at every boundary.
- self.bootstrap_history()
+ if getattr(self, "bar_readback", None) is not None:
+ if self._rest_fallback_active:
+ self.run_cycle()
+ self.bootstrap_history(max_bindings=1)
+ else:
+ self.bootstrap_history()
+ if getattr(self, "bar_readback", None) is not None:
+ self.verify_serving()
if self._rest_fallback_active:
self.run_cycle()
+ if getattr(self, "_native_recovery_active", False):
+ self.run_native_recovery_cycle()
failures = 0
except Exception:
failures += 1
@@ -1442,11 +2005,22 @@ def stop(self, *_args) -> None:
self.publisher.close()
+class _ReadOnlyRepairPublisher:
+ """A proof-only publisher that makes accidental repair writes impossible."""
+
+ def publish_many(self, _values):
+ raise RuntimeError("read-only stable BAR repair probe cannot publish")
+
+ def close(self) -> None:
+ return None
+
+
def build_from_environment(
*,
state_path: str | Path | None = None,
client_id: str | None = None,
repair_only: bool = False,
+ publisher: KafkaRawPublisher | _ReadOnlyRepairPublisher | None = None,
) -> StableBinanceBarEdge:
"""Build the shared edge or an isolated repair client from one runtime env."""
@@ -1456,15 +2030,62 @@ def build_from_environment(
)
runtime_dir = Path(os.environ["QDL_STABLE_RUNTIME_DIR"])
authority = json.loads((runtime_dir / "authority.json").read_text(encoding="utf-8"))
- cert_root = Path(os.environ["QDL_KAFKA_CERT_ROOT"])
- publisher = KafkaRawPublisher(KafkaRawPublisherConfig(
- bootstrap_servers=os.environ["QDL_KAFKA_BOOTSTRAP_SERVERS"],
- client_id=client_id or os.environ["QDL_KAFKA_CLIENT_ID"],
- topic=acquisition.raw_topic,
- ca_path=cert_root / "ca.crt",
- certificate_path=cert_root / "client.crt",
- key_path=cert_root / "client.key",
- ))
+ if publisher is None:
+ cert_root = Path(os.environ["QDL_KAFKA_CERT_ROOT"])
+ publisher = KafkaRawPublisher(KafkaRawPublisherConfig(
+ bootstrap_servers=os.environ["QDL_KAFKA_BOOTSTRAP_SERVERS"],
+ client_id=client_id or os.environ["QDL_KAFKA_CLIENT_ID"],
+ topic=acquisition.raw_topic,
+ ca_path=cert_root / "ca.crt",
+ certificate_path=cert_root / "client.crt",
+ key_path=cert_root / "client.key",
+ ))
+ # Durable BAR readback backend: the SQLite canonical cache (default) or
+ # the KN-3 market cache (`QDL_STABLE_BAR_READBACK=kn3`, until KN-5 cutover).
+ readback_backend = os.environ.get("QDL_STABLE_BAR_READBACK", "sqlite")
+ if readback_backend not in ("sqlite", "kn3"):
+ raise ValueError(f"stable BAR readback backend is unsupported: {readback_backend}")
+ bar_readback = None
+ if readback_backend == "kn3":
+ from qdl.runtime.kn_bar_readback import readback_from_environment
+
+ bar_readback = readback_from_environment(os.environ)
+ # KN-4 D47-2: venue calls behind the Rust provider admission when its
+ # private endpoint and secret are configured (off by default).
+ provider_admission = None
+ admission_url = os.environ.get("QDL_STABLE_BAR_PROVIDER_ADMISSION_URL", "").strip()
+ if admission_url:
+ from qdl.admission import RustHttpProviderAdmission
+ from qdl.admission.edge import BlockingProviderAdmission
+
+ secret_file = os.environ.get("QDL_STABLE_BAR_PROVIDER_ADMISSION_SECRET_FILE", "").strip()
+ if not secret_file:
+ raise ValueError("stable BAR provider admission needs its secret file")
+ secret = Path(secret_file).read_bytes().strip()
+ provider_admission = BlockingProviderAdmission(
+ lambda: RustHttpProviderAdmission(base_url=admission_url, secret=secret),
+ max_wait_s=float(os.environ.get("QDL_STABLE_BAR_PROVIDER_ADMISSION_MAX_WAIT_S", "30")),
+ )
+ # KN-4 D47-3: history depth by demand and downstream backpressure (KN mode).
+ history_demand = None
+ demand_bundle = os.environ.get("QDL_STABLE_BAR_DEMAND_BUNDLE", "").strip()
+ if demand_bundle:
+ from qdl.runtime.bar_history_demand import load_demanded_history_rows
+
+ history_demand = load_demanded_history_rows(demand_bundle)
+ history_end_ms = int(os.environ["QDL_STABLE_BAR_HISTORY_END_MS"]) if os.environ.get(
+ "QDL_STABLE_BAR_HISTORY_END_MS", "").strip() else None
+ history_only = os.environ.get("QDL_STABLE_BAR_HISTORY_ONLY", "0").strip() == "1"
+ history_gate = None
+ backpressure_bootstrap = os.environ.get("QDL_STABLE_BAR_BACKPRESSURE_BOOTSTRAP", "").strip()
+ if backpressure_bootstrap:
+ from qdl.runtime.history_backpressure import Stage, kafka_backlog_from_environment
+
+ stages = []
+ for spec in os.environ["QDL_STABLE_BAR_BACKPRESSURE_STAGES"].split(","):
+ name, group, topic, limit = spec.split(":")
+ stages.append(Stage(name, group, topic, int(limit)))
+ history_gate = kafka_backlog_from_environment(os.environ, stages)
canonical_cache_path = Path(os.environ.get(
"QDL_STABLE_CANONICAL_CACHE_PATH",
str(
@@ -1510,6 +2131,15 @@ def build_from_environment(
max_concurrent_requests=int(
os.environ.get("QDL_STABLE_BAR_MAX_CONCURRENT_REQUESTS", "32")
),
+ native_recovery_lookback_rows=int(
+ os.environ.get("QDL_STABLE_NATIVE_BAR_RECOVERY_LOOKBACK_ROWS", "3")
+ ),
+ native_recovery_grace_seconds=float(
+ os.environ.get("QDL_STABLE_NATIVE_BAR_RECOVERY_GRACE_SECONDS", "3.0")
+ ),
+ native_recovery_visibility_seconds=float(
+ os.environ.get("QDL_STABLE_NATIVE_BAR_RECOVERY_VISIBILITY_SECONDS", "10.0")
+ ),
state_path=state_path or os.environ.get(
"QDL_STABLE_BAR_STATE_PATH",
str(
@@ -1522,12 +2152,33 @@ def build_from_environment(
/ "stable-crypto-bar-edge.json"
),
),
- canonical_cache_id=_canonical_cache_id(canonical_cache_path),
- canonical_cache_path=canonical_cache_path,
+ canonical_cache_id=(
+ _canonical_cache_id(canonical_cache_path) if bar_readback is None else None
+ ),
+ canonical_cache_path=canonical_cache_path if bar_readback is None else None,
+ bar_readback=bar_readback,
+ provider_admission=provider_admission,
+ history_demand=history_demand,
+ history_gate=history_gate,
+ history_end_ms=history_end_ms,
+ history_only=history_only,
repair_only=repair_only,
)
+def build_readonly_repair_probe_from_environment(
+ *,
+ state_path: str | Path | None = None,
+) -> StableBinanceBarEdge:
+ """Build a provider/cache inspection client with no Kafka write capability."""
+
+ return build_from_environment(
+ state_path=state_path,
+ repair_only=True,
+ publisher=_ReadOnlyRepairPublisher(),
+ )
+
+
def main() -> int:
logging.basicConfig(
level=os.environ.get("LOG_LEVEL", "INFO"),
diff --git a/qdl/runtime/stable_capacity.py b/qdl/runtime/stable_capacity.py
index 7425d9b8..1b93c0b5 100644
--- a/qdl/runtime/stable_capacity.py
+++ b/qdl/runtime/stable_capacity.py
@@ -25,3 +25,14 @@
STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW = (
STABLE_SPOOL_PUBLIC_PARTITION_WINDOW + STABLE_SPOOL_LATE_BACKFILL_HEADROOM
)
+
+# `/v2/data-quality/gaps` is an operational diagnostic over retained canonical
+# tails, not a normal consumer read. These bounds deliberately favor a typed
+# incomplete result over competing with hot reads or retaining a catalog in
+# memory. A page is smaller than the maximum accepted spool event batch and
+# the scanner releases it before moving to the next page/binding.
+STABLE_GAP_DIAGNOSTIC_PAGE_ROWS = 4
+STABLE_GAP_DIAGNOSTIC_MAX_PAGE_PAYLOAD_BYTES = 8 * 1024 * 1024
+STABLE_GAP_DIAGNOSTIC_MAX_RESULTS = 2_048
+STABLE_GAP_DIAGNOSTIC_MAX_EXPECTED_BARS = STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW
+STABLE_GAP_DIAGNOSTIC_MAX_WORK_MS = 5_000
diff --git a/qdl/runtime/stable_ingest.py b/qdl/runtime/stable_ingest.py
index 4333882e..02364d04 100644
--- a/qdl/runtime/stable_ingest.py
+++ b/qdl/runtime/stable_ingest.py
@@ -7,6 +7,7 @@
import logging
import re
import ssl
+import time
import uuid
from collections.abc import Iterator
from dataclasses import dataclass, field
@@ -61,6 +62,69 @@ def _bounded_rejection_text(detail: str) -> str:
)[:_MAX_REJECTION_DETAIL_CHARS]
+class _IngestSpans:
+ """Where the single stream writer spends an ingest request, per 10 s.
+
+ Phase-3 (2026-09-23): during market bursts every projector's
+ ``durable_append`` - one HTTP round trip into this handler - rose from tens
+ of milliseconds to seconds at once, and the handler said nothing about why.
+ One line per ten seconds splits it: decode/validation, raw-reference
+ lookup, pre-spool view, publish (spool lock wait + held append + fan-out,
+ the first two read from the spool's own counters), post-append view.
+ """
+
+ _NAMES = ("decode", "raw_lookup", "view_pre", "publish", "view_post", "total")
+
+ def __init__(self) -> None:
+ self._reset()
+ self._reported_at_ns = time.monotonic_ns()
+ self._append_before: dict[str, int] | None = None
+
+ def _reset(self) -> None:
+ self._requests = 0
+ self._events = 0
+ self._sum = {name: 0 for name in self._NAMES}
+ self._max = {name: 0 for name in self._NAMES}
+
+ def observe(self, *, events: int, **spans_ns: int) -> None:
+ self._requests += 1
+ self._events += events
+ for key, value in spans_ns.items():
+ name = key.removesuffix("_ns")
+ self._sum[name] += value
+ self._max[name] = max(self._max[name], value)
+
+ def maybe_report(self, *, spool, gateway) -> None:
+ now_ns = time.monotonic_ns()
+ elapsed_ns = now_ns - self._reported_at_ns
+ if elapsed_ns < 10_000_000_000 or not self._requests:
+ return
+ timing = dict(getattr(spool, "append_timing", {}) or {})
+ before = self._append_before or {key: 0 for key in timing}
+ calls = timing.get("calls", 0) - before.get("calls", 0)
+ wait = timing.get("wait_ns", 0) - before.get("wait_ns", 0)
+ hold = timing.get("hold_ns", 0) - before.get("hold_ns", 0)
+ spans = " ".join(
+ f"{name}_ms=mean:{self._sum[name] / self._requests / 1e6:.1f},max:{self._max[name] / 1e6:.1f}"
+ for name in self._NAMES
+ )
+ logger.info(
+ "qdl_stable_ingest_spans requests=%d events_per_s=%.0f %s "
+ "append_calls=%d lock_wait_ms=mean:%.1f,max:%.1f lock_hold_ms=mean:%.1f,max:%.1f subscribers=%d",
+ self._requests, self._events / (elapsed_ns / 1e9), spans,
+ calls,
+ wait / max(1, calls) / 1e6, timing.get("max_wait_ns", 0) / 1e6,
+ hold / max(1, calls) / 1e6, timing.get("max_hold_ns", 0) / 1e6,
+ getattr(gateway, "subscriber_count", -1),
+ )
+ if isinstance(getattr(spool, "append_timing", None), dict):
+ spool.append_timing["max_wait_ns"] = 0
+ spool.append_timing["max_hold_ns"] = 0
+ self._append_before = dict(spool.append_timing)
+ self._reported_at_ns = now_ns
+ self._reset()
+
+
def install_stable_canonical_ingest(
app: FastAPI,
*,
@@ -72,6 +136,7 @@ def install_stable_canonical_ingest(
) -> None:
if len(secret) < 32:
raise ValueError("stable internal ingest secret must contain at least 256 bits")
+ spans = _IngestSpans()
@app.post("/internal/v2/canonical/events", include_in_schema=False)
async def ingest(
@@ -79,6 +144,7 @@ async def ingest(
signature: str | None = Header(None, alias="X-QDL-Stable-Signature"),
):
body = await request.body()
+ started_ns = time.perf_counter_ns()
if not signature or not hmac.compare_digest(
signature, stable_hmac_signature(secret, body)
):
@@ -101,6 +167,7 @@ async def ingest(
raise HTTPException(status_code=409, detail="stable gateway is not active") from error
references = []
+ decode_started_ns = time.perf_counter_ns()
for value in values:
try:
required_fields = {"canonical", "raw_stream", "raw_event_id"}
@@ -148,6 +215,7 @@ async def ingest(
raise HTTPException(status_code=422, detail=str(error)) from error
raw_by_reference = {}
+ raw_started_ns = time.perf_counter_ns()
for raw_stream in sorted({
item[3] for item in references if item[5] is None
}):
@@ -193,6 +261,7 @@ async def ingest(
},
)))
+ view_started_ns = time.perf_counter_ns()
pre_spool_view_records: list[tuple[StableSourceBinding, market_data_pb2.EventEnvelope]] = []
if execution_mark_index_view is not None:
# The signed projector is the read-committed canonical Kafka
@@ -220,6 +289,7 @@ async def withdraw_pre_spool_view_records() -> None:
)
try:
+ publish_started_ns = time.perf_counter_ns()
stored_values = await gateway.publish_many(
[event for _binding, _envelope, event in prepared]
)
@@ -239,6 +309,7 @@ async def withdraw_pre_spool_view_records() -> None:
except BaseException:
await withdraw_pre_spool_view_records()
raise
+ publish_done_ns = time.perf_counter_ns()
duplicate_ids = [
event.event_id
for (_binding, _envelope, event), stored in zip(
@@ -280,6 +351,16 @@ async def withdraw_pre_spool_view_records() -> None:
"offset": stored.cursor.offset,
"duplicate": duplicate,
})
+ spans.observe(
+ events=len(values),
+ decode_ns=raw_started_ns - decode_started_ns,
+ raw_lookup_ns=view_started_ns - raw_started_ns,
+ view_pre_ns=publish_started_ns - view_started_ns,
+ publish_ns=publish_done_ns - publish_started_ns,
+ view_post_ns=time.perf_counter_ns() - publish_done_ns,
+ total_ns=time.perf_counter_ns() - started_ns,
+ )
+ spans.maybe_report(spool=spool, gateway=gateway)
return {
"schema": _RESULT_SCHEMA,
"lease_epoch": lease_epoch,
diff --git a/qdl/runtime/stable_source.py b/qdl/runtime/stable_source.py
index c1c7c393..45e28c91 100644
--- a/qdl/runtime/stable_source.py
+++ b/qdl/runtime/stable_source.py
@@ -3,7 +3,9 @@
import hashlib
import time
from dataclasses import dataclass, replace
+from typing import Callable
+from qdl.query.cold_work import cold_yield
from qdl.adapters.intervals import (
canonical_interval_ms,
latest_closed_boundary_ms,
@@ -36,7 +38,8 @@
StalePolicy,
V2QueryService,
)
-from qdl.query.results import NON_REPLAYABLE_STREAM_CURSOR
+from qdl.query.contracts import CanonicalErrorCode, QueryProblem
+from qdl.query.results import NON_REPLAYABLE_STREAM_CURSOR, QueryBackendError
from qdl.replay import GapFreeHandoff
from qdl.runtime.stable_catalog import (
StableSourceBinding,
@@ -44,6 +47,11 @@
canonical_payload_interval,
)
from qdl.runtime.stable_capacity import (
+ STABLE_GAP_DIAGNOSTIC_MAX_EXPECTED_BARS,
+ STABLE_GAP_DIAGNOSTIC_MAX_PAGE_PAYLOAD_BYTES,
+ STABLE_GAP_DIAGNOSTIC_MAX_RESULTS,
+ STABLE_GAP_DIAGNOSTIC_MAX_WORK_MS,
+ STABLE_GAP_DIAGNOSTIC_PAGE_ROWS,
STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW,
STABLE_SPOOL_PUBLIC_PARTITION_WINDOW,
)
@@ -51,7 +59,11 @@
from qdl.stream import GrpcSnapshot
from qdl.reference.execution_live import ExecutionMarkIndexReader
from qdl.transport import Cursor, SQLiteDurableSpool, StoredEvent
-from qdl.transport.sqlite_spool import FinalBarTailWindow
+from qdl.transport.sqlite_spool import (
+ FinalBarTailWindow,
+ TailReadCancelled,
+ TailReadLimitExceeded,
+)
def _decimal_text(value) -> str:
@@ -174,6 +186,18 @@ class _ParsedStoredEvent:
envelope: market_data_pb2.EventEnvelope
+class _GapDiagnosticIncomplete(RuntimeError):
+ """The global gap diagnostic reached a declared safe work bound."""
+
+
+
+def _cold_iter(values):
+ """Iterate, pausing cooperatively when the thread runs cold work."""
+
+ for value in values:
+ cold_yield()
+ yield value
+
class StableSpoolQueryBackend:
"""Provider-neutral stable query view over a Kafka-rebuildable SQLite cache."""
@@ -186,19 +210,41 @@ def __init__(
config_revision: int = 1,
session_liveness_root: str | None = None,
clock_ns=time.time_ns,
+ monotonic_ns=time.monotonic_ns,
+ gap_scan_max_results: int = STABLE_GAP_DIAGNOSTIC_MAX_RESULTS,
+ gap_scan_max_expected_bars: int = STABLE_GAP_DIAGNOSTIC_MAX_EXPECTED_BARS,
+ gap_scan_max_work_ms: int = STABLE_GAP_DIAGNOSTIC_MAX_WORK_MS,
+ gap_scan_page_rows: int = STABLE_GAP_DIAGNOSTIC_PAGE_ROWS,
+ gap_scan_max_page_payload_bytes: int = STABLE_GAP_DIAGNOSTIC_MAX_PAGE_PAYLOAD_BYTES,
) -> None:
if len(schema_digest) != 64:
raise ValueError("stable query schema digest must be SHA-256")
+ if min(
+ gap_scan_max_results,
+ gap_scan_max_expected_bars,
+ gap_scan_max_work_ms,
+ gap_scan_page_rows,
+ gap_scan_max_page_payload_bytes,
+ ) < 1:
+ raise ValueError("stable gap diagnostic bounds must be positive")
self.spool = spool
self.catalog = catalog
self.schema_digest = schema_digest
self.config_revision = config_revision
self._session_liveness = (
- StableSessionLivenessReader(session_liveness_root)
+ StableSessionLivenessReader(session_liveness_root, clock_ns=clock_ns)
if session_liveness_root is not None
else None
)
self._clock_ns = clock_ns
+ self._monotonic_ns = monotonic_ns
+ self._gap_scan_max_results = int(gap_scan_max_results)
+ self._gap_scan_max_expected_bars = int(gap_scan_max_expected_bars)
+ self._gap_scan_max_work_ns = int(gap_scan_max_work_ms) * 1_000_000
+ self._gap_scan_page_rows = int(gap_scan_page_rows)
+ self._gap_scan_max_page_payload_bytes = int(
+ gap_scan_max_page_payload_bytes
+ )
def warmup_is_local(self, requirement: DataRequirement) -> bool:
self.catalog.binding_for(requirement)
@@ -206,14 +252,20 @@ def warmup_is_local(self, requirement: DataRequirement) -> bool:
def latest(self, requirement: DataRequirement) -> MarketDataItem | None:
binding = self.catalog.binding_for(requirement)
- records = self._records(
- requirement,
- limit=(
- STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW
- if requirement.feed is FeedType.BAR
- else 1
- ),
+ records = (
+ self._exact_latest_final_bars(requirement, binding)
+ if binding.feed is FeedType.BAR
+ else None
)
+ if records is None:
+ records = self._records(
+ requirement,
+ limit=(
+ STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW
+ if requirement.feed is FeedType.BAR
+ else 1
+ ),
+ )
if not records:
return None
if binding.feed is FeedType.BAR:
@@ -230,6 +282,48 @@ def latest(self, requirement: DataRequirement) -> MarketDataItem | None:
items = self._items(requirement, quality_records)
return items[-1] if items else None
+ def _exact_latest_final_bars(
+ self, requirement: DataRequirement, binding: StableSourceBinding
+ ) -> tuple[_ParsedStoredEvent, ...] | None:
+ """The newest two final BARs by header index, or ``None`` for the tail.
+
+ ``latest`` judges BAR quality over ``max(2, requested)`` rows. For the
+ common ``requested <= 2`` - the alpha runtime's ``latest_bar`` sends no
+ warmup - this reads two indexed rows instead of decoding the ~12,000-row
+ physical window, measured at about 0.5 CPU-s per read on 2026-09-23
+ (v2.1.1 Phase-3 stage 5). Any doubt returns ``None`` and the retained
+ tail stays authoritative, exactly as in ``history_many``.
+ """
+
+ try:
+ requested, start_ns, end_ns, expected_opens = self._requested_window(requirement)
+ if max(2, requested) != 2:
+ return None
+ window = self._final_bar_window(
+ requirement=requirement, binding=binding, requested=2,
+ start_ns=start_ns, end_ns=end_ns, expected_opens=expected_opens,
+ )
+ reader = getattr(self.spool, "read_final_bar_window", None)
+ if window is None or not callable(reader):
+ return None
+ exact = reader(
+ stream=binding.canonical_stream,
+ partition_key=binding.partition_key,
+ window=window,
+ )
+ if exact is None:
+ return None
+ rows, expected_closes = exact
+ records = self._select_records(binding, self._parse_records(rows), limit=2)
+ if not self._exact_final_bar_window(
+ binding=binding, records=records, requested=2,
+ expected_closes=expected_closes,
+ ):
+ return None
+ return records
+ except Exception:
+ return None
+
def history(self, requirement: DataRequirement) -> HistoryResult | None:
requested, start_ns, end_ns, expected_opens = self._requested_window(requirement)
binding = self.catalog.binding_for(requirement)
@@ -613,20 +707,137 @@ def feed_status(self, requirement: DataRequirement) -> QualityMetadata | None:
return item.quality if item else None
def open_gaps(self) -> tuple[GapRecord, ...]:
- gaps = []
- for binding in self.catalog.bindings:
- records = self._parse_records(self.spool.read_tail(
- stream=binding.canonical_stream,
- partition_key=binding.partition_key,
- limit=(
- STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW
- if binding.feed is FeedType.BAR
- else STABLE_SPOOL_PUBLIC_PARTITION_WINDOW
- ),
- ))
- gaps.extend(self._gaps(binding, records))
+ return self.open_gaps_bounded()
+
+ def open_gaps_bounded(
+ self,
+ *,
+ cancelled: Callable[[], bool] | None = None,
+ ) -> tuple[GapRecord, ...]:
+ """Return a complete global diagnostic result or a typed failure.
+
+ The public diagnostic route must never turn a bounded partial scan into
+ an empty/success response. Each physical tail is decoded in a small
+ page, then released before the next page/binding. The output itself
+ is bounded and a caller receives ``PARTIAL_RESULT`` if its exact scope
+ cannot complete within the declared work budget.
+ """
+
+ stop = cancelled or (lambda: False)
+ deadline_ns = self._monotonic_ns() + self._gap_scan_max_work_ns
+ detected_at_ns = self._clock_ns()
+ gaps: list[GapRecord] = []
+
+ def check_budget() -> None:
+ if stop():
+ raise _GapDiagnosticIncomplete("global gap diagnostic was cancelled")
+ if self._monotonic_ns() >= deadline_ns:
+ raise _GapDiagnosticIncomplete("global gap diagnostic exceeded its work deadline")
+
+ def append_gap(gap: GapRecord) -> None:
+ check_budget()
+ if len(gaps) >= self._gap_scan_max_results:
+ raise _GapDiagnosticIncomplete("global gap diagnostic exceeded its result bound")
+ gaps.append(gap)
+
+ try:
+ for binding in self.catalog.bindings:
+ check_budget()
+ self._scan_binding_gaps_bounded(
+ binding,
+ detected_at_ns=detected_at_ns,
+ append_gap=append_gap,
+ check_budget=check_budget,
+ cancelled=stop,
+ )
+ except (TailReadCancelled, TailReadLimitExceeded, _GapDiagnosticIncomplete) as error:
+ raise QueryBackendError(QueryProblem(
+ CanonicalErrorCode.PARTIAL_RESULT,
+ str(error),
+ True,
+ retry_after_ms=1_000,
+ )) from error
return tuple(sorted(gaps, key=lambda item: (item.detected_at_ns, item.gap_id)))
+ def _scan_binding_gaps_bounded(
+ self,
+ binding: StableSourceBinding,
+ *,
+ detected_at_ns: int,
+ append_gap: Callable[[GapRecord], None],
+ check_budget: Callable[[], None],
+ cancelled: Callable[[], bool],
+ ) -> None:
+ """Scan one exact logical binding without retaining its physical tail."""
+
+ observed_opens: set[int] = set()
+
+ def visit(page: tuple[StoredEvent, ...]) -> None:
+ for stored in page:
+ check_budget()
+ envelope = market_data_pb2.EventEnvelope.FromString(stored.event.payload)
+ if (
+ envelope.WhichOneof("payload") != binding.feed.value.lower()
+ or canonical_payload_interval(envelope) != binding.interval
+ ):
+ continue
+ if common_pb2.QUALITY_FLAG_SEQUENCE_GAP_BEFORE in envelope.quality_flags:
+ append_gap(self._gap(
+ binding,
+ f"sequence:{envelope.source_sequence}",
+ envelope.source_sequence,
+ detected_at_ns,
+ ))
+ if binding.feed is FeedType.BAR:
+ observed_opens.add(int(envelope.bar.open_time_ns))
+
+ self.spool.visit_tail_pages(
+ stream=binding.canonical_stream,
+ partition_key=binding.partition_key,
+ limit=(
+ STABLE_SPOOL_PHYSICAL_PARTITION_WINDOW
+ if binding.feed is FeedType.BAR
+ else STABLE_SPOOL_PUBLIC_PARTITION_WINDOW
+ ),
+ page_rows=self._gap_scan_page_rows,
+ max_page_payload_bytes=self._gap_scan_max_page_payload_bytes,
+ visit=visit,
+ cancelled=cancelled,
+ )
+ if binding.feed is not FeedType.BAR or not observed_opens:
+ return
+
+ step = _interval_ns(binding.interval or "")
+ first_open = min(observed_opens)
+ last_open = max(observed_opens)
+ if binding.continuous_calendar:
+ expected_count = ((last_open - first_open) // step) + 1
+ if expected_count > self._gap_scan_max_expected_bars:
+ raise _GapDiagnosticIncomplete(
+ "global gap diagnostic expected-bar window exceeds its bound"
+ )
+ expected_opens = range(first_open, last_open + step, step)
+ else:
+ try:
+ expected_opens = trading_calendar_for_id(
+ binding.instrument.session_calendar_id
+ ).bar_opens_between_ns(
+ start_ns=first_open,
+ end_ns=last_open + step,
+ interval_ns=step,
+ max_rows=self._gap_scan_max_expected_bars,
+ )
+ except ValueError as error:
+ raise _GapDiagnosticIncomplete(
+ "global gap diagnostic expected-bar window exceeds its bound"
+ ) from error
+ for expected_open in expected_opens:
+ check_budget()
+ if expected_open not in observed_opens:
+ append_gap(self._gap(
+ binding, str(expected_open), "MISSING", detected_at_ns
+ ))
+
def stored_events(self, requirement: DataRequirement) -> tuple[StoredEvent, ...]:
requested, start_ns, end_ns, _ = self._requested_window(requirement)
binding = self.catalog.binding_for(requirement)
@@ -653,6 +864,7 @@ def _validate_records(
"""Fail closed on lineage mismatch within the returned data window."""
for parsed in records:
+ cold_yield()
resolved = self.catalog.binding_for_envelope(parsed.envelope)
if resolved.binding_id != binding.binding_id:
raise ValueError("canonical event resolves to a different stable binding")
@@ -740,7 +952,7 @@ def _parse_records(
stored=row,
envelope=market_data_pb2.EventEnvelope.FromString(row.event.payload),
)
- for row in rows
+ for row in _cold_iter(rows)
)
def _records(
@@ -802,7 +1014,7 @@ def _items(
parsed.envelope,
effective_gap,
)
- for parsed in records
+ for parsed in _cold_iter(records)
)
def _quality(
@@ -824,7 +1036,6 @@ def _quality(
if binding.freshness_basis == "PROVIDER_CONFIRMATION"
else source_observed_ns
)
- freshness_ms = max(0, (self._clock_ns() - freshness_observed_ns) // 1_000_000)
flags = _quality_flag_names(envelope)
explicit_gap = any(
value in {"SEQUENCE_GAP_BEFORE", "OUT_OF_ORDER", "RESYNC_REQUIRED"}
@@ -841,9 +1052,6 @@ def _quality(
if requirement.max_freshness_ms is None
else min(binding.stale_after_ms, requirement.max_freshness_ms)
)
- source_value_age_ms = max(
- 0, (self._clock_ns() - source_observed_ns) // 1_000_000
- )
session_state = "NOT_APPLICABLE"
session_liveness_ms = None
session_flags: tuple[str, ...] = ()
@@ -872,6 +1080,11 @@ def _quality(
):
session_state = "STALE"
session_flags += ("SOURCE_SESSION_HEARTBEAT_EXPIRED",)
+ # Event age is taken after the session read, like the session's own
+ # age: a sample from before the read would under-state both.
+ evaluated_ns = self._clock_ns()
+ freshness_ms = max(0, (evaluated_ns - freshness_observed_ns) // 1_000_000)
+ source_value_age_ms = max(0, (evaluated_ns - source_observed_ns) // 1_000_000)
payload_name = envelope.WhichOneof("payload")
book_unverified = payload_name in {"book_snapshot", "book_delta"} and not (
bool(getattr(envelope, payload_name).sequence_verified)
@@ -1346,7 +1559,7 @@ def bind_history(
stream_cursor=token,
items=tuple(
replace(item, snapshot_id=history.snapshot_id, cursor=token)
- for item in history.items
+ for item in _cold_iter(history.items)
),
)
@@ -1426,12 +1639,17 @@ def load(self, requirement: DataRequirement, *, consumer_id: str) -> GrpcSnapsho
)
+
+def build_local_alpha_mark_index_reader(*, catalog, spool):
+ from qdl.reference.local_mark_index import build_local_alpha_mark_index_reader as build
+ return build(catalog=catalog, spool=spool)
+
def build_stable_query_stack(
*,
- spool: SQLiteDurableSpool,
+ spool: SQLiteDurableSpool | None,
catalog: StableSourceCatalog,
schema_digest: str,
- handoff: GapFreeHandoff,
+ handoff: GapFreeHandoff | None,
cursor_ttl_seconds: int,
pass_through_enabled: bool = False,
reference_data_enabled: bool = False,
@@ -1439,6 +1657,9 @@ def build_stable_query_stack(
provider_admission_secret: bytes | None = None,
session_liveness_root: str | None = None,
execution_mark_index_reader: ExecutionMarkIndexReader | None = None,
+ backend: StableSpoolQueryBackend | None = None,
+ issuer=None,
+ alpha_mark_index_reader_factory=None,
) -> tuple[V2QueryService, StableSpoolQueryBackend, StableConsumerCursorIssuer]:
"""Build the query stack, optionally including the pass-through product.
@@ -1446,13 +1667,23 @@ def build_stable_query_stack(
metadata for an instrument never opens a data product by itself. When it is
off, the registry, the entitlements and the backend are exactly what they
were before, which keeps the default deployment unchanged.
+
+ ``backend``/``issuer``/``alpha_mark_index_reader_factory`` replace the spool
+ backend, its v2 cursor issuer and the spool MARK/INDEX reader together
+ (the KN-4 market-cache backend, ``QDL_STABLE_QUERY_BACKEND=kn3``); omitted,
+ the spool stack is built exactly as before.
"""
- backend = StableSpoolQueryBackend(
- spool,
- catalog,
- schema_digest=schema_digest,
- session_liveness_root=session_liveness_root,
- )
+ if (backend is None) != (issuer is None):
+ raise ValueError("a replacement Query backend needs its own cursor issuer")
+ if backend is None:
+ if spool is None:
+ raise ValueError("the spool Query backend needs its spool")
+ backend = StableSpoolQueryBackend(
+ spool,
+ catalog,
+ schema_digest=schema_digest,
+ session_liveness_root=session_liveness_root,
+ )
served: MarketDataQueryBackend = backend
if pass_through_enabled:
from qdl.runtime.provider_history import ProviderBarHistorySource
@@ -1494,8 +1725,25 @@ def build_stable_query_stack(
reference_batch=reference_batch,
reference_source_id=reference_source_id,
execution_mark_index_reader=execution_mark_index_reader,
+ # Stream handoffs and latest-style warmups (<= 2 rows) must not wait
+ # behind 2,500/5,000-row warmups in the single-active lane.
+ small_local_warmup_lane=True,
+ # A fleet cold start queues its large warmups instead of refusing them.
+ queued_local_batch_lane=True,
+ # Alpha MARK/INDEX reads from this replica's own spool (or, with the
+ # market-cache backend, its cache view), in-process.
+ alpha_mark_index_reader=(
+ (
+ alpha_mark_index_reader_factory()
+ if alpha_mark_index_reader_factory is not None
+ else build_local_alpha_mark_index_reader(catalog=catalog, spool=spool)
+ )
+ if reference_batch is not None
+ else None
+ ),
)
- issuer = StableConsumerCursorIssuer(
- handoff, catalog, ttl_seconds=cursor_ttl_seconds
- )
+ if issuer is None:
+ issuer = StableConsumerCursorIssuer(
+ handoff, catalog, ttl_seconds=cursor_ttl_seconds
+ )
return service, backend, issuer
diff --git a/qdl/stream/grpc_service.py b/qdl/stream/grpc_service.py
index 81025567..6469319a 100644
--- a/qdl/stream/grpc_service.py
+++ b/qdl/stream/grpc_service.py
@@ -290,6 +290,20 @@ def _observe_freshness(
"checked": 0, "refused": 0, "age_sum_ns": 0, "worst_ns": 0,
}
+ async def _record_initial_replay_if_current(self, subscription, stored):
+ """Advance a physical replay cursor without emitting an aged frame.
+
+ Initial replay is not queue-backed, but issuing its signed cursor can
+ still await a durable watermark read. A strict freshness predicate must
+ therefore be evaluated again after that await and immediately before
+ emission. The cursor intentionally remains advanced when the record
+ ages out: it is a filtered physical record, not a delivery the client
+ may safely resume into.
+ """
+
+ record = await subscription.record(stored)
+ return record if subscription.accepts(record.stored) else None
+
async def subscribe(self, request: query_pb2.SubscribeRequest, context):
subscription = None
stream = ""
@@ -350,7 +364,11 @@ async def subscribe(self, request: query_pb2.SubscribeRequest, context):
if pending_skip is not None:
await subscription.record(pending_skip)
pending_skip = None
- record = await subscription.record(stored)
+ record = await self._record_initial_replay_if_current(
+ subscription, stored
+ )
+ if record is None:
+ continue
yield query_pb2.SubscribeResponse(
record=self._event(record.stored, record.resume_token)
)
diff --git a/qdl/transport/sqlite_spool.py b/qdl/transport/sqlite_spool.py
index c5e3a38c..b083a7ad 100644
--- a/qdl/transport/sqlite_spool.py
+++ b/qdl/transport/sqlite_spool.py
@@ -1,5 +1,7 @@
from __future__ import annotations
+from contextlib import contextmanager
+
import hashlib
import json
import shutil
@@ -41,6 +43,14 @@
"""
+class TailReadCancelled(RuntimeError):
+ """A cooperative, bounded diagnostic reader was cancelled."""
+
+
+class TailReadLimitExceeded(RuntimeError):
+ """One diagnostic tail page exceeded its declared input bound."""
+
+
@dataclass(frozen=True)
class SpoolConfig:
path: Path
@@ -151,6 +161,14 @@ def __init__(self, config: SpoolConfig, *, clock_ns=time.time_ns):
self.config = config
self._clock_ns = clock_ns
self._lock = threading.RLock()
+ # Hot single-statement reads use their own connection and lock; see
+ # ``_hot_reader``. Lock order is always ``_lock`` then ``_hot_lock``.
+ self._hot_lock = threading.Lock()
+ self._hot_connection: sqlite3.Connection | None = None
+ self.append_timing = {
+ "calls": 0, "rows": 0, "wait_ns": 0, "hold_ns": 0,
+ "max_wait_ns": 0, "max_hold_ns": 0,
+ }
self._retention_data_version: int | None = None
self._dense_retained_partitions: set[tuple[str, str]] = set()
config.path.parent.mkdir(parents=True, exist_ok=True)
@@ -283,8 +301,8 @@ def _table_exists_locked(self, table_name: str) -> bool:
).fetchone()
return row is not None
- def _final_bar_lookup_index_present_locked(self) -> bool:
- row = self._connection.execute(
+ def _final_bar_lookup_index_present_locked(self, connection=None) -> bool:
+ row = (connection or self._connection).execute(
"""
SELECT 1 FROM sqlite_master
WHERE type = 'index' AND name = ?
@@ -310,13 +328,13 @@ def _create_final_bar_lookup_index_locked(self) -> bool:
raise
return self._final_bar_lookup_index_present_locked()
- def _final_bar_lookup_events_source_locked(self) -> str:
+ def _final_bar_lookup_events_source_locked(self, connection=None) -> str:
# SQLite may prefer the primary-key tail scan until a full ANALYZE has
# run, even when the exact expression index exists. The latter would
# scan a live multi-thousand-row partition for each requested close.
# Force the known-compatible index only when it is actually present;
# legacy caches retain the existing unhinted query and tail fallback.
- if self._final_bar_lookup_index_present_locked():
+ if self._final_bar_lookup_index_present_locked(connection):
return f"events INDEXED BY {FINAL_BAR_LOOKUP_INDEX_NAME}"
return "events"
@@ -524,7 +542,7 @@ def append_many(self, events: list[DurableEvent]) -> list[AppendResult]:
raise BackpressureRequired("event exceeds configured per-event bridge bound")
total_input_bytes = sum(len(event.payload) for event in events)
- with self._lock:
+ with self._timed_append_lock(len(events)):
self._preflight_disk(total_input_bytes)
self._connection.execute("BEGIN IMMEDIATE")
try:
@@ -696,23 +714,32 @@ def read(
if after and (after.stream != stream or after.partition_key != partition_key):
raise ValueError("cursor does not belong to requested stream/partition")
offset = after.offset if after else 0
- with self._lock:
- oldest = self._connection.execute(
- "SELECT MIN(logical_offset) FROM events WHERE stream = ? AND partition_key = ?",
- (stream, partition_key),
- ).fetchone()[0]
- if oldest is not None and offset < int(oldest) - 1:
- raise CursorExpired(
- f"cursor {offset} predates oldest retained offset {int(oldest)}"
- )
- rows = self._connection.execute(
- """
- SELECT * FROM events
- WHERE stream = ? AND partition_key = ? AND logical_offset > ?
- ORDER BY logical_offset ASC LIMIT ?
- """,
- (stream, partition_key, offset, limit),
- ).fetchall()
+ # Replay reads run on the hot connection in one read snapshot, so a
+ # subscription opening never waits on (or holds) the writer's lock.
+ # v2.1.1 stage 20 (2026-09-23): projector appends stalled 2-6 s while
+ # alpha streams opened and closed on the stream process.
+ with self._hot_lock:
+ connection = self._hot_reader_locked()
+ connection.execute("BEGIN")
+ try:
+ oldest = connection.execute(
+ "SELECT MIN(logical_offset) FROM events WHERE stream = ? AND partition_key = ?",
+ (stream, partition_key),
+ ).fetchone()[0]
+ if oldest is not None and offset < int(oldest) - 1:
+ raise CursorExpired(
+ f"cursor {offset} predates oldest retained offset {int(oldest)}"
+ )
+ rows = connection.execute(
+ """
+ SELECT * FROM events
+ WHERE stream = ? AND partition_key = ? AND logical_offset > ?
+ ORDER BY logical_offset ASC LIMIT ?
+ """,
+ (stream, partition_key, offset, limit),
+ ).fetchall()
+ finally:
+ connection.execute("COMMIT")
return [self._stored_event(row) for row in rows]
def read_tail(
@@ -734,8 +761,8 @@ def read_tail(
max_tail_rows = max(10_000, self.config.max_partition_records)
if limit <= 0 or limit > max_tail_rows:
raise ValueError(f"limit must be between 1 and {max_tail_rows}")
- with self._lock:
- rows = self._connection.execute(
+ with self._hot_lock:
+ rows = self._hot_reader_locked().execute(
"""
SELECT * FROM events
WHERE stream = ? AND partition_key = ?
@@ -745,6 +772,54 @@ def read_tail(
).fetchall()
return [self._stored_event(row) for row in reversed(rows)]
+ @contextmanager
+ def _timed_append_lock(self, rows: int):
+ """Hold ``_lock`` for one append and record how long it waited and held.
+
+ Read by the stream ingest spans: a batch append's time splits into
+ waiting for this lock, holding it (SQLite work and fsync), and the
+ gateway's fan-out after it returns.
+ """
+
+ started = time.perf_counter_ns()
+ with self._lock:
+ acquired = time.perf_counter_ns()
+ try:
+ yield
+ finally:
+ held = time.perf_counter_ns() - acquired
+ waited = acquired - started
+ timing = self.append_timing
+ timing["calls"] += 1
+ timing["rows"] += rows
+ timing["wait_ns"] += waited
+ timing["hold_ns"] += held
+ timing["max_wait_ns"] = max(timing["max_wait_ns"], waited)
+ timing["max_hold_ns"] = max(timing["max_hold_ns"], held)
+
+ def _hot_reader_locked(self) -> sqlite3.Connection:
+ """A second, query-only connection for one-statement hot reads.
+
+ ``visit_tails`` holds ``_lock`` while its caller materializes one
+ physical tail - seconds for a 5,000-row BAR warmup. Measured on
+ 2026-09-23 (v2.1.1 Phase-3 stage 5): every hot latest read on that
+ Query replica queued behind it for 2-5 s with its CPU un-throttled.
+ In WAL mode each statement here reads its own committed snapshot, so a
+ single-statement read needs neither the batch transaction nor its lock.
+ Callers hold ``_hot_lock``.
+ """
+
+ if self._hot_connection is None:
+ connection = sqlite3.connect(
+ str(self.config.path), timeout=30.0, isolation_level=None,
+ check_same_thread=False,
+ )
+ connection.row_factory = sqlite3.Row
+ connection.execute("PRAGMA busy_timeout=30000")
+ connection.execute("PRAGMA query_only=ON")
+ self._hot_connection = connection
+ return self._hot_connection
+
def read_tails(
self,
*,
@@ -769,6 +844,59 @@ def collect(key: tuple[str, str], rows: tuple[StoredEvent, ...]) -> None:
self.visit_tails(requests=requests, visit=collect)
return {key: tuple(value) for key, value in grouped.items()}
+ def visit_tail_pages(
+ self,
+ *,
+ stream: str,
+ partition_key: str,
+ limit: int,
+ page_rows: int,
+ max_page_payload_bytes: int,
+ visit: Callable[[tuple[StoredEvent, ...]], None],
+ cancelled: Callable[[], bool] | None = None,
+ ) -> None:
+ """Visit one retained tail in small, bounded physical pages.
+
+ This is deliberately a diagnostic/read primitive rather than a replay
+ API. It avoids ``fetchall`` for a whole retained partition so an
+ expensive inspector cannot retain every payload while it decodes a
+ catalog. Rows are delivered newest first; callers that require market
+ chronology must establish it explicitly from their payload fields.
+ """
+
+ max_tail_rows = max(10_000, self.config.max_partition_records)
+ if limit <= 0 or limit > max_tail_rows:
+ raise ValueError(f"limit must be between 1 and {max_tail_rows}")
+ if page_rows < 1 or page_rows > limit:
+ raise ValueError("tail page rows must fit inside the requested limit")
+ if max_page_payload_bytes < self.config.max_event_bytes:
+ raise ValueError("tail page payload bound must fit one stored event")
+
+ with self._lock:
+ cursor = self._connection.execute(
+ """
+ SELECT * FROM events
+ WHERE stream = ? AND partition_key = ?
+ ORDER BY logical_offset DESC LIMIT ?
+ """,
+ (stream, partition_key, limit),
+ )
+ while True:
+ if cancelled is not None and cancelled():
+ raise TailReadCancelled("bounded diagnostic tail read was cancelled")
+ rows = cursor.fetchmany(page_rows)
+ if not rows:
+ return
+ page_payload_bytes = sum(len(row["payload"]) for row in rows)
+ if page_payload_bytes > max_page_payload_bytes:
+ raise TailReadLimitExceeded(
+ "bounded diagnostic tail page exceeds its payload limit"
+ )
+ page = tuple(self._stored_event(row) for row in rows)
+ if cancelled is not None and cancelled():
+ raise TailReadCancelled("bounded diagnostic tail read was cancelled")
+ visit(page)
+
def visit_tails(
self,
*,
@@ -866,8 +994,10 @@ def _final_bar_window_rows_locked(
stream: str,
partition_key: str,
window: FinalBarTailWindow,
+ connection=None,
) -> tuple[tuple[StoredEvent, ...], tuple[int, ...]] | None:
- watermark = self._connection.execute(
+ connection = connection or self._connection
+ watermark = connection.execute(
"""
SELECT close_time_ns FROM final_bar_watermarks
WHERE stream = ? AND partition_key = ?
@@ -887,8 +1017,8 @@ def _final_bar_window_rows_locked(
raise PayloadCorruption("final BAR watermark window is invalid")
placeholders = ",".join("?" for _ in expected_closes)
try:
- events_source = self._final_bar_lookup_events_source_locked()
- rows = self._connection.execute(
+ events_source = self._final_bar_lookup_events_source_locked(connection)
+ rows = connection.execute(
f"""
SELECT * FROM {events_source}
WHERE stream = ? AND partition_key = ?
@@ -908,6 +1038,33 @@ def _final_bar_window_rows_locked(
expected_closes,
)
+ def read_final_bar_window(
+ self,
+ *,
+ stream: str,
+ partition_key: str,
+ window: FinalBarTailWindow,
+ ) -> tuple[tuple[StoredEvent, ...], tuple[int, ...]] | None:
+ """Exact newest final-BAR rows on the hot connection, or ``None``.
+
+ The same header-indexed lookup as ``visit_final_bar_windows``, for a
+ single latest read that must not wait behind a batch visit. The
+ watermark and its rows are read in one snapshot. Callers validate the
+ rows and fall back to ``read_tail`` when the window is missing or
+ ambiguous.
+ """
+
+ with self._hot_lock:
+ connection = self._hot_reader_locked()
+ connection.execute("BEGIN")
+ try:
+ return self._final_bar_window_rows_locked(
+ stream=stream, partition_key=partition_key, window=window,
+ connection=connection,
+ )
+ finally:
+ connection.execute("COMMIT")
+
def _read_tail_rows_locked(
self,
*,
@@ -1006,7 +1163,7 @@ def checkpoint(
raise ValueError("ttl_seconds must be positive")
now_ns = self._clock_ns()
with self._lock:
- high = self.high_watermark(cursor.stream, cursor.partition_key)
+ high = self._high_watermark_locked(cursor.stream, cursor.partition_key)
if cursor.offset > high:
raise ValueError("checkpoint is beyond the partition high watermark")
current = self._connection.execute(
@@ -1048,8 +1205,8 @@ def checkpoint(
def get_checkpoint(
self, *, consumer_id: str, stream: str, partition_key: str
) -> Cursor | None:
- with self._lock:
- row = self._connection.execute(
+ with self._hot_lock:
+ row = self._hot_reader_locked().execute(
"""
SELECT logical_offset FROM consumer_checkpoints
WHERE consumer_id = ? AND stream = ? AND partition_key = ?
@@ -1230,8 +1387,10 @@ def quarantine_records(self, *, limit: int = 100) -> list[dict[str, int | str]]:
return [dict(row) for row in rows]
def high_watermark(self, stream: str, partition_key: str) -> int:
- with self._lock:
- row = self._connection.execute(
+ """Committed high watermark, read on the hot connection."""
+
+ with self._hot_lock:
+ row = self._hot_reader_locked().execute(
"""
SELECT next_offset FROM partitions
WHERE stream = ? AND partition_key = ?
@@ -1240,6 +1399,16 @@ def high_watermark(self, stream: str, partition_key: str) -> int:
).fetchone()
return int(row["next_offset"]) - 1 if row else 0
+ def _high_watermark_locked(self, stream: str, partition_key: str) -> int:
+ row = self._connection.execute(
+ """
+ SELECT next_offset FROM partitions
+ WHERE stream = ? AND partition_key = ?
+ """,
+ (stream, partition_key),
+ ).fetchone()
+ return int(row["next_offset"]) - 1 if row else 0
+
def stats(self) -> SpoolStats:
with self._lock:
row = self._connection.execute(
@@ -1300,6 +1469,10 @@ def close(self) -> None:
self._checkpoint_wal_passive_locked()
self._connection.close()
self._connection = None
+ with self._hot_lock:
+ if self._hot_connection is not None:
+ self._hot_connection.close()
+ self._hot_connection = None
def integrity_check(self) -> bool:
with self._lock:
diff --git a/qdl_sdk/README.md b/qdl_sdk/README.md
index b9779bea..05ea9d98 100644
--- a/qdl_sdk/README.md
+++ b/qdl_sdk/README.md
@@ -146,7 +146,7 @@ Build the standalone artifact with:
python scripts/build_qdl_sdk_release.py --output-dir dist/qdl-sdk
```
-The output contains a reproducible `qdl_sdk-2.0.3-py3-none-any.whl`, a release
+The output contains a reproducible `qdl_sdk-2.0.4-py3-none-any.whl`, a release
manifest with the wheel/source/generated-contract SHA-256 digests, and a
CycloneDX SBOM. The wheel contains only the public SDK plus generated Protobuf
contracts; it does not package `qdl.api_v2`, runtime adapters, provider code or
diff --git a/qdl_sdk/__init__.py b/qdl_sdk/__init__.py
index f4698cdb..ca23f806 100644
--- a/qdl_sdk/__init__.py
+++ b/qdl_sdk/__init__.py
@@ -1,6 +1,6 @@
"""Stable Python SDK V2 with typed public models and generated transports."""
-__version__ = "2.0.3"
+__version__ = "2.0.5"
from qdl_sdk.client import AsyncDataLayerClient, DataLayerClientV2, WarmupStreamSession
from qdl_sdk.credentials import (
@@ -52,7 +52,11 @@
ReferenceProduct,
ReferenceRequirement,
)
-from qdl_sdk.transport import GrpcStreamTransport, RestQueryTransport
+from qdl_sdk.transport import (
+ GrpcStreamTransport,
+ ReplicatedRestQueryTransport,
+ RestQueryTransport,
+)
from qdl_sdk.tls import WorkloadTlsConfig
from qdl_sdk.v1_facade import V1CompatibilityFacade
@@ -91,6 +95,7 @@
"MetricUnit",
"OPTIONAL_INTERVAL_FEEDS",
"QuantityUnit",
+ "ReplicatedRestQueryTransport",
"RestQueryTransport",
"RecoveryPolicy",
"ReferenceBatchRequest",
diff --git a/qdl_sdk/client.py b/qdl_sdk/client.py
index b887087b..28b1ea3f 100644
--- a/qdl_sdk/client.py
+++ b/qdl_sdk/client.py
@@ -1,12 +1,13 @@
from __future__ import annotations
import asyncio
+from collections import OrderedDict
from contextlib import asynccontextmanager
-from typing import Protocol
+from typing import AsyncIterator, Protocol
from pydantic import ValidationError
-from qdl_sdk.cursor import CursorCheckpoint, CursorStore, MemoryCursorStore
+from qdl_sdk.cursor import CursorCheckpoint, CursorStore, MemoryCursorStore, _await_durable
from qdl_sdk.errors import ContinuityError, CursorExpiredError, DataLayerError
from qdl_sdk.models import (
BatchResponse,
@@ -128,7 +129,7 @@ def _allows_quiet_execution_continuity(requirement: DataRequirement, quality) ->
def _validate_query_payload(
- requirement: DataRequirement, payload: dict, *, warmup: bool
+ requirement: DataRequirement, payload: dict | WarmupResponse | SnapshotResponse, *, warmup: bool
) -> SnapshotResponse | WarmupResponse:
try:
response = (
@@ -271,6 +272,13 @@ def _validate_feed_status_payload(
return response
+async def _load_cursor(store: CursorStore, key: str) -> CursorCheckpoint | None:
+ asynchronous = getattr(store, "aload", None)
+ if asynchronous is not None:
+ return await asynchronous(key)
+ return store.load(key)
+
+
class WarmupStreamSession:
def __init__(
self,
@@ -304,6 +312,9 @@ def __init__(
self._telemetry = telemetry
self.state_restored = state_restored
self._checkpoint_generation_started = state_restored
+ self._ack_lock = asyncio.Lock()
+ self._observed: OrderedDict[str, int] = OrderedDict()
+ self._close_task: asyncio.Task | None = None
self._closed = False
def __aiter__(self):
@@ -316,13 +327,15 @@ async def __anext__(self) -> StreamEvent | ControlEvent:
event = await self._events.__anext__()
except CursorExpiredError:
await self._close_events()
- self.warmup = await self._fresh_snapshot()
- self._last_seen_offset = self.warmup.watermark_offset
- self._checkpoint_generation_started = False
- self._events = self._subscribe(
- self.warmup.stream_cursor
- )
- self._reconnect_attempts = 0
+ async with self._ack_lock:
+ self.warmup = await self._fresh_snapshot()
+ self._last_seen_offset = self.warmup.watermark_offset
+ self._checkpoint_generation_started = False
+ self._events = self._subscribe(
+ self.warmup.stream_cursor
+ )
+ self._reconnect_attempts = 0
+ self._observed.clear()
return ControlEvent(
"SNAPSHOT_REPLACED",
"cursor retention expired; local state must be rebuilt from the attached snapshot",
@@ -334,18 +347,20 @@ async def __anext__(self) -> StreamEvent | ControlEvent:
raise
self._reconnect_attempts += 1
await asyncio.sleep(min(0.1 * 2 ** (self._reconnect_attempts - 1), 2.0))
- checkpoint = (
- self._cursor_store.load(self._cursor_key)
- if self._checkpoint_generation_started
- else None
- )
- if checkpoint is None:
- token = self.warmup.stream_cursor
- self._last_seen_offset = self.warmup.watermark_offset
- else:
- token = checkpoint.token
- self._last_seen_offset = checkpoint.offset
- self._events = self._subscribe(token)
+ async with self._ack_lock:
+ checkpoint = (
+ await _load_cursor(self._cursor_store, self._cursor_key)
+ if self._checkpoint_generation_started
+ else None
+ )
+ if checkpoint is None:
+ token = self.warmup.stream_cursor
+ self._last_seen_offset = self.warmup.watermark_offset
+ else:
+ token = checkpoint.token
+ self._last_seen_offset = checkpoint.offset
+ self._events = self._subscribe(token)
+ self._observed.clear()
return ControlEvent(
"RECONNECTED",
"stream transport reconnected from the last confirmed cursor",
@@ -362,10 +377,37 @@ async def __anext__(self) -> StreamEvent | ControlEvent:
# Gaps in physical offsets therefore represent filtered records, not
# a loss of matching data; server replay/gap checks remain authority.
self._last_seen_offset = event.logical_offset
+ self._observed[event.resume_token] = event.logical_offset
+ while len(self._observed) > self._max_buffer_events:
+ self._observed.popitem(last=False)
self._reconnect_attempts = 0
return event
+ async def acknowledge_async(self, event: StreamEvent) -> None:
+ """Acknowledge after application, without blocking the consumer event loop."""
+ async with self._ack_lock:
+ if self._closed:
+ raise RuntimeError("stream session is closed")
+ if self._observed.get(event.resume_token) != event.logical_offset:
+ raise ValueError("cannot acknowledge an unobserved or superseded event")
+ # Complete both disk I/O and session bookkeeping before releasing the
+ # generation fence, including when the caller is repeatedly cancelled.
+ await _await_durable(self._commit_acknowledgement(event))
+
+ async def _commit_acknowledgement(self, event: StreamEvent) -> None:
+ checkpoint = CursorCheckpoint(event.resume_token, event.logical_offset)
+ method = "save" if self._checkpoint_generation_started else "replace"
+ asynchronous = getattr(self._cursor_store, "a" + method, None)
+ if asynchronous is not None:
+ await asynchronous(self._cursor_key, checkpoint)
+ else:
+ getattr(self._cursor_store, method)(self._cursor_key, checkpoint)
+ self._checkpoint_generation_started = True
+ self._record_acknowledgement(event)
+
def acknowledge(self, event: StreamEvent) -> None:
+ if self._closed or self._ack_lock.locked():
+ raise RuntimeError("session is closed or an asynchronous acknowledgement is active")
if event.logical_offset > self._last_seen_offset:
raise ValueError("cannot acknowledge an event that was not observed")
checkpoint = CursorCheckpoint(event.resume_token, event.logical_offset)
@@ -374,6 +416,9 @@ def acknowledge(self, event: StreamEvent) -> None:
else:
self._cursor_store.replace(self._cursor_key, checkpoint)
self._checkpoint_generation_started = True
+ self._record_acknowledgement(event)
+
+ def _record_acknowledgement(self, event: StreamEvent) -> None:
if self._telemetry is not None:
self._telemetry.record(
consumer_id=self.consumer_id,
@@ -383,10 +428,14 @@ def acknowledge(self, event: StreamEvent) -> None:
)
async def aclose(self) -> None:
- if self._closed:
- return
- self._closed = True
- await self._close_events()
+ if self._close_task is None:
+ self._closed = True
+ self._close_task = asyncio.create_task(self._finish_close())
+ await _await_durable(self._close_task)
+
+ async def _finish_close(self) -> None:
+ async with self._ack_lock:
+ await self._close_events()
async def _close_events(self) -> None:
events = self._events
@@ -445,6 +494,7 @@ def __init__(
cursor_store: CursorStore | None = None,
max_buffer_events: int = 1000,
max_reconnect_attempts: int = 5,
+ max_warmup_attempts: int = 3,
telemetry: TelemetryRecorder | None = None,
) -> None:
if not consumer_id.strip():
@@ -460,6 +510,34 @@ def __init__(
raise ValueError("max_reconnect_attempts must be between 0 and 20")
self.max_reconnect_attempts = max_reconnect_attempts
self.telemetry = telemetry
+ if type(max_warmup_attempts) is not int or not 1 <= max_warmup_attempts <= 3:
+ raise ValueError("max_warmup_attempts must be between 1 and 3")
+ self.max_warmup_attempts = max_warmup_attempts
+ self.warmup_read_attempts = 0
+ self.warmup_admission_retries = 0
+
+ async def _cold_read(self, fetch, *, enabled=True, retry_result=None):
+ # Read-only admission recovery. Never retry quality/auth failures, or
+ # hold unbounded tasks while an overloaded reader rejects work.
+ for attempt in range(self.max_warmup_attempts if enabled else 1):
+ self.warmup_read_attempts += 1
+ try:
+ value = await fetch()
+ except DataLayerError as caught:
+ error = caught
+ else:
+ error = retry_result(value) if enabled and retry_result is not None else None
+ if error is None or attempt + 1 >= self.max_warmup_attempts:
+ return value
+ if (not enabled or error.code != "RATE_LIMITED" or not error.retryable
+ or attempt + 1 >= self.max_warmup_attempts):
+ raise error
+ retry_ms = error.retry_after_ms
+ if retry_ms is not None and (type(retry_ms) is not int or not 0 <= retry_ms <= 2000):
+ raise error
+ delay = max(250 * (attempt + 1), retry_ms or 0)
+ self.warmup_admission_retries += 1
+ await asyncio.sleep(delay / 1000)
async def snapshot(self, requirement: DataRequirement) -> SnapshotResponse:
payload = await self.query_transport.snapshot(
@@ -483,69 +561,111 @@ async def feed_status(self, requirement: DataRequirement) -> FeedStatusResponse:
return _validate_feed_status_payload(requirement, payload)
async def warmup(self, requirement: DataRequirement) -> WarmupResponse:
- payload = await self.query_transport.warmup(
- requirement, consumer_id=self.consumer_id
+ spec = requirement.warmup_specification
+ payload = await self._cold_read(
+ lambda: self.query_transport.warmup(requirement, consumer_id=self.consumer_id),
+ enabled=requirement.feed is Feed.BAR and spec is not None
+ and (spec.rows is None or spec.rows > 2),
)
response = _validate_query_payload(requirement, payload, warmup=True)
assert isinstance(response, WarmupResponse)
self._record_query("/v2/market-data/warmup", response)
return response
- async def warmup_batch(
+ async def iter_warmup_batches(
self,
requirements: tuple[DataRequirement, ...] | list[DataRequirement],
*,
require_all: bool = True,
- ) -> BatchResponse:
+ batch_size: int = 100,
+ max_batch_rows: int = 2_500,
+ ) -> AsyncIterator[BatchResponse]:
+ """Yield validated bounded chunks without retaining the whole universe.
+
+ Successful chunks may precede a later failure. ``require_all`` does
+ not create an atomic snapshot across HTTP requests. No prefetch tasks
+ survive cancellation or a caller stopping iteration.
+ """
values = tuple(requirements)
if not 1 <= len(values) <= 10_000:
raise ValueError("warmup batch requires between 1 and 10000 items")
- identities = {
- (item.instrument_uid, item.feed.value, item.interval)
- for item in values
- }
+ if type(batch_size) is not int or not 1 <= batch_size <= 100:
+ raise ValueError("batch_size must be between 1 and 100")
+ if type(max_batch_rows) is not int or not 1 <= max_batch_rows <= 100_000:
+ raise ValueError("max_batch_rows must be between 1 and 100000")
+ if not all(isinstance(item, DataRequirement) for item in values):
+ raise TypeError("warmup batch requires typed DataRequirement items")
+ identities = {(item.instrument_uid, item.feed.value, item.interval) for item in values}
if len(identities) != len(values):
raise ValueError("warmup batch contains duplicate requirements")
- if not require_all and any(
- item.consumer_grade is Grade.EXECUTION for item in values
- ):
+ if not require_all and any(item.consumer_grade is Grade.EXECUTION for item in values):
raise ValueError("execution-grade warmup batch must require all items")
- responses = []
- for offset in range(0, len(values), 100):
- chunk = values[offset:offset + 100]
- payload = await self.query_transport.warmup_batch(
- chunk,
- consumer_id=self.consumer_id,
- require_all=require_all,
- )
- responses.append(self._validate_batch_chunk(chunk, payload))
- response = BatchResponse.model_validate({
- "schema": "qdl.marketdata.batch.v2",
- "request_id": responses[0].request_id,
- "partial": any(item.partial for item in responses),
- "success_count": sum(item.success_count for item in responses),
- "error_count": sum(item.error_count for item in responses),
- "results": [
- result.model_dump(mode="json", by_alias=True)
- for item in responses
- for result in item.results
- ],
- })
- if len(response.results) != len(values):
- raise ContinuityError(
- "PARTIAL_RESULT", "batch response cardinality differs from request"
- )
- if require_all and response.partial:
- raise DataLayerError(
- "PARTIAL_RESULT",
- "required warmup batch contains one or more explicit failures",
- retryable=any(
- item.problem is not None and item.problem.retryable
- for item in response.results
- ),
+ # Row caps avoid a 100 x 10000 BAR request; a single long-history
+ # requirement is not truncated to fit the aggregate batching budget.
+ offset = 0
+ while offset < len(values):
+ end, rows = offset, 0
+ while end < len(values) and end - offset < batch_size:
+ spec = values[end].warmup_specification
+ estimate = spec.rows if spec is not None and spec.rows is not None else 10_000
+ if end > offset and rows + estimate > max_batch_rows:
+ break
+ rows += estimate
+ end += 1
+ chunk = values[offset:end]
+ async def fetch_chunk():
+ payload = await self.query_transport.warmup_batch(
+ chunk, consumer_id=self.consumer_id, require_all=require_all,
+ )
+ return self._validate_batch_chunk(chunk, payload)
+
+ def retry_batch(checked):
+ if checked.results and all(item.problem is not None
+ and item.problem.code == "RATE_LIMITED" and item.problem.retryable
+ for item in checked.results):
+ return DataLayerError("RATE_LIMITED", "cold batch admission refused",
+ retryable=True,
+ retry_after_ms=max((item.problem.retry_after_ms or 0)
+ for item in checked.results))
+ return None
+
+ response = await self._cold_read(
+ fetch_chunk, enabled=all(item.feed is Feed.BAR for item in chunk) and rows > 2,
+ retry_result=retry_batch,
)
- self._record_batch(response)
- return response
+ if require_all and response.partial:
+ raise DataLayerError(
+ "PARTIAL_RESULT",
+ "required warmup batch contains one or more explicit failures",
+ retryable=any(item.problem is not None and item.problem.retryable
+ for item in response.results),
+ )
+ self._record_batch(response)
+ yield response
+ del response
+ offset = end
+
+ async def warmup_batch(
+ self,
+ requirements: tuple[DataRequirement, ...] | list[DataRequirement],
+ *,
+ require_all: bool = True,
+ ) -> BatchResponse:
+ # Aggregate only when explicitly requested; reuse typed rows rather
+ # than serializing and parsing the complete universe a second time.
+ results = []
+ request_id = ""
+ success_count = error_count = 0
+ async for response in self.iter_warmup_batches(requirements, require_all=require_all):
+ if not request_id:
+ request_id = response.request_id
+ results.extend(response.results)
+ success_count += response.success_count
+ error_count += response.error_count
+ return BatchResponse(
+ request_id=request_id, partial=error_count > 0,
+ success_count=success_count, error_count=error_count, results=results,
+ )
async def reference_batch(
self,
@@ -677,15 +797,22 @@ def _validate_batch_chunk(
raise ContinuityError(
"PARTIAL_RESULT", "batch response cardinality differs from request"
)
+ actual_success = sum(item.status == "OK" for item in response.results)
+ if actual_success != response.success_count:
+ raise ContinuityError("PARTIAL_RESULT", "batch status counts disagree with results")
for requirement, item in zip(values, response.results, strict=True):
if item.instrument_uid != requirement.instrument_uid:
raise ContinuityError(
"CONFLICT", "batch response order or instrument identity changed"
)
+ if (item.status == "OK") != (item.data is not None) or (
+ (item.data is not None) == (item.problem is not None)
+ ):
+ raise ContinuityError("PARTIAL_RESULT", "batch item data/problem contradicts status")
if item.data is not None:
_validate_query_payload(
requirement,
- item.data.model_dump(mode="json", by_alias=True),
+ item.data,
warmup=True,
)
elif item.problem is None:
@@ -792,10 +919,23 @@ async def warmup_then_stream(
requirement: DataRequirement,
*,
resume_restored_state: bool = False,
+ initial_warmup: WarmupResponse | None = None,
):
+ """Open a stream, optionally reusing a validated batch item unchanged.
+
+ The gateway still verifies the signed requirement/generation binding;
+ an expired cursor follows the existing bounded resnapshot path.
+ """
cursor_key = self._cursor_key(requirement)
- checkpoint = self.cursor_store.load(cursor_key)
- if requirement.warmup_specification is not None:
+ checkpoint = await _load_cursor(self.cursor_store, cursor_key)
+ if initial_warmup is not None:
+ if requirement.feed is not Feed.BAR:
+ raise ValueError("initial_warmup reuse is for BAR history, not a fresh execution price")
+ if not isinstance(initial_warmup, WarmupResponse):
+ raise TypeError("initial_warmup must be a typed WarmupResponse")
+ warmup = _validate_query_payload(requirement, initial_warmup, warmup=True)
+ assert isinstance(warmup, WarmupResponse)
+ elif requirement.warmup_specification is not None:
raw_warmup = await self.query_transport.warmup(
requirement, consumer_id=self.consumer_id
)
@@ -868,6 +1008,9 @@ async def warmup_then_stream(
await session.aclose()
async def close(self) -> None:
+ close_store = getattr(self.cursor_store, "aclose", None)
+ if close_store is not None:
+ await close_store()
await self.stream_transport.close()
await self.query_transport.close()
diff --git a/qdl_sdk/cursor.py b/qdl_sdk/cursor.py
index 1bdb39b5..726d0651 100644
--- a/qdl_sdk/cursor.py
+++ b/qdl_sdk/cursor.py
@@ -1,8 +1,12 @@
from __future__ import annotations
+import asyncio
import json
+import logging
import os
import tempfile
+import threading
+import time
from dataclasses import asdict, dataclass
from pathlib import Path
from typing import Protocol
@@ -42,12 +46,53 @@ def replace(self, key: str, checkpoint: CursorCheckpoint) -> None:
self._items[key] = checkpoint
+async def _await_durable(awaitable):
+ """Drain accepted I/O even on repeated cancellation; never orphan a writer."""
+ task = asyncio.ensure_future(awaitable)
+ cancelled = False
+ while True:
+ try:
+ result = await asyncio.shield(task)
+ break
+ except asyncio.CancelledError:
+ if task.cancelled():
+ raise
+ cancelled = True
+ except BaseException as error:
+ if cancelled:
+ raise asyncio.CancelledError() from error
+ raise
+ if cancelled:
+ raise asyncio.CancelledError()
+ return result
+
+
+@dataclass
+class _CursorWrite:
+ key: str
+ checkpoint: CursorCheckpoint
+ replace: bool
+ done: asyncio.Future
+
+
class FileCursorStore:
"""Atomic single-process cursor store for research/paper consumers."""
- def __init__(self, path: str | Path) -> None:
+ def __init__(self, path: str | Path, *, max_pending: int = 64) -> None:
+ if not 1 <= max_pending <= 1024:
+ raise ValueError("cursor max_pending must be between 1 and 1024")
self.path = Path(path).resolve()
self.path.parent.mkdir(parents=True, exist_ok=True)
+ self._lock = threading.RLock()
+ self._slots = asyncio.Semaphore(max_pending)
+ self._io_lock = asyncio.Lock()
+ self._queue: asyncio.Queue[_CursorWrite] = asyncio.Queue(max_pending)
+ self._worker: asyncio.Task | None = None
+ self._closed = False
+ self._last_report = time.monotonic()
+ self.metrics = {"pending": 0, "pending_peak": 0, "commits": 0,
+ "acknowledged": 0, "errors": 0, "io_seconds": 0.0,
+ "max_io_seconds": 0.0}
def _read(self) -> dict[str, dict[str, str | int]]:
if not self.path.exists():
@@ -58,22 +103,139 @@ def _read(self) -> dict[str, dict[str, str | int]]:
return payload["items"]
def load(self, key: str) -> CursorCheckpoint | None:
- value = self._read().get(key)
- return CursorCheckpoint(**value) if value else None
+ with self._lock:
+ value = self._read().get(key)
+ return CursorCheckpoint(**value) if value else None
def save(self, key: str, checkpoint: CursorCheckpoint) -> None:
- items = self._read()
- current = items.get(key)
- if current is not None and checkpoint.offset < int(current["offset"]):
- raise ValueError("cursor checkpoint cannot move backwards")
- items[key] = asdict(checkpoint)
- self._write(items)
+ with self._lock:
+ if self._closed:
+ raise RuntimeError("cursor store is closed")
+ items = self._read()
+ current = items.get(key)
+ if current is not None and checkpoint.offset < int(current["offset"]):
+ raise ValueError("cursor checkpoint cannot move backwards")
+ items[key] = asdict(checkpoint)
+ self._write(items)
def replace(self, key: str, checkpoint: CursorCheckpoint) -> None:
"""Atomically establish a fresh snapshot as the new offset baseline."""
- items = self._read()
- items[key] = asdict(checkpoint)
- self._write(items)
+ with self._lock:
+ if self._closed:
+ raise RuntimeError("cursor store is closed")
+ items = self._read()
+ items[key] = asdict(checkpoint)
+ self._write(items)
+
+ async def aload(self, key: str) -> CursorCheckpoint | None:
+ async with self._slots:
+ if self._closed:
+ raise RuntimeError("cursor store is closed")
+ async with self._io_lock:
+ return await _await_durable(
+ asyncio.get_running_loop().run_in_executor(None, self.load, key)
+ )
+
+ async def asave(self, key: str, checkpoint: CursorCheckpoint) -> None:
+ await self._submit(key, checkpoint, replace=False)
+
+ async def areplace(self, key: str, checkpoint: CursorCheckpoint) -> None:
+ await self._submit(key, checkpoint, replace=True)
+
+ async def _submit(self, key: str, checkpoint: CursorCheckpoint, *, replace: bool) -> None:
+ await self._slots.acquire()
+ if self._closed:
+ self._slots.release()
+ raise RuntimeError("cursor store is closed")
+ done = asyncio.get_running_loop().create_future()
+ self._queue.put_nowait(_CursorWrite(key, checkpoint, replace, done))
+ self.metrics["pending"] += 1
+ self.metrics["pending_peak"] = max(self.metrics["pending_peak"], self.metrics["pending"])
+ if self._worker is None:
+ self._worker = asyncio.create_task(self._drain(), name="qdl-cursor-writer")
+ await _await_durable(done)
+
+ def _commit_batch(self, batch: list[_CursorWrite]) -> list[Exception | None]:
+ with self._lock:
+ items = self._read()
+ errors: list[Exception | None] = []
+ accepted = False
+ for request in batch:
+ previous = items.get(request.key)
+ value = asdict(request.checkpoint)
+ if (not request.replace and previous is not None
+ and request.checkpoint.offset < int(previous["offset"])):
+ errors.append(ValueError("cursor checkpoint cannot move backwards"))
+ continue
+ errors.append(None)
+ accepted = True
+ items[request.key] = value
+ # Equal retries still need fsync: a prior directory fsync may have failed.
+ if accepted:
+ self._write(items)
+ return errors
+
+ async def _drain(self) -> None:
+ try:
+ while not self._queue.empty():
+ batch = []
+ while not self._queue.empty():
+ batch.append(self._queue.get_nowait())
+ started = time.monotonic()
+ try:
+ # The private worker must deliver results even when loop shutdown
+ # cancels every Task. Executor Futures are not cancelled by that sweep.
+ while True:
+ try:
+ await self._io_lock.acquire()
+ break
+ except asyncio.CancelledError:
+ continue
+ try:
+ operation = asyncio.get_running_loop().run_in_executor(
+ None, self._commit_batch, batch
+ )
+ while True:
+ try:
+ errors = await asyncio.shield(operation)
+ break
+ except asyncio.CancelledError:
+ if operation.cancelled():
+ raise RuntimeError("cursor executor cancelled before durable completion")
+ finally:
+ self._io_lock.release()
+ except Exception as error:
+ errors = [error] * len(batch)
+ elapsed = time.monotonic() - started
+ self.metrics["commits"] += 1
+ self.metrics["io_seconds"] += elapsed
+ self.metrics["max_io_seconds"] = max(self.metrics["max_io_seconds"], elapsed)
+ for request, error in zip(batch, errors):
+ if error is None:
+ self.metrics["acknowledged"] += 1
+ request.done.set_result(None)
+ else:
+ self.metrics["errors"] += 1
+ request.done.set_exception(error)
+ self.metrics["pending"] -= 1
+ self._slots.release()
+ if time.monotonic() - self._last_report >= 30:
+ logging.getLogger(__name__).info("qdl_cursor_persistence %s", json.dumps(self.metrics))
+ self._last_report = time.monotonic()
+ finally:
+ self._worker = None
+
+ async def aclose(self) -> None:
+ self._closed = True
+ await _await_durable(self._finish_close())
+
+ async def _finish_close(self) -> None:
+ worker = self._worker
+ if worker is not None:
+ await _await_durable(worker)
+ # Drain an admitted read as well; no new operation can pass _closed.
+ async with self._io_lock:
+ pass
def _write(self, items: dict[str, dict[str, str | int]]) -> None:
payload = json.dumps(
diff --git a/qdl_sdk/errors.py b/qdl_sdk/errors.py
index e0303acb..cbbda888 100644
--- a/qdl_sdk/errors.py
+++ b/qdl_sdk/errors.py
@@ -9,12 +9,15 @@ def __init__(
*,
retryable: bool = False,
retry_after_ms: int | None = None,
+ diagnostics: dict | None = None,
) -> None:
super().__init__(detail)
self.code = code
self.detail = detail
self.retryable = retryable
self.retry_after_ms = retry_after_ms
+ # Query's quality at the refusal, when the server sent it.
+ self.diagnostics = diagnostics
class ContinuityError(DataLayerError):
diff --git a/qdl_sdk/models.py b/qdl_sdk/models.py
index 103a0991..17b8c5aa 100644
--- a/qdl_sdk/models.py
+++ b/qdl_sdk/models.py
@@ -12,7 +12,7 @@ class StrEnum(str, Enum):
def __str__(self) -> str:
return self.value
-from pydantic import BaseModel, ConfigDict, Field, model_validator
+from pydantic import BaseModel, ConfigDict, Field, model_serializer, model_validator
from qdl.query.v2 import query_pb2
@@ -147,6 +147,27 @@ def exactly_one_horizon(self):
return self
+class ProblemDiagnostics(ClosedModel):
+ """Quality as Query evaluated it for the refused request (KN-4 review):
+ the same non-secret metadata a served item carries, taken at the refusal,
+ so a failure is never diagnosed from a status read seconds later."""
+
+ evaluated_at_ns: int = Field(ge=0)
+ state: str = Field(max_length=64)
+ freshness_ms: int = Field(ge=0)
+ event_recency_state: str = Field(max_length=64)
+ provider_session_state: str = Field(max_length=64)
+ provider_session_liveness_ms: int | None = Field(default=None, ge=0)
+ execution_eligible: bool
+ gap_open: bool
+ complete: bool
+ reason_codes: list[str] = Field(default_factory=list, max_length=32)
+ source_id: str | None = None
+ watermark_offset: int | None = Field(default=None, ge=0)
+ observed_at_ns: int | None = Field(default=None, ge=0)
+ received_at_ns: int | None = Field(default=None, ge=0)
+
+
class ProblemDetails(ClosedModel):
type: str
title: str
@@ -158,6 +179,15 @@ class ProblemDetails(ClosedModel):
retry_after_ms: int | None = None
instrument_uid: str | None = None
quality_state: str | None = None
+ diagnostics: ProblemDiagnostics | None = None
+
+ @model_serializer(mode="wrap")
+ def serialize_problem(self, handler):
+ result = handler(self)
+ # Strict older SDKs accept the original problem schema, not a new null key.
+ if self.diagnostics is None:
+ result.pop("diagnostics", None)
+ return result
class DecimalValue(ClosedModel):
@@ -650,9 +680,32 @@ class GapView(ClosedModel):
detected_at_ns: int
+class GapProductCoverage(ClosedModel):
+ binding_id: str
+ instrument_uid: str
+ feed: Feed
+ interval: str | None
+ state: Literal["SCANNED", "EXCLUDED", "UNAVAILABLE"]
+ retained_rows: int | None
+ first_open_ns: int | None
+ last_open_ns: int | None
+ reason: str | None = None
+
+
+class GapScanCoverage(ClosedModel):
+ scope: Literal["RETAINED_WINDOW"]
+ scan_complete: bool
+ materialization_complete: bool
+ history_complete: None = None
+ leading_coverage: Literal["NOT_ASSESSED"]
+ trailing_coverage: Literal["NOT_ASSESSED"]
+ products: list[GapProductCoverage]
+
+
class GapListResponse(ClosedModel):
contract_schema: str = Field("qdl.data-quality.gaps.v2", alias="schema")
items: list[GapView]
+ coverage: GapScanCoverage | None = None
class SystemReadinessSummary(ClosedModel):
@@ -879,8 +932,10 @@ class StreamEvent:
event: Any
def __post_init__(self) -> None:
- if self.logical_offset <= 0 or not self.resume_token:
- raise ValueError("stream event requires positive offset and signed resume token")
+ # Kafka offset 0 is a valid canonical record (cursor v3 contract,
+ # KN-4 D33); continuity is the session's strictly-increasing check.
+ if self.logical_offset < 0 or not self.resume_token:
+ raise ValueError("stream event requires a non-negative offset and signed resume token")
@dataclass(frozen=True)
diff --git a/qdl_sdk/transport.py b/qdl_sdk/transport.py
index 09d8b1f9..eefda9e2 100644
--- a/qdl_sdk/transport.py
+++ b/qdl_sdk/transport.py
@@ -1,7 +1,9 @@
from __future__ import annotations
+import asyncio
import ipaddress
import time
+from dataclasses import dataclass
from collections.abc import AsyncIterator, Sequence
from urllib.parse import urlsplit
@@ -226,9 +228,173 @@ def _decode(response: httpx.Response) -> dict:
str(payload.get("detail", response.text)),
retryable=bool(payload.get("retryable", False)),
retry_after_ms=payload.get("retry_after_ms"),
+ diagnostics=(
+ payload.get("diagnostics")
+ if isinstance(payload.get("diagnostics"), dict)
+ else None
+ ),
)
+@dataclass(slots=True)
+class _ReplicaReadHealth:
+ failures: int = 0
+ successes: int = 0
+ unavailable_until: float = 0.0
+
+
+class ReplicatedRestQueryTransport:
+ """Bounded, health-aware distribution over existing V2 Query replicas.
+
+ It retries only a transport failure which occurred before a typed V2
+ response exists. A data-quality, entitlement or schema error remains the
+ selected replica's authoritative result; trying another reader to find a
+ green answer would weaken the public contract.
+ """
+
+ def __init__(
+ self,
+ replicas: Sequence[RestQueryTransport],
+ *,
+ max_attempts: int = 2,
+ cooldown_seconds: float = 1.0,
+ ) -> None:
+ values = tuple(replicas)
+ if len(values) < 2:
+ raise ValueError("replicated Query transport requires at least two replicas")
+ urls = tuple(getattr(replica, "base_url", "") for replica in values)
+ if not all(urls) or len(set(urls)) != len(urls):
+ raise ValueError("replicated Query transport replicas must have unique base URLs")
+ if not 1 <= max_attempts <= len(values):
+ raise ValueError("replicated Query max_attempts is outside replica bounds")
+ if cooldown_seconds <= 0:
+ raise ValueError("replicated Query cooldown must be positive")
+ self.replicas = values
+ self._health = [_ReplicaReadHealth() for _ in values]
+ self._max_attempts = max_attempts
+ self._cooldown_seconds = cooldown_seconds
+ self._next = 0
+
+ async def warmup(self, requirement: DataRequirement, *, consumer_id: str) -> dict:
+ return await self._read("warmup", requirement, consumer_id=consumer_id)
+
+ async def warmup_batch(
+ self,
+ requirements: Sequence[DataRequirement],
+ *,
+ consumer_id: str,
+ require_all: bool,
+ ) -> dict:
+ return await self._read(
+ "warmup_batch",
+ requirements,
+ consumer_id=consumer_id,
+ require_all=require_all,
+ )
+
+ async def reference_batch(
+ self,
+ requirements: Sequence[ReferenceRequirement],
+ *,
+ consumer_id: str,
+ require_all: bool,
+ ) -> dict:
+ return await self._read(
+ "reference_batch",
+ requirements,
+ consumer_id=consumer_id,
+ require_all=require_all,
+ )
+
+ async def snapshot(self, requirement: DataRequirement, *, consumer_id: str) -> dict:
+ return await self._read("snapshot", requirement, consumer_id=consumer_id)
+
+ async def feed_status(
+ self, requirement: DataRequirement, *, consumer_id: str
+ ) -> dict:
+ return await self._read("feed_status", requirement, consumer_id=consumer_id)
+
+ async def instruments(
+ self,
+ *,
+ consumer_id: str,
+ consumer_grade: Grade,
+ cursor: str | None = None,
+ limit: int = 500,
+ ) -> dict:
+ return await self._read(
+ "instruments",
+ consumer_id=consumer_id,
+ consumer_grade=consumer_grade,
+ cursor=cursor,
+ limit=limit,
+ )
+
+ async def instrument(
+ self,
+ identity: str,
+ *,
+ consumer_id: str,
+ consumer_grade: Grade,
+ ) -> dict:
+ return await self._read(
+ "instrument",
+ identity,
+ consumer_id=consumer_id,
+ consumer_grade=consumer_grade,
+ )
+
+ async def close(self) -> None:
+ await asyncio.gather(*(replica.close() for replica in self.replicas))
+
+ def stats(self) -> tuple[dict[str, int | str], ...]:
+ now = time.monotonic()
+ return tuple(
+ {
+ "base_url": replica.base_url,
+ "successes": health.successes,
+ "failures": health.failures,
+ "cooling": int(health.unavailable_until > now),
+ }
+ for replica, health in zip(self.replicas, self._health, strict=True)
+ )
+
+ async def _read(self, method: str, *args, **kwargs) -> dict:
+ selected = self._candidate_indexes()
+ last_error: httpx.TransportError | None = None
+ for index in selected:
+ replica = self.replicas[index]
+ try:
+ result = await getattr(replica, method)(*args, **kwargs)
+ except httpx.TransportError as error:
+ last_error = error
+ health = self._health[index]
+ health.failures += 1
+ health.unavailable_until = time.monotonic() + self._cooldown_seconds
+ continue
+ self._health[index].successes += 1
+ self._health[index].unavailable_until = 0.0
+ return result
+ assert last_error is not None
+ raise last_error
+
+ def _candidate_indexes(self) -> tuple[int, ...]:
+ count = len(self.replicas)
+ ordered = tuple((self._next + offset) % count for offset in range(count))
+ self._next = (self._next + 1) % count
+ now = time.monotonic()
+ available = tuple(
+ index
+ for index in ordered
+ if self._health[index].unavailable_until <= now
+ )
+ # A total reader outage still performs one bounded transport attempt so
+ # the caller gets the current network error rather than a synthetic
+ # local cooldown error. It never fans out beyond max_attempts.
+ selected = available or ordered
+ return selected[: self._max_attempts]
+
+
class GrpcStreamTransport:
def __init__(
self,
diff --git a/rust/qdl-contracts/Cargo.toml b/rust/qdl-contracts/Cargo.toml
index 1c164927..9a4ef25d 100644
--- a/rust/qdl-contracts/Cargo.toml
+++ b/rust/qdl-contracts/Cargo.toml
@@ -6,5 +6,8 @@ license.workspace = true
rust-version.workspace = true
[dependencies]
+base64.workspace = true
prost.workspace = true
+ring.workspace = true
+serde_json.workspace = true
diff --git a/rust/qdl-contracts/src/cursor_v3.rs b/rust/qdl-contracts/src/cursor_v3.rs
new file mode 100644
index 00000000..4a94c899
--- /dev/null
+++ b/rust/qdl-contracts/src/cursor_v3.rs
@@ -0,0 +1,709 @@
+//! Signed handoff cursor v3 (KN-1 K1.3), the native side of
+//! `qdl/replay/cursor_v3.py`.
+//!
+//! Query (Python) issues the token with a snapshot; the native Stream verifies
+//! it and signs one per delivered record, so both implementations must agree
+//! on every byte and on every rejection reason. The rules are deliberately
+//! small: a canonical JSON object with byte-sorted keys, no whitespace,
+//! strings from a charset that never needs escaping, unsigned decimal
+//! integers below 2^63, base64url without padding, HMAC-SHA256 over the
+//! received body bytes. `contracts/golden/kn_v220/cursor_v3.json` is the
+//! shared oracle.
+
+use base64::engine::general_purpose::URL_SAFE_NO_PAD;
+use base64::Engine;
+use ring::{digest, hmac};
+use serde_json::{Map, Value};
+use std::collections::BTreeMap;
+use std::fmt::Write as _;
+
+use crate::qdl::query::v2 as query;
+use crate::requirement::ValidatedRequirement;
+
+pub const SCHEMA_V3: &str = "qdl.handoff-cursor.v3";
+pub const LEGACY_SCHEMAS: [&str; 2] = ["qdl.handoff-cursor.v1", "qdl.handoff-cursor.v2"];
+pub const REQUIREMENT_DIGEST_SCHEMA: &str = "qdl.requirement-digest.v1";
+pub const MAX_INTEGER: u64 = i64::MAX as u64;
+const MAX_TOKEN_BYTES: usize = 4096;
+
+/// Why a token was refused. `Expired` maps to gRPC OUT_OF_RANGE, which the
+/// SDK answers with a fresh snapshot; `Invalid` maps to INVALID_ARGUMENT,
+/// which the SDK does not recover from.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum CursorError {
+ Invalid(&'static str),
+ Expired(&'static str),
+}
+
+impl CursorError {
+ pub fn reason(&self) -> &'static str {
+ match self {
+ CursorError::Invalid(reason) | CursorError::Expired(reason) => reason,
+ }
+ }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct CursorV3Claims {
+ pub key_id: String,
+ pub environment: String,
+ pub consumer_id: String,
+ pub requirement_digest: String,
+ pub schema_major: u64,
+ pub stream: String,
+ pub product_key: String,
+ pub snapshot_id: String,
+ pub source_topic_id: String,
+ pub source_partition: u64,
+ pub source_offset: u64,
+ pub partition_plan_epoch: u64,
+ pub source_policy_revision: u64,
+ pub catalog_revision: u64,
+ pub route_generation: String,
+ pub issued_at_ns: u64,
+ pub expires_at_ns: u64,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct CursorV3Expectation {
+ pub environment: String,
+ pub stream: String,
+ pub source_topic_id: String,
+ pub partition_plan_epoch: u64,
+ pub source_policy_revision: u64,
+ pub catalog_revision: u64,
+ pub route_generation: String,
+ pub schema_major: u64,
+}
+
+enum Field {
+ Text(String),
+ Integer(u64),
+}
+
+/// Field order is the Python dataclass order: validation reports the first
+/// failing field in this order on both sides.
+const FIELDS: [(&str, bool); 17] = [
+ ("key_id", false),
+ ("environment", false),
+ ("consumer_id", false),
+ ("requirement_digest", false),
+ ("schema_major", true),
+ ("stream", false),
+ ("product_key", false),
+ ("snapshot_id", false),
+ ("source_topic_id", false),
+ ("source_partition", true),
+ ("source_offset", true),
+ ("partition_plan_epoch", true),
+ ("source_policy_revision", true),
+ ("catalog_revision", true),
+ ("route_generation", false),
+ ("issued_at_ns", true),
+ ("expires_at_ns", true),
+];
+
+pub fn is_token_text(value: &str) -> bool {
+ (1..=256).contains(&value.len())
+ && value.bytes().all(|byte| {
+ byte.is_ascii_alphanumeric()
+ || matches!(
+ byte,
+ b'.' | b'_' | b':' | b'/' | b'@' | b'|' | b'+' | b'=' | b'-'
+ )
+ })
+}
+
+fn is_hex64(value: &str) -> bool {
+ value.len() == 64
+ && value
+ .bytes()
+ .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))
+}
+
+impl CursorV3Claims {
+ fn fields(&self) -> BTreeMap<&'static str, Field> {
+ let text = |value: &String| Field::Text(value.clone());
+ BTreeMap::from([
+ ("key_id", text(&self.key_id)),
+ ("environment", text(&self.environment)),
+ ("consumer_id", text(&self.consumer_id)),
+ ("requirement_digest", text(&self.requirement_digest)),
+ ("schema_major", Field::Integer(self.schema_major)),
+ ("stream", text(&self.stream)),
+ ("product_key", text(&self.product_key)),
+ ("snapshot_id", text(&self.snapshot_id)),
+ ("source_topic_id", text(&self.source_topic_id)),
+ ("source_partition", Field::Integer(self.source_partition)),
+ ("source_offset", Field::Integer(self.source_offset)),
+ (
+ "partition_plan_epoch",
+ Field::Integer(self.partition_plan_epoch),
+ ),
+ (
+ "source_policy_revision",
+ Field::Integer(self.source_policy_revision),
+ ),
+ ("catalog_revision", Field::Integer(self.catalog_revision)),
+ ("route_generation", text(&self.route_generation)),
+ ("issued_at_ns", Field::Integer(self.issued_at_ns)),
+ ("expires_at_ns", Field::Integer(self.expires_at_ns)),
+ ("schema", Field::Text(SCHEMA_V3.to_owned())),
+ ])
+ }
+
+ pub fn validate(&self) -> Result<(), CursorError> {
+ let fields = self.fields();
+ for (name, integer) in FIELDS {
+ match (&fields[name], integer) {
+ (Field::Integer(value), true) if *value <= MAX_INTEGER => {}
+ (Field::Text(value), false) if is_token_text(value) => {}
+ (_, true) => return Err(CursorError::Invalid("FIELD_RANGE")),
+ (_, false) => return Err(CursorError::Invalid("FIELD_CHARSET")),
+ }
+ }
+ if !is_hex64(&self.requirement_digest) {
+ return Err(CursorError::Invalid("FIELD_CHARSET"));
+ }
+ if self.expires_at_ns <= self.issued_at_ns {
+ return Err(CursorError::Invalid("FIELD_RANGE"));
+ }
+ Ok(())
+ }
+
+ /// Canonical body bytes. `BTreeMap<&str, _>` orders keys by byte value,
+ /// which is the Python `sorted(key=str.encode)` order.
+ pub fn body(&self) -> Result, CursorError> {
+ self.validate()?;
+ let mut body = String::from("{");
+ for (index, (name, field)) in self.fields().into_iter().enumerate() {
+ if index > 0 {
+ body.push(',');
+ }
+ body.push('"');
+ body.push_str(name);
+ body.push_str("\":");
+ match field {
+ Field::Integer(value) => body.push_str(&value.to_string()),
+ Field::Text(value) => {
+ body.push('"');
+ body.push_str(&value);
+ body.push('"');
+ }
+ }
+ }
+ body.push('}');
+ Ok(body.into_bytes())
+ }
+}
+
+fn decode_part(value: &str) -> Result, CursorError> {
+ // The default engine rejects padding and non-canonical trailing bits,
+ // which is the rule the Python codec enforces by re-encoding.
+ if value.is_empty()
+ || !value
+ .bytes()
+ .all(|byte| byte.is_ascii_alphanumeric() || byte == b'-' || byte == b'_')
+ {
+ return Err(CursorError::Invalid("ENCODING"));
+ }
+ URL_SAFE_NO_PAD
+ .decode(value)
+ .map_err(|_| CursorError::Invalid("ENCODING"))
+}
+
+fn claims_from_object(raw: &Map) -> Result {
+ for (name, integer) in FIELDS {
+ let value = &raw[name];
+ if integer {
+ match value.as_u64() {
+ Some(number) if number <= MAX_INTEGER => {}
+ _ => return Err(CursorError::Invalid("FIELD_RANGE")),
+ }
+ } else {
+ match value.as_str() {
+ Some(text) if is_token_text(text) => {}
+ _ => return Err(CursorError::Invalid("FIELD_CHARSET")),
+ }
+ }
+ }
+ let text = |name: &str| raw[name].as_str().unwrap_or_default().to_owned();
+ let integer = |name: &str| raw[name].as_u64().unwrap_or_default();
+ let claims = CursorV3Claims {
+ key_id: text("key_id"),
+ environment: text("environment"),
+ consumer_id: text("consumer_id"),
+ requirement_digest: text("requirement_digest"),
+ schema_major: integer("schema_major"),
+ stream: text("stream"),
+ product_key: text("product_key"),
+ snapshot_id: text("snapshot_id"),
+ source_topic_id: text("source_topic_id"),
+ source_partition: integer("source_partition"),
+ source_offset: integer("source_offset"),
+ partition_plan_epoch: integer("partition_plan_epoch"),
+ source_policy_revision: integer("source_policy_revision"),
+ catalog_revision: integer("catalog_revision"),
+ route_generation: text("route_generation"),
+ issued_at_ns: integer("issued_at_ns"),
+ expires_at_ns: integer("expires_at_ns"),
+ };
+ claims.validate()?;
+ Ok(claims)
+}
+
+pub struct CursorV3Codec {
+ keys: BTreeMap,
+ active_key_id: String,
+}
+
+impl CursorV3Codec {
+ pub fn new(keys: &BTreeMap>, active_key_id: &str) -> Result {
+ if !keys.contains_key(active_key_id) {
+ return Err("active cursor-signing key is unavailable".into());
+ }
+ let mut prepared = BTreeMap::new();
+ for (key_id, secret) in keys {
+ if secret.len() < 32 {
+ return Err("cursor-signing secrets must contain at least 256 bits".into());
+ }
+ if !is_token_text(key_id) {
+ return Err("cursor key id has characters outside the token charset".into());
+ }
+ prepared.insert(key_id.clone(), hmac::Key::new(hmac::HMAC_SHA256, secret));
+ }
+ Ok(Self {
+ keys: prepared,
+ active_key_id: active_key_id.to_owned(),
+ })
+ }
+
+ pub fn active_key_id(&self) -> &str {
+ &self.active_key_id
+ }
+
+ pub fn encode(&self, claims: &CursorV3Claims) -> Result {
+ if claims.key_id != self.active_key_id {
+ return Err(CursorError::Invalid("INACTIVE_KEY"));
+ }
+ let body = claims.body()?;
+ let signature = hmac::sign(&self.keys[&claims.key_id], &body);
+ Ok(format!(
+ "{}.{}",
+ URL_SAFE_NO_PAD.encode(&body),
+ URL_SAFE_NO_PAD.encode(signature.as_ref())
+ ))
+ }
+
+ /// Verify in the exact order of the Python codec so both report the same
+ /// reason for the same token.
+ pub fn verify(
+ &self,
+ token: &str,
+ consumer_id: &str,
+ environment: &str,
+ requirement_digest: &str,
+ expected: &CursorV3Expectation,
+ now_ns: u64,
+ ) -> Result {
+ self.verify_inner(
+ token,
+ consumer_id,
+ environment,
+ Some(requirement_digest),
+ expected,
+ now_ns,
+ )
+ }
+
+ /// `Replay` carries no requirement, so there is no digest to compare; the
+ /// caller must bind the claims' product key to an entitled binding (the
+ /// Python Replay checks feed scope the same way). Every other check, in
+ /// the same order, is identical to [`Self::verify`].
+ pub fn verify_scope(
+ &self,
+ token: &str,
+ consumer_id: &str,
+ environment: &str,
+ expected: &CursorV3Expectation,
+ now_ns: u64,
+ ) -> Result {
+ self.verify_inner(token, consumer_id, environment, None, expected, now_ns)
+ }
+
+ fn verify_inner(
+ &self,
+ token: &str,
+ consumer_id: &str,
+ environment: &str,
+ requirement_digest: Option<&str>,
+ expected: &CursorV3Expectation,
+ now_ns: u64,
+ ) -> Result {
+ if token.len() > MAX_TOKEN_BYTES || token.matches('.').count() != 1 {
+ return Err(CursorError::Invalid("ENCODING"));
+ }
+ let (encoded_body, encoded_signature) = token
+ .split_once('.')
+ .ok_or(CursorError::Invalid("ENCODING"))?;
+ let body = decode_part(encoded_body)?;
+ let signature = decode_part(encoded_signature)?;
+ let raw: Value =
+ serde_json::from_slice(&body).map_err(|_| CursorError::Invalid("ENCODING"))?;
+ let object = raw.as_object().ok_or(CursorError::Invalid("ENCODING"))?;
+ match object.get("schema").and_then(Value::as_str) {
+ Some(schema) if LEGACY_SCHEMAS.contains(&schema) => {
+ return Err(CursorError::Expired("LEGACY_SCHEMA"))
+ }
+ Some(SCHEMA_V3) => {}
+ _ => return Err(CursorError::Invalid("SCHEMA")),
+ }
+ let key = object
+ .get("key_id")
+ .and_then(Value::as_str)
+ .and_then(|key_id| self.keys.get(key_id))
+ .ok_or(CursorError::Invalid("UNKNOWN_KEY"))?;
+ hmac::verify(key, &body, &signature).map_err(|_| CursorError::Invalid("SIGNATURE"))?;
+ if object.len() != FIELDS.len() + 1
+ || !FIELDS.iter().all(|(name, _)| object.contains_key(*name))
+ {
+ return Err(CursorError::Invalid("FIELDS"));
+ }
+ let claims = claims_from_object(object)?;
+ if claims.body()? != body {
+ return Err(CursorError::Invalid("NON_CANONICAL"));
+ }
+ if claims.consumer_id != consumer_id {
+ return Err(CursorError::Invalid("CONSUMER"));
+ }
+ if claims.environment != environment || environment != expected.environment {
+ return Err(CursorError::Invalid("ENVIRONMENT"));
+ }
+ if requirement_digest.is_some_and(|digest| claims.requirement_digest != digest) {
+ return Err(CursorError::Invalid("REQUIREMENT"));
+ }
+ let checks: [(&'static str, bool); 7] = [
+ ("SCHEMA_MAJOR", claims.schema_major == expected.schema_major),
+ ("STREAM", claims.stream == expected.stream),
+ (
+ "TOPIC_GENERATION",
+ claims.source_topic_id == expected.source_topic_id,
+ ),
+ (
+ "PARTITION_PLAN",
+ claims.partition_plan_epoch == expected.partition_plan_epoch,
+ ),
+ (
+ "SOURCE_POLICY",
+ claims.source_policy_revision == expected.source_policy_revision,
+ ),
+ (
+ "CATALOG",
+ claims.catalog_revision == expected.catalog_revision,
+ ),
+ (
+ "ROUTE_GENERATION",
+ claims.route_generation == expected.route_generation,
+ ),
+ ];
+ if let Some((reason, _)) = checks.iter().find(|(_, same)| !same) {
+ return Err(CursorError::Expired(reason));
+ }
+ if now_ns >= claims.expires_at_ns {
+ return Err(CursorError::Expired("EXPIRED"));
+ }
+ Ok(claims)
+ }
+}
+
+/// The normalized delivery requirement both sides digest. The historical
+/// horizon (`warmup_limit`, `warmup`) is deliberately absent.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct DeliveryRequirement {
+ pub instrument_uid: String,
+ pub feed: String,
+ pub interval: Option,
+ pub consumer_grade: String,
+ pub source_policy_id: String,
+ pub max_freshness_ms: Option,
+ pub event_recency_policy: Option,
+ pub max_session_liveness_ms: Option,
+ pub require_full_coverage: bool,
+ pub require_final_bars: bool,
+ pub stale_policy: String,
+ pub gap_policy: String,
+ pub recovery: String,
+ pub bar_revision_policy: String,
+}
+
+impl DeliveryRequirement {
+ /// Same mapping as `qdl.stream.grpc_service.requirement_from_proto`,
+ /// including the full `DataRequirement` validation: a requirement the
+ /// Python server refuses is never digested (KN-1 F1).
+ pub fn from_proto(value: &query::DataRequirement) -> Result {
+ ValidatedRequirement::from_proto(value)
+ .map(|requirement| requirement.delivery)
+ .map_err(|error| error.message)
+ }
+
+ pub fn digest(&self) -> String {
+ let optional = |value: &Option| value.clone().unwrap_or_default();
+ let number = |value: Option| value.map(|v| v.to_string()).unwrap_or_default();
+ let lines = [
+ REQUIREMENT_DIGEST_SCHEMA.to_owned(),
+ format!("instrument_uid={}", self.instrument_uid),
+ format!("feed={}", self.feed),
+ format!("interval={}", optional(&self.interval)),
+ format!("consumer_grade={}", self.consumer_grade),
+ format!("source_policy_id={}", self.source_policy_id),
+ format!("max_freshness_ms={}", number(self.max_freshness_ms)),
+ format!(
+ "event_recency_policy={}",
+ optional(&self.event_recency_policy)
+ ),
+ format!(
+ "max_session_liveness_ms={}",
+ number(self.max_session_liveness_ms)
+ ),
+ format!("require_full_coverage={}", self.require_full_coverage),
+ format!("require_final_bars={}", self.require_final_bars),
+ format!("stale_policy={}", self.stale_policy),
+ format!("gap_policy={}", self.gap_policy),
+ format!("recovery={}", self.recovery),
+ format!("bar_revision_policy={}", self.bar_revision_policy),
+ ];
+ let hashed = digest::digest(&digest::SHA256, lines.join("\n").as_bytes());
+ let mut hex = String::with_capacity(64);
+ for byte in hashed.as_ref() {
+ let _ = write!(hex, "{byte:02x}");
+ }
+ hex
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ fn golden(name: &str) -> Value {
+ let path = format!(
+ "{}/../../contracts/golden/kn_v220/{name}",
+ env!("CARGO_MANIFEST_DIR")
+ );
+ serde_json::from_str(&std::fs::read_to_string(path).expect("golden file")).expect("json")
+ }
+
+ fn codec(doc: &Value) -> CursorV3Codec {
+ let keys = doc["keys"]
+ .as_object()
+ .expect("keys")
+ .iter()
+ .map(|(id, secret)| {
+ (
+ id.clone(),
+ secret.as_str().expect("secret").as_bytes().to_vec(),
+ )
+ })
+ .collect();
+ CursorV3Codec::new(&keys, doc["active_key_id"].as_str().expect("active")).expect("codec")
+ }
+
+ fn claims(value: &Value) -> CursorV3Claims {
+ claims_from_object(value.as_object().expect("claims")).expect("valid claims")
+ }
+
+ fn expectation(value: &Value) -> CursorV3Expectation {
+ let text = |name: &str| value[name].as_str().expect("text").to_owned();
+ let integer = |name: &str| value[name].as_u64().expect("integer");
+ CursorV3Expectation {
+ environment: text("environment"),
+ stream: text("stream"),
+ source_topic_id: text("source_topic_id"),
+ partition_plan_epoch: integer("partition_plan_epoch"),
+ source_policy_revision: integer("source_policy_revision"),
+ catalog_revision: integer("catalog_revision"),
+ route_generation: text("route_generation"),
+ schema_major: integer("schema_major"),
+ }
+ }
+
+ #[test]
+ fn canonical_body_and_token_match_python_bytes() {
+ let doc = golden("cursor_v3.json");
+ let canonical = &doc["canonical"];
+ let claims = claims(&canonical["claims"]);
+ assert_eq!(
+ String::from_utf8(claims.body().expect("body")).expect("utf8"),
+ canonical["body"].as_str().expect("body")
+ );
+ assert_eq!(
+ codec(&doc).encode(&claims).expect("token"),
+ canonical["token"].as_str().expect("token")
+ );
+ assert_eq!(claims.source_offset, 9_223_372_036_854_775_806);
+ }
+
+ #[test]
+ fn every_golden_verification_case_has_the_same_outcome() {
+ let doc = golden("cursor_v3.json");
+ let codec = codec(&doc);
+ let cases = doc["cases"].as_array().expect("cases");
+ assert!(cases.len() >= 25);
+ for case in cases {
+ let name = case["name"].as_str().expect("name");
+ let result = codec.verify(
+ case["token"].as_str().expect("token"),
+ case["consumer_id"].as_str().expect("consumer"),
+ case["environment"].as_str().expect("environment"),
+ case["requirement_digest"].as_str().expect("digest"),
+ &expectation(&case["expectation"]),
+ case["now_ns"].as_u64().expect("now"),
+ );
+ let (outcome, reason) = match &result {
+ Ok(_) => ("OK", None),
+ Err(CursorError::Expired(reason)) => ("EXPIRED", Some(*reason)),
+ Err(CursorError::Invalid(reason)) => ("INVALID", Some(*reason)),
+ };
+ assert_eq!(
+ outcome,
+ case["outcome"].as_str().expect("outcome"),
+ "{name}"
+ );
+ assert_eq!(reason, case["reason"].as_str(), "{name}");
+ }
+ }
+
+ #[test]
+ fn malformed_claims_are_refused_with_the_python_reason() {
+ let doc = golden("cursor_v3.json");
+ let cases = doc["claims_invalid"].as_array().expect("claims_invalid");
+ assert!(cases.len() >= 4);
+ for case in cases {
+ let refused = claims_from_object(case["claims"].as_object().expect("claims"))
+ .expect_err(case["name"].as_str().expect("name"));
+ assert_eq!(
+ Some(refused.reason()),
+ case["reason"].as_str(),
+ "{}",
+ case["name"]
+ );
+ }
+ }
+
+ #[test]
+ fn scope_verification_differs_only_on_the_requirement_digest() {
+ let doc = golden("cursor_v3.json");
+ let codec = codec(&doc);
+ for case in doc["cases"].as_array().expect("cases") {
+ let expected = expectation(&case["expectation"]);
+ let token = case["token"].as_str().expect("token");
+ let consumer = case["consumer_id"].as_str().expect("consumer");
+ let environment = case["environment"].as_str().expect("environment");
+ let now = case["now_ns"].as_u64().expect("now");
+ let full = codec.verify(
+ token,
+ consumer,
+ environment,
+ case["requirement_digest"].as_str().expect("digest"),
+ &expected,
+ now,
+ );
+ let scope = codec.verify_scope(token, consumer, environment, &expected, now);
+ match &full {
+ Err(CursorError::Invalid("REQUIREMENT")) => {
+ // The only difference: no digest to compare. The next
+ // checks still run, so a later reason may surface.
+ assert!(
+ !matches!(scope, Err(CursorError::Invalid("REQUIREMENT"))),
+ "{}",
+ case["name"]
+ );
+ }
+ other => assert_eq!(
+ other.as_ref().map(|claims| claims.source_offset),
+ scope.as_ref().map(|claims| claims.source_offset),
+ "{}",
+ case["name"]
+ ),
+ }
+ }
+ }
+
+ #[test]
+ fn only_the_active_key_signs() {
+ let doc = golden("cursor_v3.json");
+ let mut rotated = claims(&doc["canonical"]["claims"]);
+ rotated.key_id = "kn1-test-k1".into();
+ assert_eq!(
+ codec(&doc).encode(&rotated),
+ Err(CursorError::Invalid("INACTIVE_KEY"))
+ );
+ }
+
+ fn proto_requirement(value: &Value) -> query::DataRequirement {
+ let text = |name: &str| value[name].as_str().unwrap_or_default().to_owned();
+ let named = |name: &str, prefix: &str| format!("{prefix}{}", text(name));
+ query::DataRequirement {
+ instrument_uid: text("instrument_uid"),
+ interval: text("interval"),
+ source_policy_id: text("source_policy_id"),
+ warmup_limit: value["warmup_limit"].as_u64().unwrap_or_default() as u32,
+ max_freshness_ms: value["max_freshness_ms"].as_u64().unwrap_or_default(),
+ max_session_liveness_ms: value["max_session_liveness_ms"]
+ .as_u64()
+ .unwrap_or_default(),
+ require_full_coverage: value["require_full_coverage"].as_bool().expect("coverage"),
+ require_final_bars: value["require_final_bars"].as_bool().expect("final"),
+ feed_type: query::FeedType::from_str_name(&named("feed", "FEED_TYPE_")).expect("feed")
+ as i32,
+ grade: query::ConsumerGrade::from_str_name(&named("consumer_grade", "CONSUMER_GRADE_"))
+ .expect("grade") as i32,
+ stale_policy_type: query::StalePolicy::from_str_name(&named(
+ "stale_policy",
+ "STALE_POLICY_",
+ ))
+ .expect("stale") as i32,
+ gap_policy_type: query::GapPolicy::from_str_name(&named("gap_policy", "GAP_POLICY_"))
+ .expect("gap") as i32,
+ recovery_policy: query::RecoveryPolicy::from_str_name(&named(
+ "recovery",
+ "RECOVERY_POLICY_",
+ ))
+ .expect("recovery") as i32,
+ revision_policy: query::BarRevisionPolicy::from_str_name(&named(
+ "bar_revision_policy",
+ "BAR_REVISION_POLICY_",
+ ))
+ .expect("revision") as i32,
+ event_recency_policy: if value["event_recency_policy"].is_string() {
+ query::StalePolicy::from_str_name(&named("event_recency_policy", "STALE_POLICY_"))
+ .expect("recency") as i32
+ } else {
+ 0
+ },
+ ..Default::default()
+ }
+ }
+
+ #[test]
+ fn requirement_digest_from_the_proto_matches_python() {
+ let doc = golden("requirement_digest.json");
+ for vector in doc["vectors"].as_array().expect("vectors") {
+ let requirement =
+ DeliveryRequirement::from_proto(&proto_requirement(&vector["requirement"]))
+ .expect("requirement");
+ assert_eq!(
+ requirement.digest(),
+ vector["digest"].as_str().expect("digest"),
+ "{}",
+ vector["name"]
+ );
+ }
+ }
+
+ #[test]
+ fn unspecified_enums_are_refused_like_python() {
+ let requirement = query::DataRequirement::default();
+ assert!(DeliveryRequirement::from_proto(&requirement).is_err());
+ }
+}
diff --git a/rust/qdl-contracts/src/delivery.rs b/rust/qdl-contracts/src/delivery.rs
new file mode 100644
index 00000000..82373e39
--- /dev/null
+++ b/rust/qdl-contracts/src/delivery.rs
@@ -0,0 +1,219 @@
+//! Stream delivery policy (KN-2 K2.4, invariant 27), the native side of
+//! `qdl.ingestion.contracts.delivery_policy`.
+//!
+//! A record is either lossless, latest-state, or a lifecycle-coalescible BAR
+//! update. Only a coalescible record may ever be dropped, and only when a
+//! later record with the same lifecycle key and the same lifecycle signature
+//! supersedes it: a quality-state or source-authority transition changes the
+//! signature and is therefore never coalesced away. The old Python stream
+//! coalesced BOOK_SNAPSHOT; invariant 27 makes every book record lossless, so
+//! that is not ported. `contracts/golden/kn_v220/delivery_policy.json`
+//! (produced from the Python domain function) is the shared oracle.
+
+use crate::qdl::marketdata::v2::{event_envelope, BarLifecycle, EventEnvelope};
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum DeliveryPolicy {
+ Lossless,
+ LatestState,
+ LifecycleCoalesce,
+}
+
+impl DeliveryPolicy {
+ pub fn as_str(self) -> &'static str {
+ match self {
+ DeliveryPolicy::Lossless => "LOSSLESS",
+ DeliveryPolicy::LatestState => "LATEST_STATE",
+ DeliveryPolicy::LifecycleCoalesce => "LIFECYCLE_COALESCE",
+ }
+ }
+}
+
+/// Domain policy for a public feed name. `Err` is the domain's refusal of a
+/// BAR without an explicit lifecycle.
+pub fn delivery_policy(
+ feed: &str,
+ bar_lifecycle: Option<&str>,
+) -> Result {
+ match feed {
+ "TRADE" | "BOOK_SNAPSHOT" | "BOOK_DELTA" => Ok(DeliveryPolicy::Lossless),
+ "BAR" => match bar_lifecycle {
+ None | Some("UNSPECIFIED") => Err("bar delivery requires an explicit lifecycle"),
+ Some("IN_PROGRESS") => Ok(DeliveryPolicy::LifecycleCoalesce),
+ Some(_) => Ok(DeliveryPolicy::Lossless),
+ },
+ _ => Ok(DeliveryPolicy::LatestState),
+ }
+}
+
+/// What must stay equal for one record to supersede another: quality state
+/// and source authority/session. A change is a transition and is lossless.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct LifecycleSignature {
+ pub quality_flags: Vec,
+ pub authority_revision: u64,
+ pub source_id: String,
+ pub source_role: i32,
+ pub provider: String,
+ pub source_session_id: String,
+ pub connection_generation: u64,
+ pub lease_epoch: u64,
+}
+
+/// The delivery facts of one canonical record for a subscription.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct RecordLifecycle {
+ pub policy: DeliveryPolicy,
+ /// Records supersede only within one key: the BAR open time, or the
+ /// product itself for latest-state feeds.
+ pub coalesce_key: Option,
+ pub signature: LifecycleSignature,
+}
+
+impl RecordLifecycle {
+ pub fn of(feed: &str, envelope: &EventEnvelope) -> Self {
+ let bar = match &envelope.payload {
+ Some(event_envelope::Payload::Bar(bar)) => Some(bar),
+ _ => None,
+ };
+ let lifecycle = bar.map(|bar| {
+ BarLifecycle::try_from(bar.lifecycle)
+ .map(|value| value.as_str_name().trim_start_matches("BAR_LIFECYCLE_"))
+ .unwrap_or("UNSPECIFIED")
+ });
+ // Fail safe: a record the domain would refuse is never coalesced.
+ let policy = delivery_policy(feed, lifecycle).unwrap_or(DeliveryPolicy::Lossless);
+ let mut quality_flags = envelope.quality_flags.clone();
+ quality_flags.sort_unstable();
+ Self {
+ policy,
+ coalesce_key: bar.map(|bar| bar.open_time_ns),
+ signature: LifecycleSignature {
+ quality_flags,
+ authority_revision: envelope.authority_revision,
+ source_id: envelope.source_id.clone(),
+ source_role: envelope.source_role,
+ provider: envelope.provider.clone(),
+ source_session_id: envelope.source_session_id.clone(),
+ connection_generation: envelope.connection_generation,
+ lease_epoch: envelope.lease_epoch,
+ },
+ }
+ }
+
+ pub fn coalescible(&self) -> bool {
+ self.policy != DeliveryPolicy::Lossless
+ }
+
+ /// Whether `later` may replace `self` without losing a lossless fact:
+ /// both coalescible, same key and the same lifecycle signature.
+ pub fn superseded_by(&self, later: &RecordLifecycle) -> bool {
+ self.coalescible()
+ && self.coalesce_key == later.coalesce_key
+ && self.signature == later.signature
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::qdl::marketdata::v2::{Bar, Quote};
+ use serde_json::Value;
+
+ fn golden() -> Value {
+ serde_json::from_str(include_str!(
+ "../../../contracts/golden/kn_v220/delivery_policy.json"
+ ))
+ .expect("delivery policy golden")
+ }
+
+ #[test]
+ fn every_public_feed_matches_the_domain_policy() {
+ let doc = golden();
+ let cases = doc["cases"].as_array().expect("cases");
+ assert!(cases.len() >= 17);
+ for case in cases {
+ let feed = case["feed"].as_str().expect("feed");
+ let lifecycle = case["bar_lifecycle"].as_str();
+ let expected = case["policy"].as_str().expect("policy");
+ let got = delivery_policy(feed, lifecycle)
+ .map(DeliveryPolicy::as_str)
+ .unwrap_or("ERROR");
+ assert_eq!(got, expected, "{feed} {lifecycle:?}");
+ }
+ }
+
+ fn quote(flags: Vec, authority: u64) -> EventEnvelope {
+ EventEnvelope {
+ quality_flags: flags,
+ authority_revision: authority,
+ payload: Some(event_envelope::Payload::Quote(Quote::default())),
+ ..Default::default()
+ }
+ }
+
+ fn bar(open_ms: i64, lifecycle: BarLifecycle) -> EventEnvelope {
+ EventEnvelope {
+ payload: Some(event_envelope::Payload::Bar(Bar {
+ open_time_ns: open_ms * 1_000_000,
+ lifecycle: lifecycle as i32,
+ ..Default::default()
+ })),
+ ..Default::default()
+ }
+ }
+
+ #[test]
+ fn a_quote_supersedes_a_quote_only_without_a_transition() {
+ let first = RecordLifecycle::of("QUOTE", "e(vec![1], 1));
+ assert!(first.superseded_by(&RecordLifecycle::of("QUOTE", "e(vec![1], 1))));
+ // Quality-state transition: lossless (invariant 27).
+ assert!(!first.superseded_by(&RecordLifecycle::of("QUOTE", "e(vec![1, 9], 1))));
+ // Source-authority transition: lossless.
+ assert!(!first.superseded_by(&RecordLifecycle::of("QUOTE", "e(vec![1], 2))));
+ // Flag order is not a transition.
+ let unordered = RecordLifecycle::of("QUOTE", "e(vec![9, 1], 1));
+ assert!(RecordLifecycle::of("QUOTE", "e(vec![1, 9], 1)).superseded_by(&unordered));
+ }
+
+ #[test]
+ fn bars_coalesce_only_in_progress_updates_of_one_open_time() {
+ let progress = RecordLifecycle::of("BAR", &bar(60_000, BarLifecycle::InProgress));
+ assert!(progress.superseded_by(&RecordLifecycle::of(
+ "BAR",
+ &bar(60_000, BarLifecycle::InProgress)
+ )));
+ assert!(progress.superseded_by(&RecordLifecycle::of(
+ "BAR",
+ &bar(60_000, BarLifecycle::Final)
+ )));
+ // Another open time never supersedes.
+ assert!(!progress.superseded_by(&RecordLifecycle::of(
+ "BAR",
+ &bar(120_000, BarLifecycle::InProgress)
+ )));
+ // A final, revised or cancelled bar is never dropped.
+ for lifecycle in [
+ BarLifecycle::Final,
+ BarLifecycle::Revised,
+ BarLifecycle::Cancelled,
+ BarLifecycle::Unspecified,
+ ] {
+ let record = RecordLifecycle::of("BAR", &bar(60_000, lifecycle));
+ assert!(!record.coalescible(), "{lifecycle:?}");
+ assert!(!record.superseded_by(&RecordLifecycle::of(
+ "BAR",
+ &bar(60_000, BarLifecycle::Final)
+ )));
+ }
+ }
+
+ #[test]
+ fn book_and_trade_records_are_never_coalescible() {
+ for feed in ["TRADE", "BOOK_SNAPSHOT", "BOOK_DELTA"] {
+ let record = RecordLifecycle::of(feed, &EventEnvelope::default());
+ assert!(!record.coalescible(), "{feed}");
+ }
+ assert!(RecordLifecycle::of("MARK_INDEX_PRICE", &EventEnvelope::default()).coalescible());
+ }
+}
diff --git a/rust/qdl-contracts/src/gateway_bundle.rs b/rust/qdl-contracts/src/gateway_bundle.rs
new file mode 100644
index 00000000..b718a7de
--- /dev/null
+++ b/rust/qdl-contracts/src/gateway_bundle.rs
@@ -0,0 +1,288 @@
+//! The native gateway/projector bundle compiled by `scripts/kn_gateway_bundle.py`
+//! from the Python manifest and catalog loaders. Rust never reparses YAML; a
+//! bundle whose canonical SHA-256 does not match is refused. One owner for the
+//! Stream authorization (KN-2) and the projector's product identity (KN-3 D14).
+
+use ring::digest;
+use serde_json::{Map, Value};
+
+pub const SCHEMA: &str = "qdl.kn.v220.gateway-bundle.v1";
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Binding {
+ pub binding_id: String,
+ pub instrument_uid: String,
+ pub venue: String,
+ pub market: String,
+ pub feed: String,
+ pub interval: Option,
+ pub source_policy_id: String,
+ pub physical_key: String,
+ pub product_key: String,
+ pub stale_after_ms: u64,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct ManifestRequirement {
+ pub instrument_uid: String,
+ pub feed: String,
+ pub interval: Option,
+ pub consumer_grade: String,
+ pub source_policy_id: String,
+ pub event_recency_policy: Option,
+ pub max_session_liveness_ms: Option,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Quotas {
+ pub requests_per_minute: u64,
+ pub max_batch_items: u64,
+ pub max_warmup_rows: u64,
+ pub max_streams: u64,
+ pub max_buffer_events: u64,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Manifest {
+ pub consumer_id: String,
+ pub subject: String,
+ pub environment: String,
+ pub manifest_revision: u64,
+ pub allowed_purposes: Vec,
+ pub allowed_permissions: Vec,
+ pub quotas: Quotas,
+ pub requirements: Vec,
+}
+
+#[derive(Clone, Debug)]
+pub struct Bundle {
+ pub sha256: String,
+ pub environment: String,
+ pub catalog_revision: u64,
+ pub source_policy_revision: u64,
+ pub canonical_stream: String,
+ pub bindings: Vec,
+ pub manifests: Vec,
+}
+
+fn text(value: &Value, name: &str) -> Result {
+ value[name]
+ .as_str()
+ .map(str::to_owned)
+ .ok_or_else(|| format!("bundle field {name} must be a string"))
+}
+
+fn optional_text(value: &Value, name: &str) -> Result, String> {
+ match &value[name] {
+ Value::Null => Ok(None),
+ Value::String(text) => Ok(Some(text.clone())),
+ _ => Err(format!("bundle field {name} must be a string or null")),
+ }
+}
+
+fn integer(value: &Value, name: &str) -> Result {
+ value[name]
+ .as_u64()
+ .ok_or_else(|| format!("bundle field {name} must be an unsigned integer"))
+}
+
+fn strings(value: &Value, name: &str) -> Result, String> {
+ value[name]
+ .as_array()
+ .ok_or_else(|| format!("bundle field {name} must be an array"))?
+ .iter()
+ .map(|item| {
+ item.as_str()
+ .map(str::to_owned)
+ .ok_or_else(|| format!("bundle {name} entries must be strings"))
+ })
+ .collect()
+}
+
+/// SHA-256 of the canonical JSON (sorted keys, compact) without `sha256`,
+/// the same bytes `scripts/kn_gateway_bundle.py` hashes.
+pub fn canonical_sha256(document: &Map) -> String {
+ let mut body = document.clone();
+ body.remove("sha256");
+ let encoded = serde_json::to_string(&Value::Object(body)).expect("JSON value serializes");
+ digest::digest(&digest::SHA256, encoded.as_bytes())
+ .as_ref()
+ .iter()
+ .fold(String::with_capacity(64), |mut hex, byte| {
+ use std::fmt::Write as _;
+ let _ = write!(hex, "{byte:02x}");
+ hex
+ })
+}
+
+impl Bundle {
+ pub fn parse(raw: &str) -> Result {
+ let document: Value = serde_json::from_str(raw).map_err(|error| error.to_string())?;
+ let object = document.as_object().ok_or("bundle must be a JSON object")?;
+ if document["schema"].as_str() != Some(SCHEMA) {
+ return Err("unsupported gateway bundle schema".into());
+ }
+ let declared = text(&document, "sha256")?;
+ let computed = canonical_sha256(object);
+ if declared != computed {
+ return Err(format!(
+ "gateway bundle hash mismatch: declared {declared}, computed {computed}"
+ ));
+ }
+ let catalog = &document["catalog"];
+ let bindings = catalog["bindings"]
+ .as_array()
+ .ok_or("bundle catalog bindings must be an array")?
+ .iter()
+ .map(|item| {
+ Ok(Binding {
+ binding_id: text(item, "binding_id")?,
+ instrument_uid: text(item, "instrument_uid")?,
+ venue: text(item, "venue")?,
+ market: text(item, "market")?,
+ feed: text(item, "feed")?,
+ interval: optional_text(item, "interval")?,
+ source_policy_id: text(item, "source_policy_id")?,
+ physical_key: text(item, "physical_key")?,
+ product_key: text(item, "product_key")?,
+ stale_after_ms: integer(item, "stale_after_ms")?,
+ })
+ })
+ .collect::, String>>()?;
+ let manifests = document["manifests"]
+ .as_array()
+ .ok_or("bundle manifests must be an array")?
+ .iter()
+ .map(|item| {
+ let quotas = &item["quotas"];
+ Ok(Manifest {
+ consumer_id: text(item, "consumer_id")?,
+ subject: text(item, "subject")?,
+ environment: text(item, "environment")?,
+ manifest_revision: integer(item, "manifest_revision")?,
+ allowed_purposes: strings(item, "allowed_purposes")?,
+ allowed_permissions: strings(item, "allowed_permissions")?,
+ quotas: Quotas {
+ requests_per_minute: integer(quotas, "requests_per_minute")?,
+ max_batch_items: integer(quotas, "max_batch_items")?,
+ max_warmup_rows: integer(quotas, "max_warmup_rows")?,
+ max_streams: integer(quotas, "max_streams")?,
+ max_buffer_events: integer(quotas, "max_buffer_events")?,
+ },
+ requirements: item["requirements"]
+ .as_array()
+ .ok_or("manifest requirements must be an array")?
+ .iter()
+ .map(|requirement| {
+ Ok(ManifestRequirement {
+ instrument_uid: text(requirement, "instrument_uid")?,
+ feed: text(requirement, "feed")?,
+ interval: optional_text(requirement, "interval")?,
+ consumer_grade: text(requirement, "consumer_grade")?,
+ source_policy_id: text(requirement, "source_policy_id")?,
+ event_recency_policy: optional_text(
+ requirement,
+ "event_recency_policy",
+ )?,
+ max_session_liveness_ms: requirement["max_session_liveness_ms"]
+ .as_u64(),
+ })
+ })
+ .collect::, String>>()?,
+ })
+ })
+ .collect::, String>>()?;
+ Ok(Self {
+ sha256: declared,
+ environment: text(&document, "environment")?,
+ catalog_revision: integer(catalog, "catalog_revision")?,
+ source_policy_revision: integer(catalog, "source_policy_revision")?,
+ canonical_stream: text(catalog, "canonical_stream")?,
+ bindings,
+ manifests,
+ })
+ }
+
+ pub fn manifest_by_subject(&self, environment: &str, subject: &str) -> Option<&Manifest> {
+ self.manifests
+ .iter()
+ .find(|item| item.environment == environment && item.subject == subject)
+ }
+
+ /// The binding whose logical product key a cursor names.
+ pub fn binding_by_product(&self, product_key: &str) -> Option<&Binding> {
+ self.bindings
+ .iter()
+ .find(|item| item.product_key == product_key)
+ }
+
+ /// `StableSourceCatalog.binding_for`: (uid, feed, interval), then policy.
+ pub fn binding_for(
+ &self,
+ instrument_uid: &str,
+ feed: &str,
+ interval: Option<&str>,
+ source_policy_id: &str,
+ ) -> Option<&Binding> {
+ self.bindings
+ .iter()
+ .find(|item| {
+ item.instrument_uid == instrument_uid
+ && item.feed == feed
+ && item.interval.as_deref() == interval
+ })
+ .filter(|item| item.source_policy_id == source_policy_id)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ fn sample() -> Value {
+ serde_json::json!({
+ "schema": SCHEMA,
+ "environment": "paper",
+ "catalog": {"catalog_revision": 9, "source_policy_revision": 1,
+ "canonical_stream": "md.canonical.v2", "bindings": [{
+ "binding_id": "okx-swap-btc-usdt-swap-trade",
+ "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "venue": "OKX", "market": "SWAP", "feed": "TRADE", "interval": null,
+ "source_policy_id": "crypto_primary_v2",
+ "physical_key": "fb26214c-7b9b-5961-95b2-55154755af0f/trade/okx-swap",
+ "source_id": "okx-swap",
+ "stale_after_ms": 2000,
+ "product_key": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-"}]},
+ "manifests": []
+ })
+ }
+
+ #[test]
+ fn a_bundle_with_the_right_hash_parses_and_a_tampered_one_is_refused() {
+ let mut document = sample();
+ let hash = canonical_sha256(document.as_object().expect("object"));
+ document["sha256"] = Value::String(hash);
+ let bundle = Bundle::parse(&document.to_string()).expect("valid bundle");
+ assert_eq!(bundle.catalog_revision, 9);
+ assert!(bundle
+ .binding_for(
+ "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "TRADE",
+ None,
+ "crypto_primary_v2"
+ )
+ .is_some());
+ assert!(bundle
+ .binding_for(
+ "fb26214c-7b9b-5961-95b2-55154755af0f",
+ "TRADE",
+ None,
+ "other"
+ )
+ .is_none());
+ document["catalog"]["catalog_revision"] = Value::from(10);
+ assert!(Bundle::parse(&document.to_string())
+ .unwrap_err()
+ .contains("hash mismatch"));
+ }
+}
diff --git a/rust/qdl-contracts/src/interval.rs b/rust/qdl-contracts/src/interval.rs
new file mode 100644
index 00000000..99b359e7
--- /dev/null
+++ b/rust/qdl-contracts/src/interval.rs
@@ -0,0 +1,60 @@
+//! The canonical interval duration (single owner:
+//! `qdl.adapters.intervals.canonical_interval_ms`), shared by the stream
+//! gateway (warmup quota) and the projector (BAR buckets).
+
+/// `qdl.adapters.intervals.canonical_interval_ms` for the canonical
+/// lowercase `` spelling (calendar months are refused).
+pub fn canonical_interval_ms(interval: &str) -> Result {
+ let value = interval.trim();
+ if value.is_empty() {
+ return Err("canonical interval is required".into());
+ }
+ if value.ends_with('M') {
+ return Err(format!(
+ "calendar-month bars have no fixed duration and are not canonical intervals; \
+ 'M' is never folded into minutes: {interval:?}"
+ ));
+ }
+ if value != value.to_lowercase() {
+ return Err(format!(
+ "canonical interval must be lowercase, venue spelling is derived: {interval:?}"
+ ));
+ }
+ let (count, unit) = value.split_at(value.len() - 1);
+ let unit_ms: u64 = match unit {
+ "s" => 1_000,
+ "m" => 60_000,
+ "h" => 3_600_000,
+ "d" => 86_400_000,
+ "w" => 604_800_000,
+ _ => {
+ return Err(format!(
+ "canonical interval must use a fixed s/m/h/d/w duration: {interval:?}"
+ ))
+ }
+ };
+ let count: u64 = count
+ .parse()
+ .map_err(|_| format!("canonical interval count must be an integer: {interval:?}"))?;
+ if count == 0 {
+ return Err(format!("canonical interval must be positive: {interval:?}"));
+ }
+ count
+ .checked_mul(unit_ms)
+ .ok_or_else(|| format!("canonical interval is too large: {interval:?}"))
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn fixed_intervals_have_a_duration_and_months_are_refused() {
+ assert_eq!(canonical_interval_ms("1m"), Ok(60_000));
+ assert_eq!(canonical_interval_ms("3d"), Ok(259_200_000));
+ assert_eq!(canonical_interval_ms("1w"), Ok(604_800_000));
+ for bad in ["1M", "1H", "0m", "", "5x", "m"] {
+ assert!(canonical_interval_ms(bad).is_err(), "{bad:?}");
+ }
+ }
+}
diff --git a/rust/qdl-contracts/src/lib.rs b/rust/qdl-contracts/src/lib.rs
index d98bd08a..c8d1acdf 100644
--- a/rust/qdl-contracts/src/lib.rs
+++ b/rust/qdl-contracts/src/lib.rs
@@ -1,3 +1,11 @@
+pub mod cursor_v3;
+pub mod delivery;
+pub mod gateway_bundle;
+pub mod interval;
+pub mod requirement;
+pub mod state_codec;
+pub mod state_contract;
+
pub mod qdl {
pub mod common {
pub mod v1 {
diff --git a/rust/qdl-contracts/src/requirement.rs b/rust/qdl-contracts/src/requirement.rs
new file mode 100644
index 00000000..ab97da9d
--- /dev/null
+++ b/rust/qdl-contracts/src/requirement.rs
@@ -0,0 +1,500 @@
+//! Native validation of a public `DataRequirement` (KN-1 finding F1), the
+//! Rust side of `qdl.stream.grpc_service.requirement_from_proto` followed by
+//! `WarmupSpecification` and `DataRequirement.__post_init__`.
+//!
+//! A requirement is validated before it is digested or served, so the native
+//! gateway refuses exactly what the Python server refuses, in the same order
+//! and with the same message. Every refusal carries a stable rule code;
+//! `contracts/golden/kn_v220/requirement_validation.json` (produced by the
+//! Python server path) is the shared oracle for both languages.
+
+use crate::cursor_v3::DeliveryRequirement;
+use crate::qdl::query::v2 as query;
+
+const METRIC_INTERVAL_FEEDS: [&str; 3] = ["LONG_SHORT_RATIO", "TAKER_FLOW", "BASIS"];
+const OPTIONAL_INTERVAL_FEEDS: [&str; 1] = ["OPEN_INTEREST"];
+const EXECUTION_PRICE_VALIDATION_FEEDS: [&str; 6] = [
+ "TRADE",
+ "QUOTE",
+ "BAR",
+ "BOOK_SNAPSHOT",
+ "BOOK_DELTA",
+ "MARK_INDEX_PRICE",
+];
+const MAX_PUBLIC_WARMUP_ROWS: u32 = 10_000;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct RequirementError {
+ pub rule: &'static str,
+ pub message: String,
+}
+
+impl RequirementError {
+ fn new(rule: &'static str, message: impl Into) -> Self {
+ Self {
+ rule,
+ message: message.into(),
+ }
+ }
+}
+
+impl std::fmt::Display for RequirementError {
+ fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ formatter.write_str(&self.message)
+ }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum WarmupHorizon {
+ Rows(u32),
+ TimeRange {
+ start_time_ns: i64,
+ end_time_ns: i64,
+ },
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct Warmup {
+ pub horizon: WarmupHorizon,
+ pub interval_source_policy: String,
+ pub max_cache_age_ms: u32,
+ pub deadline_ms: u32,
+}
+
+/// A requirement the Python server would accept.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct ValidatedRequirement {
+ pub delivery: DeliveryRequirement,
+ pub warmup_limit: u32,
+ pub warmup: Option,
+}
+
+/// `str.isspace` semantics: Unicode White_Space plus the four ASCII
+/// separators U+001C..U+001F that Python also strips.
+fn is_python_space(character: char) -> bool {
+ character.is_whitespace() || ('\u{1c}'..='\u{1f}').contains(&character)
+}
+
+fn is_blank(value: &str) -> bool {
+ value.chars().all(is_python_space)
+}
+
+/// `enum_value` of `requirement_from_proto`: an unknown wire number is refused
+/// as `Enum.Name` refuses it, then UNSPECIFIED is refused.
+fn enum_name(
+ name: Option<&'static str>,
+ number: i32,
+ wrapper: &str,
+ prefix: &str,
+) -> Result {
+ let name = name.ok_or_else(|| {
+ RequirementError::new(
+ "ENUM_UNKNOWN",
+ format!("Enum {wrapper} has no name defined for value {number}"),
+ )
+ })?;
+ if name.ends_with("_UNSPECIFIED") {
+ let rule = match prefix {
+ "FEED_TYPE_" => "FEED_UNSPECIFIED",
+ "CONSUMER_GRADE_" => "GRADE_UNSPECIFIED",
+ "STALE_POLICY_" => "STALE_UNSPECIFIED",
+ "GAP_POLICY_" => "GAP_UNSPECIFIED",
+ "RECOVERY_POLICY_" => "RECOVERY_UNSPECIFIED",
+ _ => "REVISION_UNSPECIFIED",
+ };
+ return Err(RequirementError::new(
+ rule,
+ format!("{} cannot be UNSPECIFIED", prefix.to_ascii_lowercase()),
+ ));
+ }
+ Ok(name.strip_prefix(prefix).unwrap_or(name).to_owned())
+}
+
+macro_rules! proto_enum {
+ ($type:ident, $number:expr, $prefix:literal) => {
+ enum_name(
+ query::$type::try_from($number)
+ .ok()
+ .map(|value| value.as_str_name()),
+ $number,
+ stringify!($type),
+ $prefix,
+ )
+ };
+}
+
+fn warmup_from_proto(value: &query::WarmupSpecification) -> Result {
+ let Some(horizon) = value.horizon.as_ref() else {
+ return Err(RequirementError::new(
+ "WARMUP_HORIZON",
+ "warmup horizon is required",
+ ));
+ };
+ if value.interval_source_policy == query::IntervalSourcePolicy::Unspecified as i32 {
+ return Err(RequirementError::new(
+ "WARMUP_INTERVAL_SOURCE",
+ "warmup interval source policy is required",
+ ));
+ }
+ let interval_source_policy =
+ query::IntervalSourcePolicy::try_from(value.interval_source_policy)
+ .map_err(|_| {
+ RequirementError::new(
+ "ENUM_UNKNOWN",
+ format!(
+ "Enum IntervalSourcePolicy has no name defined for value {}",
+ value.interval_source_policy
+ ),
+ )
+ })?
+ .as_str_name()
+ .trim_start_matches("INTERVAL_SOURCE_POLICY_")
+ .to_owned();
+ let horizon = match horizon {
+ query::warmup_specification::Horizon::Rows(rows) => WarmupHorizon::Rows(*rows),
+ query::warmup_specification::Horizon::TimeRange(range) => {
+ if range.start_time_ns <= 0 || range.end_time_ns <= range.start_time_ns {
+ return Err(RequirementError::new(
+ "WARMUP_TIME_RANGE",
+ "warmup time range must be positive and increasing",
+ ));
+ }
+ WarmupHorizon::TimeRange {
+ start_time_ns: range.start_time_ns,
+ end_time_ns: range.end_time_ns,
+ }
+ }
+ };
+ if let WarmupHorizon::Rows(rows) = horizon {
+ if !(1..=100_000).contains(&rows) {
+ return Err(RequirementError::new(
+ "WARMUP_ROWS_RANGE",
+ "warmup rows must be between 1 and 100000",
+ ));
+ }
+ }
+ if value.max_cache_age_ms > 86_400_000 {
+ return Err(RequirementError::new(
+ "WARMUP_CACHE_AGE",
+ "warmup max_cache_age_ms is outside bounds",
+ ));
+ }
+ if !(100..=120_000).contains(&value.deadline_ms) {
+ return Err(RequirementError::new(
+ "WARMUP_DEADLINE",
+ "warmup deadline_ms must be between 100 and 120000",
+ ));
+ }
+ Ok(Warmup {
+ horizon,
+ interval_source_policy,
+ max_cache_age_ms: value.max_cache_age_ms,
+ deadline_ms: value.deadline_ms,
+ })
+}
+
+impl ValidatedRequirement {
+ pub fn from_proto(value: &query::DataRequirement) -> Result {
+ let feed = proto_enum!(FeedType, value.feed_type, "FEED_TYPE_")?;
+ let consumer_grade = proto_enum!(ConsumerGrade, value.grade, "CONSUMER_GRADE_")?;
+ let event_recency_policy =
+ if value.event_recency_policy == query::StalePolicy::Unspecified as i32 {
+ None
+ } else {
+ Some(proto_enum!(
+ StalePolicy,
+ value.event_recency_policy,
+ "STALE_POLICY_"
+ )?)
+ };
+ let stale_policy = proto_enum!(StalePolicy, value.stale_policy_type, "STALE_POLICY_")?;
+ let gap_policy = proto_enum!(GapPolicy, value.gap_policy_type, "GAP_POLICY_")?;
+ let recovery = proto_enum!(RecoveryPolicy, value.recovery_policy, "RECOVERY_POLICY_")?;
+ let bar_revision_policy = proto_enum!(
+ BarRevisionPolicy,
+ value.revision_policy,
+ "BAR_REVISION_POLICY_"
+ )?;
+ let warmup = value.warmup.as_ref().map(warmup_from_proto).transpose()?;
+ let delivery = DeliveryRequirement {
+ instrument_uid: value.instrument_uid.clone(),
+ feed,
+ interval: (!value.interval.is_empty()).then(|| value.interval.clone()),
+ consumer_grade,
+ source_policy_id: value.source_policy_id.clone(),
+ max_freshness_ms: (value.max_freshness_ms != 0).then_some(value.max_freshness_ms),
+ event_recency_policy,
+ max_session_liveness_ms: (value.max_session_liveness_ms != 0)
+ .then_some(value.max_session_liveness_ms),
+ require_full_coverage: value.require_full_coverage,
+ require_final_bars: value.require_final_bars,
+ stale_policy,
+ gap_policy,
+ recovery,
+ bar_revision_policy,
+ };
+ let requirement = Self {
+ delivery,
+ warmup_limit: value.warmup_limit,
+ warmup,
+ };
+ requirement.check()?;
+ Ok(requirement)
+ }
+
+ /// `DataRequirement.__post_init__`, in its order. The positivity checks
+ /// on `max_freshness_ms` / `max_session_liveness_ms` and the enum
+ /// UNSPECIFIED check cannot fail here: the proto mapping already turned
+ /// zero into `None` and refused UNSPECIFIED.
+ fn check(&self) -> Result<(), RequirementError> {
+ let delivery = &self.delivery;
+ if is_blank(&delivery.instrument_uid) {
+ return Err(RequirementError::new(
+ "INSTRUMENT_UID",
+ "instrument_uid is required",
+ ));
+ }
+ if is_blank(&delivery.source_policy_id) {
+ return Err(RequirementError::new(
+ "SOURCE_POLICY_ID",
+ "source_policy_id is required",
+ ));
+ }
+ if self.warmup_limit > MAX_PUBLIC_WARMUP_ROWS {
+ return Err(RequirementError::new(
+ "WARMUP_LIMIT",
+ "warmup_limit must be between 0 and 10000",
+ ));
+ }
+ match self.warmup.as_ref().map(|warmup| &warmup.horizon) {
+ Some(WarmupHorizon::Rows(rows)) => {
+ if *rows > MAX_PUBLIC_WARMUP_ROWS {
+ return Err(RequirementError::new(
+ "WARMUP_ROWS_PUBLIC",
+ "public V2 warmup rows cannot exceed 10000",
+ ));
+ }
+ if self.warmup_limit != 0 && self.warmup_limit != *rows {
+ return Err(RequirementError::new(
+ "WARMUP_LIMIT_CONFLICT",
+ "warmup_limit conflicts with warmup.rows",
+ ));
+ }
+ }
+ Some(WarmupHorizon::TimeRange { .. }) if self.warmup_limit != 0 => {
+ return Err(RequirementError::new(
+ "WARMUP_TIME_RANGE_LIMIT",
+ "time-range warmup cannot also declare warmup_limit",
+ ));
+ }
+ _ => {}
+ }
+ if delivery.event_recency_policy.as_deref() == Some("OBSERVE")
+ && delivery.max_session_liveness_ms.is_none()
+ {
+ return Err(RequirementError::new(
+ "RECENCY_OBSERVE_SLA",
+ "observed event recency requires an explicit provider session SLA",
+ ));
+ }
+ let feed = delivery.feed.as_str();
+ let interval_blank = delivery.interval.as_deref().is_none_or(is_blank);
+ if feed == "BAR" {
+ if interval_blank {
+ return Err(RequirementError::new(
+ "BAR_INTERVAL",
+ "bar requirements need an interval",
+ ));
+ }
+ } else if METRIC_INTERVAL_FEEDS.contains(&feed) {
+ if interval_blank {
+ return Err(RequirementError::new(
+ "METRIC_INTERVAL",
+ "metric-series requirements need a sampling interval",
+ ));
+ }
+ } else if OPTIONAL_INTERVAL_FEEDS.contains(&feed) {
+ if delivery.interval.as_deref().is_some_and(is_blank) {
+ return Err(RequirementError::new(
+ "OI_INTERVAL_BLANK",
+ "open-interest sampling interval cannot be blank",
+ ));
+ }
+ } else if delivery.interval.is_some() {
+ return Err(RequirementError::new(
+ "INTERVAL_NOT_ALLOWED",
+ "interval is valid only for bar or metric-series requirements",
+ ));
+ }
+ if delivery.consumer_grade == "EXECUTION" {
+ if !EXECUTION_PRICE_VALIDATION_FEEDS.contains(&feed) {
+ return Err(RequirementError::new(
+ "EXECUTION_FEED",
+ "execution-grade requirements need an execution-price validation feed",
+ ));
+ }
+ if delivery.stale_policy != "BLOCK" {
+ return Err(RequirementError::new(
+ "EXECUTION_STALE",
+ "execution-grade stale policy must BLOCK",
+ ));
+ }
+ if delivery.gap_policy != "BLOCK" {
+ return Err(RequirementError::new(
+ "EXECUTION_GAP",
+ "execution-grade gap policy must BLOCK",
+ ));
+ }
+ if !delivery.require_full_coverage {
+ return Err(RequirementError::new(
+ "EXECUTION_COVERAGE",
+ "execution-grade requirements need full coverage",
+ ));
+ }
+ }
+ Ok(())
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use serde_json::Value;
+
+ fn golden() -> Value {
+ serde_json::from_str(include_str!(
+ "../../../contracts/golden/kn_v220/requirement_validation.json"
+ ))
+ .expect("requirement validation golden")
+ }
+
+ fn enum_number(value: &Value, prefix: &str, from_name: fn(&str) -> Option) -> i32 {
+ match value {
+ Value::Null => 0,
+ Value::Number(number) => number.as_i64().expect("enum number") as i32,
+ Value::String(name) => from_name(&format!("{prefix}{name}")).expect("enum name"),
+ other => panic!("enum value {other}"),
+ }
+ }
+
+ fn proto(value: &Value) -> query::DataRequirement {
+ let text = |field: &str| value[field].as_str().expect(field).to_owned();
+ let number = |field: &str| value[field].as_u64().expect(field);
+ let flag = |field: &str| value[field].as_bool().expect(field);
+ let stale = |field: &str| {
+ enum_number(&value[field], "STALE_POLICY_", |name| {
+ query::StalePolicy::from_str_name(name).map(|v| v as i32)
+ })
+ };
+ let warmup = value["warmup"].as_object().map(|warmup| {
+ let horizon = match warmup["horizon"].as_str().expect("horizon") {
+ "rows" => Some(query::warmup_specification::Horizon::Rows(
+ warmup["rows"].as_u64().expect("rows") as u32,
+ )),
+ "time_range" => Some(query::warmup_specification::Horizon::TimeRange(
+ query::WarmupTimeRange {
+ start_time_ns: warmup["start_time_ns"].as_i64().expect("start"),
+ end_time_ns: warmup["end_time_ns"].as_i64().expect("end"),
+ },
+ )),
+ _ => None,
+ };
+ query::WarmupSpecification {
+ horizon,
+ interval_source_policy: enum_number(
+ &warmup["interval_source_policy"],
+ "INTERVAL_SOURCE_POLICY_",
+ |name| query::IntervalSourcePolicy::from_str_name(name).map(|v| v as i32),
+ ),
+ max_cache_age_ms: warmup["max_cache_age_ms"].as_u64().expect("age") as u32,
+ deadline_ms: warmup["deadline_ms"].as_u64().expect("deadline") as u32,
+ }
+ });
+ #[allow(deprecated)]
+ query::DataRequirement {
+ instrument_uid: text("instrument_uid"),
+ interval: text("interval"),
+ source_policy_id: text("source_policy_id"),
+ warmup_limit: number("warmup_limit") as u32,
+ max_freshness_ms: number("max_freshness_ms"),
+ require_full_coverage: flag("require_full_coverage"),
+ require_final_bars: flag("require_final_bars"),
+ feed_type: enum_number(&value["feed"], "FEED_TYPE_", |name| {
+ query::FeedType::from_str_name(name).map(|v| v as i32)
+ }),
+ grade: enum_number(&value["consumer_grade"], "CONSUMER_GRADE_", |name| {
+ query::ConsumerGrade::from_str_name(name).map(|v| v as i32)
+ }),
+ stale_policy_type: stale("stale_policy"),
+ gap_policy_type: enum_number(&value["gap_policy"], "GAP_POLICY_", |name| {
+ query::GapPolicy::from_str_name(name).map(|v| v as i32)
+ }),
+ recovery_policy: enum_number(&value["recovery"], "RECOVERY_POLICY_", |name| {
+ query::RecoveryPolicy::from_str_name(name).map(|v| v as i32)
+ }),
+ revision_policy: enum_number(
+ &value["bar_revision_policy"],
+ "BAR_REVISION_POLICY_",
+ |name| query::BarRevisionPolicy::from_str_name(name).map(|v| v as i32),
+ ),
+ event_recency_policy: stale("event_recency_policy"),
+ max_session_liveness_ms: number("max_session_liveness_ms"),
+ warmup,
+ ..Default::default()
+ }
+ }
+
+ #[test]
+ fn every_golden_case_gets_the_python_outcome() {
+ let golden = golden();
+ let cases = golden["cases"].as_array().expect("cases");
+ assert!(cases.len() >= 40);
+ for case in cases {
+ let name = case["name"].as_str().expect("name");
+ let outcome = ValidatedRequirement::from_proto(&proto(&case["requirement"]));
+ match case["rule"].as_str() {
+ None => assert!(outcome.is_ok(), "{name}: {outcome:?}"),
+ Some(rule) => {
+ let error = outcome.expect_err(name);
+ assert_eq!(error.rule, rule, "{name}");
+ // Same message as the Python server (INVALID_ARGUMENT detail).
+ let prefix = golden["rule_messages"][rule].as_str().expect("message");
+ assert!(
+ error.message.starts_with(prefix),
+ "{name}: {}",
+ error.message
+ );
+ }
+ }
+ }
+ }
+
+ #[test]
+ fn every_rule_code_is_exercised_by_the_golden() {
+ let golden = golden();
+ let mut seen: Vec<&str> = golden["cases"]
+ .as_array()
+ .expect("cases")
+ .iter()
+ .filter_map(|case| case["rule"].as_str())
+ .collect();
+ seen.sort_unstable();
+ seen.dedup();
+ let rules: Vec<&str> = golden["rules"]
+ .as_array()
+ .expect("rules")
+ .iter()
+ .map(|rule| rule.as_str().expect("rule"))
+ .collect();
+ assert_eq!(seen, rules);
+ }
+
+ #[test]
+ fn a_digest_is_never_produced_for_an_invalid_requirement() {
+ let golden = golden();
+ for case in golden["cases"].as_array().expect("cases") {
+ let digest = DeliveryRequirement::from_proto(&proto(&case["requirement"]));
+ assert_eq!(digest.is_ok(), case["rule"].is_null(), "{}", case["name"]);
+ }
+ }
+}
diff --git a/rust/qdl-contracts/src/state_codec.rs b/rust/qdl-contracts/src/state_codec.rs
new file mode 100644
index 00000000..b6e3ab2e
--- /dev/null
+++ b/rust/qdl-contracts/src/state_codec.rs
@@ -0,0 +1,1513 @@
+//! KN-3 state codecs (contract sections 2-5, decisions D2-D4), the native
+//! side of `qdl/projection/kn_state_codec.py`.
+//!
+//! * State trailer (48 bytes): source offset u64 BE, materializer epoch u64
+//! BE, SHA-256 of the canonical EventEnvelope bytes.
+//! * BAR cache row: trailer + the canonical envelope without the LPK-derived
+//! fields (instrument uid, venue, market, bar interval); decoding restores
+//! them from the LPK and proves the bytes against the stored hash.
+//! * Latest cache value: trailer + the full canonical bytes.
+//! * State-topic frame: `QKS1` + kind u8 + header length u32 BE + canonical
+//! strict JSON header + the canonical envelope bytes unchanged.
+//! * Keys and partition: latest key = LPK; BAR keys keep the in-progress row
+//! apart from every final revision; partition = Kafka murmur2 of the LPK.
+//!
+//! Both languages refuse the same input with the same short reason code
+//! (`REASONS`); `contracts/golden/kn_v220/state_codec.json`, built from real
+//! canonical records, is the shared oracle.
+
+use prost::Message;
+use ring::digest;
+use serde_json::{Map, Value};
+use std::fmt::Write as _;
+
+use crate::qdl::marketdata::v2::{event_envelope::Payload, Bar, EventEnvelope};
+use crate::state_contract::{LogicalProductKey, SourceCoordinate, MAX_OFFSET};
+
+pub const TRAILER_BYTES: usize = 48;
+pub const FRAME_MAGIC: &[u8; 4] = b"QKS1";
+pub const FRAME_PREFIX_BYTES: usize = 9;
+pub const MAX_HEADER_BYTES: usize = 4096;
+pub const LEGACY_PROVENANCE: &str = "legacy_import";
+pub const KAFKA_MURMUR2_SEED: u32 = 0x9747_b28c;
+const MURMUR2_M: u32 = 0x5bd1_e995;
+const MAX_PARTITION: u64 = (1 << 31) - 1;
+const MAX_REVISION: u64 = u32::MAX as u64;
+const MAX_TEXT_BYTES: usize = 1024;
+const MAX_EVENT_ID_HEX: usize = 1024;
+
+/// Shared refusal reasons, identical to `REASONS` in the Python codec.
+pub const REASONS: [&str; 18] = [
+ "TRUNCATED",
+ "MAGIC",
+ "KIND",
+ "HEADER_SIZE",
+ "HEADER_JSON",
+ "HEADER_FIELDS",
+ "FIELD",
+ "NON_CANONICAL",
+ "BODY",
+ "CONTENT_HASH",
+ "ENVELOPE",
+ "NOT_BAR",
+ "PRODUCT_MISMATCH",
+ "OPEN_TIME",
+ "HEADER_MISMATCH",
+ "TRAILER",
+ "ENVELOPE_NOT_CANONICAL",
+ "PARTITIONS",
+];
+
+/// A typed refusal. `reason` is one of `REASONS`; `detail` names the field
+/// when the reason concerns one (the same name Python reports).
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct StateCodecError {
+ pub reason: &'static str,
+ pub detail: String,
+}
+
+impl StateCodecError {
+ fn new(reason: &'static str) -> Self {
+ Self {
+ reason,
+ detail: String::new(),
+ }
+ }
+
+ fn at(reason: &'static str, detail: &str) -> Self {
+ Self {
+ reason,
+ detail: detail.to_owned(),
+ }
+ }
+}
+
+impl std::fmt::Display for StateCodecError {
+ fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(formatter, "STATE_CODEC:{}", self.reason)?;
+ if !self.detail.is_empty() {
+ write!(formatter, ":{}", self.detail)?;
+ }
+ Ok(())
+ }
+}
+
+impl std::error::Error for StateCodecError {}
+
+type Result = std::result::Result;
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+pub enum FrameKind {
+ Latest = 1,
+ BarRevision = 2,
+ RetentionFloor = 3,
+ LegacyBar = 4,
+}
+
+impl FrameKind {
+ pub fn from_byte(value: u8) -> Option {
+ match value {
+ 1 => Some(Self::Latest),
+ 2 => Some(Self::BarRevision),
+ 3 => Some(Self::RetentionFloor),
+ 4 => Some(Self::LegacyBar),
+ _ => None,
+ }
+ }
+
+ pub fn as_str(self) -> &'static str {
+ match self {
+ Self::Latest => "LATEST",
+ Self::BarRevision => "BAR_REVISION",
+ Self::RetentionFloor => "RETENTION_FLOOR",
+ Self::LegacyBar => "LEGACY_BAR",
+ }
+ }
+
+ /// The exact header field set, in sorted (validation) order.
+ fn fields(self) -> &'static [&'static str] {
+ match self {
+ Self::Latest => &[
+ "content_sha256",
+ "event_id",
+ "lpk",
+ "materializer_epoch",
+ "source",
+ ],
+ Self::BarRevision => &[
+ "content_sha256",
+ "event_id",
+ "is_final",
+ "lpk",
+ "materializer_epoch",
+ "open_time_ms",
+ "revision",
+ "source",
+ ],
+ Self::RetentionFloor => &["floor_open_time_ms", "lpk", "materializer_epoch"],
+ Self::LegacyBar => &[
+ "content_sha256",
+ "event_id",
+ "is_final",
+ "legacy",
+ "lpk",
+ "materializer_epoch",
+ "open_time_ms",
+ "provenance",
+ "revision",
+ ],
+ }
+ }
+
+ fn is_bar(self) -> bool {
+ matches!(self, Self::BarRevision | Self::LegacyBar)
+ }
+}
+
+fn sha256(bytes: &[u8]) -> [u8; 32] {
+ let mut out = [0_u8; 32];
+ out.copy_from_slice(digest::digest(&digest::SHA256, bytes).as_ref());
+ out
+}
+
+fn hex(bytes: &[u8]) -> String {
+ let mut text = String::with_capacity(bytes.len() * 2);
+ for byte in bytes {
+ let _ = write!(text, "{byte:02x}");
+ }
+ text
+}
+
+fn is_lower_hex(value: &str) -> bool {
+ value
+ .bytes()
+ .all(|byte| matches!(byte, b'0'..=b'9' | b'a'..=b'f'))
+}
+
+fn is_hex64(value: &str) -> bool {
+ value.len() == 64 && is_lower_hex(value)
+}
+
+fn is_event_id(value: &str) -> bool {
+ !value.is_empty()
+ && value.len() % 2 == 0
+ && value.len() <= MAX_EVENT_ID_HEX
+ && is_lower_hex(value)
+}
+
+/// Header strings never need JSON escaping, so both encoders agree.
+fn is_text(value: &str) -> bool {
+ (1..=MAX_TEXT_BYTES).contains(&value.len())
+ && value.bytes().all(|byte| {
+ byte.is_ascii_alphanumeric()
+ || matches!(
+ byte,
+ b'.' | b'_' | b':' | b'/' | b'@' | b'|' | b'+' | b'=' | b'-'
+ )
+ })
+}
+
+// ------------------------------------------------------------------ trailer
+
+/// A cache value proven against its trailer hash.
+#[derive(Clone, Debug, PartialEq, Eq)]
+pub struct DecodedState {
+ pub canonical: Vec,
+ pub source_offset: u64,
+ pub materializer_epoch: u64,
+}
+
+fn check_trailer_numbers(source_offset: u64, materializer_epoch: u64) -> Result<()> {
+ if source_offset > MAX_OFFSET || !(1..=MAX_OFFSET).contains(&materializer_epoch) {
+ return Err(StateCodecError::new("TRAILER"));
+ }
+ Ok(())
+}
+
+pub fn state_trailer(
+ canonical: &[u8],
+ source_offset: u64,
+ materializer_epoch: u64,
+) -> Result<[u8; TRAILER_BYTES]> {
+ check_trailer_numbers(source_offset, materializer_epoch)?;
+ let mut trailer = [0_u8; TRAILER_BYTES];
+ trailer[..8].copy_from_slice(&source_offset.to_be_bytes());
+ trailer[8..16].copy_from_slice(&materializer_epoch.to_be_bytes());
+ trailer[16..].copy_from_slice(&sha256(canonical));
+ Ok(trailer)
+}
+
+fn read_trailer(data: &[u8]) -> Result<(u64, u64, &[u8])> {
+ if data.len() < TRAILER_BYTES {
+ return Err(StateCodecError::new("TRUNCATED"));
+ }
+ let number = |range: std::ops::Range| {
+ let mut bytes = [0_u8; 8];
+ bytes.copy_from_slice(&data[range]);
+ u64::from_be_bytes(bytes)
+ };
+ let source_offset = number(0..8);
+ let materializer_epoch = number(8..16);
+ check_trailer_numbers(source_offset, materializer_epoch)?;
+ Ok((source_offset, materializer_epoch, &data[16..TRAILER_BYTES]))
+}
+
+/// Latest cache value: trailer + the full canonical bytes (nothing stripped).
+pub fn encode_latest_value(
+ canonical: &[u8],
+ source_offset: u64,
+ materializer_epoch: u64,
+) -> Result> {
+ let trailer = state_trailer(canonical, source_offset, materializer_epoch)?;
+ if canonical.is_empty() {
+ return Err(StateCodecError::new("BODY"));
+ }
+ let mut value = Vec::with_capacity(TRAILER_BYTES + canonical.len());
+ value.extend_from_slice(&trailer);
+ value.extend_from_slice(canonical);
+ Ok(value)
+}
+
+pub fn decode_latest_value(value: &[u8]) -> Result {
+ let (source_offset, materializer_epoch, stored) = read_trailer(value)?;
+ let canonical = &value[TRAILER_BYTES..];
+ if canonical.is_empty() {
+ return Err(StateCodecError::new("BODY"));
+ }
+ if sha256(canonical) != stored {
+ return Err(StateCodecError::new("CONTENT_HASH"));
+ }
+ Ok(DecodedState {
+ canonical: canonical.to_vec(),
+ source_offset,
+ materializer_epoch,
+ })
+}
+
+// ------------------------------------------------------------------ product checks
+
+fn parse_envelope(canonical: &[u8]) -> Result {
+ EventEnvelope::decode(canonical).map_err(|_| StateCodecError::new("ENVELOPE"))
+}
+
+/// The upper-case feed name of a payload: the proto oneof field name.
+pub fn payload_feed(payload: Option<&Payload>) -> &'static str {
+ match payload {
+ None => "",
+ Some(Payload::Trade(_)) => "TRADE",
+ Some(Payload::Quote(_)) => "QUOTE",
+ Some(Payload::Bar(_)) => "BAR",
+ Some(Payload::BookSnapshot(_)) => "BOOK_SNAPSHOT",
+ Some(Payload::BookDelta(_)) => "BOOK_DELTA",
+ Some(Payload::FundingRate(_)) => "FUNDING_RATE",
+ Some(Payload::OpenInterest(_)) => "OPEN_INTEREST",
+ Some(Payload::MarkIndexPrice(_)) => "MARK_INDEX_PRICE",
+ Some(Payload::Ticker(_)) => "TICKER",
+ Some(Payload::FeedState(_)) => "FEED_STATE",
+ Some(Payload::QualityEvent(_)) => "QUALITY_EVENT",
+ Some(Payload::LongShortRatio(_)) => "LONG_SHORT_RATIO",
+ Some(Payload::TakerFlow(_)) => "TAKER_FLOW",
+ Some(Payload::Basis(_)) => "BASIS",
+ Some(Payload::ContractMetadata(_)) => "CONTRACT_METADATA",
+ }
+}
+
+fn bar_of(envelope: &EventEnvelope) -> Option<&Bar> {
+ match &envelope.payload {
+ Some(Payload::Bar(bar)) => Some(bar),
+ _ => None,
+ }
+}
+
+fn bar_mut(envelope: &mut EventEnvelope) -> Option<&mut Bar> {
+ match &mut envelope.payload {
+ Some(Payload::Bar(bar)) => Some(bar),
+ _ => None,
+ }
+}
+
+/// The envelope is the product `lpk` names: uid, venue, market, feed, qualifier.
+fn check_product(envelope: &EventEnvelope, lpk: &LogicalProductKey) -> Result<()> {
+ let qualifier = bar_of(envelope).map_or("-", |bar| bar.interval.as_str());
+ for (name, actual, expected) in [
+ (
+ "instrument_uid",
+ envelope.instrument_uid.as_str(),
+ lpk.instrument_uid.as_str(),
+ ),
+ ("venue", envelope.venue.as_str(), lpk.venue.as_str()),
+ ("market", envelope.market.as_str(), lpk.market.as_str()),
+ (
+ "feed",
+ payload_feed(envelope.payload.as_ref()),
+ lpk.feed.as_str(),
+ ),
+ ("qualifier", qualifier, lpk.qualifier.as_str()),
+ ] {
+ if actual != expected {
+ return Err(StateCodecError::at("PRODUCT_MISMATCH", name));
+ }
+ }
+ Ok(())
+}
+
+fn open_time_ms(bar: &Bar) -> Result {
+ if bar.open_time_ns < 0 || bar.open_time_ns % 1_000_000 != 0 {
+ return Err(StateCodecError::new("OPEN_TIME"));
+ }
+ Ok((bar.open_time_ns / 1_000_000) as u64)
+}
+
+// ------------------------------------------------------------------ BAR cache row
+
+fn restore_bar(mut envelope: EventEnvelope, lpk: &LogicalProductKey) -> Vec {
+ envelope.instrument_uid = lpk.instrument_uid.clone();
+ envelope.venue = lpk.venue.clone();
+ envelope.market = lpk.market.clone();
+ if let Some(bar) = bar_mut(&mut envelope) {
+ bar.interval = lpk.qualifier.clone();
+ }
+ envelope.encode_to_vec()
+}
+
+/// BAR current-index row: trailer + the canonical envelope without the LPK
+/// fields. Refuses a non-BAR, a row of another product and canonical bytes
+/// that `decode_bar_row` would not reproduce byte for byte.
+pub fn encode_bar_row(
+ canonical: &[u8],
+ lpk: &LogicalProductKey,
+ source_offset: u64,
+ materializer_epoch: u64,
+) -> Result> {
+ let trailer = state_trailer(canonical, source_offset, materializer_epoch)?;
+ let mut envelope = parse_envelope(canonical)?;
+ if bar_of(&envelope).is_none() {
+ return Err(StateCodecError::new("NOT_BAR"));
+ }
+ check_product(&envelope, lpk)?;
+ envelope.instrument_uid.clear();
+ envelope.venue.clear();
+ envelope.market.clear();
+ if let Some(bar) = bar_mut(&mut envelope) {
+ bar.interval.clear();
+ }
+ let body = envelope.encode_to_vec();
+ if restore_bar(envelope, lpk) != canonical {
+ return Err(StateCodecError::new("ENVELOPE_NOT_CANONICAL"));
+ }
+ let mut row = Vec::with_capacity(TRAILER_BYTES + body.len());
+ row.extend_from_slice(&trailer);
+ row.extend_from_slice(&body);
+ Ok(row)
+}
+
+pub fn decode_bar_row(row: &[u8], lpk: &LogicalProductKey) -> Result {
+ let (source_offset, materializer_epoch, stored) = read_trailer(row)?;
+ let envelope = parse_envelope(&row[TRAILER_BYTES..])?;
+ let Some(bar) = bar_of(&envelope) else {
+ return Err(StateCodecError::new("NOT_BAR"));
+ };
+ if !envelope.instrument_uid.is_empty()
+ || !envelope.venue.is_empty()
+ || !envelope.market.is_empty()
+ || !bar.interval.is_empty()
+ {
+ return Err(StateCodecError::new("NON_CANONICAL"));
+ }
+ let canonical = restore_bar(envelope, lpk);
+ if sha256(&canonical) != stored {
+ return Err(StateCodecError::new("CONTENT_HASH"));
+ }
+ Ok(DecodedState {
+ canonical,
+ source_offset,
+ materializer_epoch,
+ })
+}
+
+// ------------------------------------------------------------------ canonical JSON header
+
+/// Sorted byte-order keys, `,`/`:`, no whitespace. Only called on validated
+/// values (strings from the no-escape charset, u64 integers, bools, objects).
+pub fn canonical_json(value: &Map) -> Vec {
+ let mut out = String::from("{");
+ let mut keys: Vec<&String> = value.keys().collect();
+ keys.sort_by(|left, right| left.as_bytes().cmp(right.as_bytes()));
+ for (index, key) in keys.into_iter().enumerate() {
+ if index > 0 {
+ out.push(',');
+ }
+ out.push('"');
+ out.push_str(key);
+ out.push_str("\":");
+ match &value[key] {
+ Value::Bool(flag) => out.push_str(if *flag { "true" } else { "false" }),
+ Value::Number(number) => out.push_str(&number.to_string()),
+ Value::String(text) => {
+ out.push('"');
+ out.push_str(text);
+ out.push('"');
+ }
+ Value::Object(object) => {
+ out.push_str(&String::from_utf8_lossy(&canonical_json(object)));
+ }
+ other => out.push_str(&other.to_string()),
+ }
+ }
+ out.push('}');
+ out.into_bytes()
+}
+
+fn exact(value: &Map