@oracle-agent/oracle 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +21 -12
  2. package/bin/oracle-data-mcp.mjs +9 -0
  3. package/docs/architecture.md +3 -1
  4. package/docs/profiles.md +3 -6
  5. package/docs/public-surface.md +133 -0
  6. package/package.json +1 -1
  7. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  8. package/public/oracle-splash/brand/aave.webp +0 -0
  9. package/public/oracle-splash/brand/aavev2.webp +0 -0
  10. package/public/oracle-splash/brand/aborean.webp +0 -0
  11. package/public/oracle-splash/brand/across.webp +0 -0
  12. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  13. package/public/oracle-splash/brand/afi.webp +0 -0
  14. package/public/oracle-splash/brand/arcus.webp +0 -0
  15. package/public/oracle-splash/brand/aster.webp +0 -0
  16. package/public/oracle-splash/brand/avant.webp +0 -0
  17. package/public/oracle-splash/brand/balancer.webp +0 -0
  18. package/public/oracle-splash/brand/beefy.webp +0 -0
  19. package/public/oracle-splash/brand/benqi.webp +0 -0
  20. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  21. package/public/oracle-splash/brand/bitfi.webp +0 -0
  22. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  23. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  24. package/public/oracle-splash/brand/camelot.webp +0 -0
  25. package/public/oracle-splash/brand/compound.webp +0 -0
  26. package/public/oracle-splash/brand/concrete.webp +0 -0
  27. package/public/oracle-splash/brand/cow.webp +0 -0
  28. package/public/oracle-splash/brand/curve.webp +0 -0
  29. package/public/oracle-splash/brand/derive.webp +0 -0
  30. package/public/oracle-splash/brand/dolomite.webp +0 -0
  31. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  32. package/public/oracle-splash/brand/ekubo.webp +0 -0
  33. package/public/oracle-splash/brand/ethena.webp +0 -0
  34. package/public/oracle-splash/brand/etherfi.webp +0 -0
  35. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  36. package/public/oracle-splash/brand/felix.webp +0 -0
  37. package/public/oracle-splash/brand/fluid.webp +0 -0
  38. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  39. package/public/oracle-splash/brand/folks.webp +0 -0
  40. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  41. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  42. package/public/oracle-splash/brand/gassss.webp +0 -0
  43. package/public/oracle-splash/brand/gmx.webp +0 -0
  44. package/public/oracle-splash/brand/harmonix.webp +0 -0
  45. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  46. package/public/oracle-splash/brand/hlp.webp +0 -0
  47. package/public/oracle-splash/brand/hop.webp +0 -0
  48. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  49. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  50. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  51. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  52. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  53. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  54. package/public/oracle-splash/brand/hypha.webp +0 -0
  55. package/public/oracle-splash/brand/joedex.webp +0 -0
  56. package/public/oracle-splash/brand/jupiter.webp +0 -0
  57. package/public/oracle-splash/brand/kelp.webp +0 -0
  58. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  59. package/public/oracle-splash/brand/kmhype.webp +0 -0
  60. package/public/oracle-splash/brand/kona.webp +0 -0
  61. package/public/oracle-splash/brand/konalend.webp +0 -0
  62. package/public/oracle-splash/brand/lfj.webp +0 -0
  63. package/public/oracle-splash/brand/lido.webp +0 -0
  64. package/public/oracle-splash/brand/lifi.webp +0 -0
  65. package/public/oracle-splash/brand/lighter.webp +0 -0
  66. package/public/oracle-splash/brand/lista.webp +0 -0
  67. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  68. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  69. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  70. package/public/oracle-splash/brand/magiceden.webp +0 -0
  71. package/public/oracle-splash/brand/mempool.png +0 -0
  72. package/public/oracle-splash/brand/meteora.webp +0 -0
  73. package/public/oracle-splash/brand/morpho.webp +0 -0
  74. package/public/oracle-splash/brand/myriad.webp +0 -0
  75. package/public/oracle-splash/brand/noxa.webp +0 -0
  76. package/public/oracle-splash/brand/odos.webp +0 -0
  77. package/public/oracle-splash/brand/oneinch.webp +0 -0
  78. package/public/oracle-splash/brand/openbook.webp +0 -0
  79. package/public/oracle-splash/brand/opensea.webp +0 -0
  80. package/public/oracle-splash/brand/orca.webp +0 -0
  81. package/public/oracle-splash/brand/ordinals.png +0 -0
  82. package/public/oracle-splash/brand/ostium.webp +0 -0
  83. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  84. package/public/oracle-splash/brand/pendle.webp +0 -0
  85. package/public/oracle-splash/brand/perena.webp +0 -0
  86. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  87. package/public/oracle-splash/brand/phoenix.webp +0 -0
  88. package/public/oracle-splash/brand/polymarket.webp +0 -0
  89. package/public/oracle-splash/brand/polynomial.webp +0 -0
  90. package/public/oracle-splash/brand/projectx.webp +0 -0
  91. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  92. package/public/oracle-splash/brand/quickswap.webp +0 -0
  93. package/public/oracle-splash/brand/rain.webp +0 -0
  94. package/public/oracle-splash/brand/raydium.webp +0 -0
  95. package/public/oracle-splash/brand/relay.webp +0 -0
  96. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  97. package/public/oracle-splash/brand/saber.webp +0 -0
  98. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  99. package/public/oracle-splash/brand/sanctum.webp +0 -0
  100. package/public/oracle-splash/brand/satflow.png +0 -0
  101. package/public/oracle-splash/brand/sierra.webp +0 -0
  102. package/public/oracle-splash/brand/sky.webp +0 -0
  103. package/public/oracle-splash/brand/solv.webp +0 -0
  104. package/public/oracle-splash/brand/spark.webp +0 -0
  105. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  106. package/public/oracle-splash/brand/sphere.webp +0 -0
  107. package/public/oracle-splash/brand/ssv.webp +0 -0
  108. package/public/oracle-splash/brand/stabble.webp +0 -0
  109. package/public/oracle-splash/brand/stableswap.webp +0 -0
  110. package/public/oracle-splash/brand/stakewise.webp +0 -0
  111. package/public/oracle-splash/brand/stargate.webp +0 -0
  112. package/public/oracle-splash/brand/sthype.webp +0 -0
  113. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  114. package/public/oracle-splash/brand/unisat.png +0 -0
  115. package/public/oracle-splash/brand/uniswap.webp +0 -0
  116. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  117. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  118. package/public/oracle-splash/brand/unit.webp +0 -0
  119. package/public/oracle-splash/brand/velodrome.webp +0 -0
  120. package/public/oracle-splash/brand/velora.webp +0 -0
  121. package/public/oracle-splash/brand/venus.webp +0 -0
  122. package/public/oracle-splash/brand/wbeth.webp +0 -0
  123. package/public/oracle-splash/brand/xsy.webp +0 -0
  124. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  125. package/public/oracle-splash/brand/zerobase.webp +0 -0
  126. package/public/oracle-splash/brand/zerox.webp +0 -0
  127. package/public/oracle-splash/index.html +236 -169
  128. package/scripts/check-doc-drift.mjs +11 -0
  129. package/scripts/e2e-solana-bitcoin.mjs +1 -1
  130. package/scripts/secret-scan.mjs +1 -1
  131. package/src/action-receipts.mjs +108 -11
  132. package/src/cli/commands/data.mjs +3 -1
  133. package/src/cli/commands/doctor.mjs +11 -1
  134. package/src/data/catalog.mjs +38 -7
  135. package/src/data/desk-data.mjs +12 -0
  136. package/src/data/providers/evm-rpc.mjs +19 -16
  137. package/src/data/providers/jupiter-venues.mjs +119 -0
  138. package/src/data/providers/jupiter.mjs +132 -0
  139. package/src/data/providers/magiceden-sol.mjs +13 -0
  140. package/src/data/providers/morpho.mjs +6 -2
  141. package/src/data/providers/pendle.mjs +3 -2
  142. package/src/data/providers/satflow.mjs +4 -1
  143. package/src/data/providers/signed-material-guard.mjs +108 -0
  144. package/src/data/providers/uniswap-v3.mjs +34 -5
  145. package/src/data/providers/uniswap-v4.mjs +414 -0
  146. package/src/prepare-envelope.mjs +22 -4
  147. package/src/router/prepare-route.mjs +17 -0
  148. package/src/router/route-sources.mjs +35 -0
@@ -143,7 +143,8 @@ main{position:relative;z-index:2;padding-top:84px}
143
143
  background:linear-gradient(180deg, rgba(124,196,255,.65), transparent);
144
144
  transform-origin:50% 0;animation:drop-line 2.8s var(--ease) infinite;
145
145
  }
146
- .home-inner{max-width:min(1100px,100%);width:100%;margin:0 auto;position:relative;display:flex;flex-direction:column;align-items:center}
146
+ .home-inner{max-width:min(920px,100%);width:100%;margin:0 auto;position:relative}
147
+ .hero-primary{min-width:0;display:flex;flex-direction:column;align-items:center}
147
148
  .home-kicker{
148
149
  font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);
149
150
  margin-bottom:6px;position:relative;z-index:3;
@@ -192,7 +193,7 @@ main{position:relative;z-index:2;padding-top:84px}
192
193
  .hero-orb .orbit-dot{position:absolute;width:9px;height:9px;border-radius:50%;background:radial-gradient(circle at 38% 34%, #fff, var(--blue2) 55%, rgba(124,196,255,.5));box-shadow:0 0 22px rgba(167,216,255,.95), 0 0 44px rgba(124,196,255,.4);left:calc(50% - 4.5px);top:calc(50% - 4.5px);transform-style:preserve-3d;animation:orbit-travel 14s linear infinite}
193
194
  .home-title{
194
195
  position:relative;z-index:2;
195
- font-family:var(--display);font-weight:300;font-size:clamp(96px,17vw,230px);line-height:.9;letter-spacing:-.045em;
196
+ font-family:var(--display);font-weight:300;font-size:clamp(72px,10vw,150px);line-height:.9;letter-spacing:-.045em;
196
197
  text-transform:uppercase;color:var(--ink);
197
198
  text-shadow:0 2px 30px rgba(0,0,0,.6);
198
199
  }
@@ -391,6 +392,41 @@ main{position:relative;z-index:2;padding-top:84px}
391
392
  .moat-card h3{font-family:var(--display);font-weight:400;font-size:clamp(20px,2.2vw,26px)}
392
393
  .moat-card p{color:#C9DAEC;font-size:15px;line-height:1.55;max-width:44ch}
393
394
  @media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
395
+
396
+ .strategy-surface{
397
+ margin-top:clamp(30px,5vw,52px);border:1px solid var(--line);border-radius:20px;overflow:hidden;
398
+ background:linear-gradient(145deg,rgba(124,196,255,.07),rgba(17,25,37,.92) 40%,rgba(11,16,24,.98));
399
+ }
400
+ .strategy-head{display:flex;align-items:end;justify-content:space-between;gap:20px;padding:clamp(22px,3vw,34px);border-bottom:1px solid var(--line)}
401
+ .strategy-kicker{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
402
+ .strategy-head h3{font-family:var(--display);font-weight:400;font-size:clamp(28px,4vw,42px);line-height:1.05;margin-top:8px}
403
+ .strategy-head p{max-width:50ch;color:#C9DAEC;font-size:14px;line-height:1.6}
404
+ .strategy-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;background:var(--line)}
405
+ .strategy-card{min-height:205px;padding:clamp(20px,2.6vw,28px);background:rgba(11,16,24,.96);display:flex;flex-direction:column;gap:11px}
406
+ .strategy-card .mode{font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue2)}
407
+ .strategy-card h4{font-family:var(--display);font-weight:400;font-size:clamp(23px,2.5vw,30px)}
408
+ .strategy-card p{color:#C9DAEC;font-size:14px;line-height:1.6}
409
+ .strategy-posture{padding:14px clamp(20px,3vw,34px);border-top:1px solid var(--line);font-family:var(--mono);font-size:9px;line-height:1.6;letter-spacing:.11em;text-transform:uppercase;color:var(--mute)}
410
+ .strategy-posture b{color:var(--blue2);font-weight:500}
411
+ @media (max-width:1180px){.strategy-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
412
+ @media (max-width:980px){.strategy-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.strategy-head{align-items:start;flex-direction:column}}
413
+ @media (max-width:620px){.strategy-grid{grid-template-columns:1fr}.strategy-card{min-height:0}}
414
+
415
+ /* actual Oracle CLI */
416
+ .convert-grid{display:grid;grid-template-columns:1fr;gap:clamp(18px,3vw,28px);align-items:stretch;margin-top:8px}
417
+ .convert-copy{display:flex;flex-direction:column;gap:14px;text-align:left;max-width:780px}
418
+ .convert-copy h3{font-family:var(--display);font-weight:400;font-size:clamp(26px,3vw,34px);line-height:1.1}
419
+ .convert-copy p{color:#C9DAEC;font-size:15px;line-height:1.65;max-width:54ch}
420
+ .convert-pills{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
421
+ .convert-pills span{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;border:1px solid rgba(124,196,255,.28);border-radius:999px;padding:8px 12px;color:var(--blue2)}
422
+ .platform-beta{display:inline-flex;align-items:center;gap:10px;width:max-content;max-width:100%;font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--cool)}
423
+ .platform-beta b{font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:#071018;background:var(--blue2);border-radius:999px;padding:5px 8px}
424
+ .cli-frame{border:1px solid var(--line);border-radius:16px;overflow:hidden;background:#0d1420;box-shadow:0 24px 60px rgba(0,0,0,.35)}
425
+ .cli-frame img{display:block;width:100%;height:auto}
426
+ .cli-cap{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-top:10px;text-align:left}
427
+ .cli-code{margin-top:14px;padding:14px 16px;border-radius:12px;border:1px solid var(--line);background:rgba(17,25,37,.9);font-family:var(--mono);font-size:12px;line-height:1.55;color:var(--cool);overflow-x:auto;text-align:left}
428
+ .cli-code b{color:var(--blue2);font-weight:500}
429
+
394
430
  .evolve-rail{
395
431
  display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
396
432
  padding:14px 16px 4px;
@@ -498,8 +534,8 @@ main{position:relative;z-index:2;padding-top:84px}
498
534
  .marquee{overflow:hidden;white-space:nowrap;mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
499
535
  .marquee:hover .track{animation-play-state:paused}
500
536
  .marquee + .marquee{border-top:1px solid rgba(124,196,255,.08)}
501
- .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll 240s linear infinite;will-change:transform;transform:translate3d(0,0,0);backface-visibility:hidden;perspective:1000px}
502
- .marquee.rev .track{animation-direction:reverse;animation-duration:255s}
537
+ .track{display:inline-flex;gap:26px;padding:12px 0;animation:scroll var(--marquee-duration,240s) linear infinite;will-change:transform;transform:translate3d(0,0,0);backface-visibility:hidden;perspective:1000px}
538
+ .marquee.rev .track{animation-direction:reverse}
503
539
  a.chip{text-decoration:none;color:inherit}
504
540
  .chip{
505
541
  display:inline-flex;align-items:center;gap:10px;
@@ -516,9 +552,6 @@ a.chip:hover{border-color:rgba(124,196,255,.3);background:rgba(21,32,49,.6);tran
516
552
  .chip img.wm.mono{filter:brightness(0) invert(1)}
517
553
 
518
554
  .chip .wordmark{font-family:var(--proto-font,var(--sans));font-weight:var(--proto-weight,750);font-style:var(--proto-style,normal);text-transform:var(--proto-transform,none);letter-spacing:var(--proto-track,-.025em);line-height:1.2}
519
- .chip .cap{font-family:var(--mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);padding-left:8px;border-left:1px solid rgba(124,196,255,.14)}
520
- .chip .cap.t4{color:var(--blue)}
521
- .chip .cap.t3{color:var(--cool)}
522
555
  .proto-uniswap{--proto-font:"Inter",var(--sans);--proto-color:#ff4dcb;--proto-weight:850}
523
556
  .proto-hyperliquid{--proto-font:var(--display);--proto-style:italic;--proto-color:#50d2c1;--proto-weight:500;--proto-track:.01em}
524
557
  .proto-polymarket{--proto-font:"Manrope",var(--sans);--proto-color:#7aa7ff;--proto-weight:800;--proto-track:-.035em}
@@ -572,6 +605,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
572
605
  .js .rv.done{transform:none;will-change:auto}
573
606
 
574
607
  @media (max-width:960px){
608
+ .home-inner{max-width:760px}
575
609
  .hero-stage{min-height:clamp(300px,44vh,460px)}.home-title{font-size:clamp(80px,20vw,150px)}
576
610
  .nav-chip{display:none}
577
611
  .nav-links .hide-sm{display:none}
@@ -683,7 +717,9 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
683
717
  </span>
684
718
  oracle</a>
685
719
  <nav class="nav-links" aria-label="Primary">
686
- <a class="hide-sm" href="#orchestration">How it works</a>
720
+ <a class="hide-sm" href="#cli">CLI</a>
721
+ <a class="hide-sm" href="#orchestration">Profiles</a>
722
+ <a class="hide-sm" href="#strategies">Strategies</a>
687
723
  <a class="hide-sm" href="#chains">Chains</a>
688
724
  </nav>
689
725
  </header>
@@ -694,37 +730,69 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
694
730
 
695
731
  <section class="home" id="home">
696
732
  <div class="home-inner">
697
- <div class="hero-stage">
698
- <div class="hero-art" aria-hidden="true">
699
- <video id="orb-vid" muted loop playsinline preload="none" hidden>
700
- <source src="assets/hero/orb.webm" type="video/webm">
701
- </video>
702
- <div class="hero-orb" id="hero-orb">
703
- <span class="lat l1"></span><span class="lat l2"></span><span class="lat l3"></span><span class="lat l4"></span>
704
- <span class="par p1"></span><span class="par p2"></span><span class="par p3"></span>
705
- <span class="eq"></span>
706
- <span class="core-glow"></span>
707
- <span class="orbit-dot"></span>
733
+ <div class="hero-primary">
734
+ <div class="hero-stage">
735
+ <div class="hero-art" aria-hidden="true">
736
+ <video id="orb-vid" muted loop playsinline preload="none" hidden>
737
+ <source src="assets/hero/orb.webm" type="video/webm">
738
+ </video>
739
+ <div class="hero-orb" id="hero-orb">
740
+ <span class="lat l1"></span><span class="lat l2"></span><span class="lat l3"></span><span class="lat l4"></span>
741
+ <span class="par p1"></span><span class="par p2"></span><span class="par p3"></span>
742
+ <span class="eq"></span>
743
+ <span class="core-glow"></span>
744
+ <span class="orbit-dot"></span>
745
+ </div>
746
+ </div>
747
+ <div class="hero-lockup" id="hero-title">
748
+ <h1 class="home-title">OR<em>ACLE</em></h1>
708
749
  </div>
709
750
  </div>
710
- <div class="hero-lockup" id="hero-title">
711
- <h1 class="home-title">OR<em>ACLE</em></h1>
751
+ <div class="home-copy">
752
+ <p class="home-kicker">self-custody agent control</p>
753
+ <p>One control plane for Hyperliquid, Polymarket, EVM, Bitcoin, Solana, Stable, Robinhood Chain, and new protocol builds. Cross-chain research, trade, protocol interactions, NFT listing and buying. The all-in-one crypto agent. The future is agentic.</p>
754
+ <div class="home-actions">
755
+ <a class="enter-cta" href="#cli">See the CLI</a>
756
+ <a class="enter-cta" href="#orchestration" style="margin-left:10px;opacity:.85">See profiles</a>
757
+ </div>
712
758
  </div>
713
759
  </div>
714
- <div class="home-copy">
715
- <p class="home-kicker">self-custody agent control</p>
716
- <p>One control plane for Hyperliquid, Polymarket, EVM, Bitcoin, Solana, Stable, Robinhood Chain, and new protocol builds. Cross-chain research, trade, protocol interactions, NFT listing and buying. The all-in-one crypto agent. The future is agentic.</p>
717
- <div class="home-actions">
718
- <a class="enter-cta" href="#orchestration">Enter oracle</a>
760
+ </div>
761
+ </section>
762
+
763
+ <section class="section cli-section" id="cli">
764
+ <p class="section-label rv">Oracle CLI</p>
765
+ <h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
766
+ <p class="section-lede rv">The real Oracle shell, isolated from desktop chrome. Pin the active surface with <code style="color:var(--blue2)">/chain hyperliquid</code>, switch models with <code style="color:var(--blue2)">/model</code>, then ask naturally.</p>
767
+ <div class="convert-grid rv">
768
+ <div>
769
+ <figure class="cli-frame">
770
+ <img src="assets/cli-chain-hyperliquid.jpg?v=cli-visible" alt="Oracle CLI selecting Hyperliquid with the /chain hyperliquid command" width="1600" height="900" loading="eager" fetchpriority="high" />
771
+ </figure>
772
+ <p class="cli-cap">actual oracle shell // /chain hyperliquid</p>
773
+ </div>
774
+ <div class="convert-copy">
775
+ <h3>The actual Oracle CLI</h3>
776
+ <p>The active chain follows each read, quote, prepare, and bounded execution path.</p>
777
+ <div class="convert-pills">
778
+ <span>HyperCore + HyperEVM</span>
779
+ <span>multichain routing</span>
780
+ <span>self-custody</span>
781
+ </div>
782
+ <p class="platform-beta"><b>Beta</b> Linux, Windows, and macOS apps are in beta.</p>
783
+ <div class="cli-code">
784
+ <div><b>oracle ›</b> /chain hyperliquid</div>
785
+ <div><b>oracle ›</b> /chain show</div>
786
+ <div><b>oracle ›</b> what can you do on hyperliquid?</div>
719
787
  </div>
720
788
  </div>
721
789
  </div>
722
790
  </section>
723
791
 
724
792
  <section class="section" id="orchestration">
725
- <p class="section-label rv">How it works</p>
793
+ <p class="section-label rv">Profiles</p>
726
794
  <h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
727
- <p class="section-lede rv">Not one bot. A mesh with profile routing via Hermes: Input / Command hits the oracle control plane, then fans out across venue profiles, multi-chain EVM, Bitcoin, Solana, and a protocol builder. Any MCP harness can drive a single agent.</p>
795
+ <p class="section-lede rv">Input / Command hits the Oracle control plane, then routes across venue profiles, multi-chain EVM, Bitcoin, Solana, and the protocol builder. Any MCP harness can drive a single agent.</p>
728
796
 
729
797
  <div class="graph-shell rv">
730
798
  <div class="graph-top">
@@ -737,98 +805,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
737
805
  <span class="evolve-pill on">more chains</span>
738
806
  </div>
739
807
 
740
- <div class="venue-rail-head">solana venues routed · <b id="sol-count">101</b> programs verified on-chain · 88 venues</div>
741
- <div class="evolve-rail venue-rail" id="sol-venue-rail">
742
- <span class="evolve-pill on">1DEX</span>
743
- <span class="evolve-pill on">Aldrin</span>
744
- <span class="evolve-pill on">AlphaQ</span>
745
- <span class="evolve-pill on">Aquifer</span>
746
- <span class="evolve-pill on">BinaryFi</span>
747
- <span class="evolve-pill on">BisonFi</span>
748
- <span class="evolve-pill on">Bonkswap</span>
749
- <span class="evolve-pill on">Boop.fun</span>
750
- <span class="evolve-pill on">Byreal</span>
751
- <span class="evolve-pill on">Carrot</span>
752
- <span class="evolve-pill on">Crema</span>
753
- <span class="evolve-pill on">Cropper</span>
754
- <span class="evolve-pill on">DefiTuna</span>
755
- <span class="evolve-pill on">Denali</span>
756
- <span class="evolve-pill on">Deriverse</span>
757
- <span class="evolve-pill on">DexLab</span>
758
- <span class="evolve-pill on">Dynamic Bonding Curve</span>
759
- <span class="evolve-pill on">Flint</span>
760
- <span class="evolve-pill on">Flux</span>
761
- <span class="evolve-pill on">FluxBeam</span>
762
- <span class="evolve-pill on">GatorSwap</span>
763
- <span class="evolve-pill on">Gavel</span>
764
- <span class="evolve-pill on">GoonFi</span>
765
- <span class="evolve-pill on">GooseFX GAMMA</span>
766
- <span class="evolve-pill on">Guacswap</span>
767
- <span class="evolve-pill on">Hadron</span>
768
- <span class="evolve-pill on">Heaven</span>
769
- <span class="evolve-pill on">Helium Network</span>
770
- <span class="evolve-pill on">Huma</span>
771
- <span class="evolve-pill on">HumidiFi</span>
772
- <span class="evolve-pill on">Hylo Exchange</span>
773
- <span class="evolve-pill on">Hylo Stability</span>
774
- <span class="evolve-pill on">Invariant</span>
775
- <span class="evolve-pill on">Jupiter Lend</span>
776
- <span class="evolve-pill on">JupiterRfqV2</span>
777
- <span class="evolve-pill on">JupLend</span>
778
- <span class="evolve-pill on">Kipseli</span>
779
- <span class="evolve-pill on">LemmingsFi</span>
780
- <span class="evolve-pill on">M Swap</span>
781
- <span class="evolve-pill on">Manifest</span>
782
- <span class="evolve-pill on">Mercurial</span>
783
- <span class="evolve-pill on">MetaDAO</span>
784
- <span class="evolve-pill on">Meteora</span>
785
- <span class="evolve-pill on">Meteora DAMM</span>
786
- <span class="evolve-pill on">Metric</span>
787
- <span class="evolve-pill on">Moonit</span>
788
- <span class="evolve-pill on">Obric</span>
789
- <span class="evolve-pill on">Obsidian</span>
790
- <span class="evolve-pill on">Omnipair</span>
791
- <span class="evolve-pill on">OpenBook</span>
792
- <span class="evolve-pill on">Orca</span>
793
- <span class="evolve-pill on">PancakeSwap</span>
794
- <span class="evolve-pill on">Penguin</span>
795
- <span class="evolve-pill on">Perena</span>
796
- <span class="evolve-pill on">Perena Star</span>
797
- <span class="evolve-pill on">Perps</span>
798
- <span class="evolve-pill on">Phoenix</span>
799
- <span class="evolve-pill on">Pump.fun</span>
800
- <span class="evolve-pill on">Quantum</span>
801
- <span class="evolve-pill on">Raydium</span>
802
- <span class="evolve-pill on">Riptide</span>
803
- <span class="evolve-pill on">RunnerRodeo</span>
804
- <span class="evolve-pill on">Saber</span>
805
- <span class="evolve-pill on">Saber (Decimals)</span>
806
- <span class="evolve-pill on">Sanctum</span>
807
- <span class="evolve-pill on">Sanctum Infinity</span>
808
- <span class="evolve-pill on">Saros</span>
809
- <span class="evolve-pill on">Scale</span>
810
- <span class="evolve-pill on">Scale Vmm</span>
811
- <span class="evolve-pill on">Scorch</span>
812
- <span class="evolve-pill on">Solayer</span>
813
- <span class="evolve-pill on">SolFi</span>
814
- <span class="evolve-pill on">Stabble</span>
815
- <span class="evolve-pill on">Stabble Stable Swap</span>
816
- <span class="evolve-pill on">Stabble Weighted Swap</span>
817
- <span class="evolve-pill on">StepN</span>
818
- <span class="evolve-pill on">TaurusFi</span>
819
- <span class="evolve-pill on">TesseraV</span>
820
- <span class="evolve-pill on">Token Swap</span>
821
- <span class="evolve-pill on">Trends</span>
822
- <span class="evolve-pill on">VaultLiquidUnstake</span>
823
- <span class="evolve-pill on">Virtuals</span>
824
- <span class="evolve-pill on">Voltr</span>
825
- <span class="evolve-pill on">WhaleStreet</span>
826
- <span class="evolve-pill on">Whirlpool</span>
827
- <span class="evolve-pill on">Woofi</span>
828
- <span class="evolve-pill on">XOrca</span>
829
- <span class="evolve-pill on">ZeroFi</span>
830
- </div>
831
-
832
808
  <div class="graph-canvas">
833
809
  <div class="orch" aria-label="Oracle multi-profile graph">
834
810
  <div class="row">
@@ -901,7 +877,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
901
877
  <div class="tag">profile</div>
902
878
  <div class="name">solana agent</div>
903
879
  <div class="sub">jup · nfts · dexs</div>
904
- <div class="chains"><span class="ch">Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=24&h=24" alt="" loading="lazy"></span><span class="ch" id="sol-venue-count">88 venues routed</span></div>
880
+ <div class="chains"><span class="ch">Solana <img src="https://icons.llamao.fi/icons/chains/rsz_solana?w=24&h=24" alt="" loading="lazy"></span></div>
905
881
  </div>
906
882
  <div class="node route p-btc">
907
883
  <div class="tag">profile</div>
@@ -921,12 +897,6 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
921
897
  <div class="sub">launches · memecoins</div>
922
898
  <div class="chains"><span class="ch">Stable <img src="https://icons.llamao.fi/icons/chains/rsz_stable?w=24&h=24" alt="" loading="lazy"></span></div>
923
899
  </div>
924
- <div class="node add">
925
- <div class="tag">open slot</div>
926
- <div class="name">+ add agent</div>
927
- <div class="sub">new chain · new venue · your rules</div>
928
- <div class="chains" style="margin-top:12px;font-family:var(--mono);font-size:10px;color:var(--blue2)">sits beside stable · same custody</div>
929
- </div>
930
900
  </div>
931
901
 
932
902
  <div class="wires funnel" aria-hidden="true">
@@ -1047,20 +1017,10 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1047
1017
  <span class="chip-s">unsigned deploy</span>
1048
1018
  </div>
1049
1019
  </article>
1050
- <article class="route-card p-add">
1051
- <div class="where">+ add agent →</div>
1052
- <h3>Next chain</h3>
1053
- <p>Drop in another profile for a new chain or venue. Same custody model, your wallet, your limits, your revoke.</p>
1054
- <div class="chips">
1055
- <span class="chip-s">custom profile</span>
1056
- <span class="chip-s">more chains</span>
1057
- <span class="chip-s">same custody</span>
1058
- </div>
1059
- </article>
1060
1020
  </div>
1061
1021
 
1062
1022
  <div class="why-band">
1063
- <p>The model proposes. Policy bounds. You own signatures. Multi-profile desks, not one omniscient chatbot. Vaults, perps, bridges, and protocol scaffolds, not just swaps. Empty allowlists refuse everything until you configure them.</p>
1023
+ <p>The model proposes. Policy bounds. You own signatures. Multi-profile desks route each request to the right surface. Vaults, perps, bridges, and protocol scaffolds, not just swaps. Empty allowlists refuse everything until you configure them.</p>
1064
1024
  </div>
1065
1025
  </div>
1066
1026
 
@@ -1096,7 +1056,45 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1096
1056
  <p>A fresh install signs nothing. Every lane refuses while its allowlists are empty, so nothing moves until you set the bounds.</p>
1097
1057
  </article>
1098
1058
  </div>
1099
- </section>
1059
+
1060
+ <div class="strategy-surface rv" id="strategies" aria-labelledby="strategies-title">
1061
+ <div class="strategy-head">
1062
+ <div>
1063
+ <div class="strategy-kicker">Agentic strategies</div>
1064
+ <h3 id="strategies-title">Move liquidity. Bound the risk.</h3>
1065
+ </div>
1066
+ <p>Oracle reads the position, models the route and costs, then prepares only the steps the selected lane can actually support.</p>
1067
+ </div>
1068
+ <div class="strategy-grid">
1069
+ <article class="strategy-card">
1070
+ <div class="mode">read · model · prepare</div>
1071
+ <h4>LP rebalancing</h4>
1072
+ <p>Read concentrated-liquidity positions, model new ranges and fee drag, then prepare collect, swap and redeploy steps on supported venues. You sign each step.</p>
1073
+ </article>
1074
+ <article class="strategy-card">
1075
+ <div class="mode">monitor · shadow · simulate</div>
1076
+ <h4>MEV</h4>
1077
+ <p>Monitor cross-venue divergence and simulate net edge after gas, slippage and lender costs. Public mode is shadow analysis, not autonomous execution.</p>
1078
+ </article>
1079
+ <article class="strategy-card">
1080
+ <div class="mode">simulate · policy-check</div>
1081
+ <h4>Flash loans</h4>
1082
+ <p>Build bounded atomic loan routes and test premium, calldata, gas and minimum-profit gates. Public live execution remains disabled.</p>
1083
+ </article>
1084
+ <article class="strategy-card">
1085
+ <div class="mode">read · quote · prepare</div>
1086
+ <h4>Staking</h4>
1087
+ <p>Compare validators, staking vaults, rewards and unlock periods, then prepare supported stake, withdraw and delegate actions for your signature.</p>
1088
+ </article>
1089
+ <article class="strategy-card">
1090
+ <div class="mode">discover · compare · prepare</div>
1091
+ <h4>Yield</h4>
1092
+ <p>Rank lending, staking, vault and LP opportunities by net APY after fees, liquidity, lockups and smart-contract risk, then prepare supported deposits or migrations for your signature.</p>
1093
+ </article>
1094
+ </div>
1095
+ <div class="strategy-posture"><b>Public posture:</b> research, simulation and unsigned preparation. MEV and flash-loan broadcast stays off; supported staking, LP and yield actions require the user wallet to sign.</div>
1096
+ </div>
1097
+ </section>
1100
1098
 
1101
1099
  <section class="section" id="chains">
1102
1100
  <p class="section-label rv">Chains</p>
@@ -1115,7 +1113,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1115
1113
  </div>
1116
1114
  </div>
1117
1115
  <div class="venues rv">
1118
- <div class="venues-head"><span>protocols // venues</span><span><b>exact proven rungs</b> · read + quote does not mean live submit</span></div>
1116
+ <div class="venues-head"><span>protocols // venues</span></div>
1119
1117
  <div class="marquee"><div class="track" id="proto-track-a"></div></div>
1120
1118
  <div class="marquee rev"><div class="track" id="proto-track-b"></div></div>
1121
1119
  </div>
@@ -1187,15 +1185,15 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
1187
1185
  var WM = "assets/wordmarks/";
1188
1186
  var BRAND = "brand/";
1189
1187
  var PROTOS_A = [
1190
- { n: "Uniswap V3", img: "uniswap", cap: "read + quote + prepare + policy", u: "https://app.uniswap.org/" },
1191
- { n: "Aerodrome Slipstream", img: "aerodrome", cap: "read + quote + prepare", u: "https://aerodrome.finance/" },
1192
- { n: "Pancake V3", img: "pancakeswap", cap: "read + quote", u: "https://pancakeswap.finance/swap" },
1188
+ { n: "Uniswap V3", wm: "uniswap.svg", cap: "read + quote + prepare + policy", u: "https://app.uniswap.org/" },
1189
+ { n: "Aerodrome Slipstream", wm: "aerodrome.svg", cap: "read + quote + prepare", u: "https://aerodrome.finance/" },
1190
+ { n: "Pancake V3", wm: "pancakeswap.svg", cap: "read + quote", u: "https://pancakeswap.finance/swap" },
1193
1191
  { n: "LFJ Liquidity Book", img: "lfj", cap: "read + quote", u: "https://lfj.gg/avalanche/trade" },
1194
1192
  { n: "Curve RouterNG", img: "curve", cap: "read + quote + prepare + policy", u: "https://curve.finance" },
1195
1193
  { n: "Pendle Router", img: "pendle", cap: "read + quote + prepare + policy", u: "https://pendle.finance/" },
1196
- { n: "Morpho vaults", img: "morpho", cap: "read + deposit prepare", u: "https://app.morpho.org/" },
1194
+ { n: "Morpho vaults", wm: "morpho.svg", cap: "read + deposit prepare", u: "https://app.morpho.org/" },
1197
1195
  { n: "Lido stETH", img: "lido", cap: "read + stake prepare + policy", u: "https://lido.fi/" },
1198
- { n: "Kinetiq kHYPE", img: "kinetiq", cap: "read + quote + stake prepare + policy", u: "https://kinetiq.xyz/stake" },
1196
+ { n: "Kinetiq kHYPE", wm: "kinetiq.svg", tall: 1, cap: "read + quote + stake prepare + policy", u: "https://kinetiq.xyz/stake" },
1199
1197
  { n: "Project X", img: "projectx", cap: "read", u: "https://www.prjx.com" },
1200
1198
  { n: "Uniswap V4", img: "uniswapv4", cap: "read + quote", u: "https://app.uniswap.org/" },
1201
1199
  { n: "Aborean CL", img: "aborean", cap: "read + quote", u: "https://aborean.finance/" },
@@ -1219,9 +1217,9 @@ var BRAND = "brand/";
1219
1217
  { n: "Pharaoh V3", img: "pharaoh", cap: "read + quote", u: "https://www.phar.gg/" },
1220
1218
  { n: "Polymarket", img: "polymarket", cap: "read", u: "https://polymarket.com/" },
1221
1219
  { n: "XSY", img: "xsy", cap: "read", u: "https://xsy.fi" },
1222
- { n: "Balancer V2", img: "balancer", cap: "read + quote", u: "https://balancer.fi/" },
1220
+ { n: "Balancer V2", wm: "balancer.svg", cap: "read + quote", u: "https://balancer.fi/" },
1223
1221
  { n: "Harmonix", img: "harmonix", cap: "read + quote", u: "https://app.harmonix.fi/" },
1224
- { n: "Hyperliquid HLP", img: "hyperliquidhpl", cap: "read", u: "https://app.hyperliquid.xyz" },
1222
+ { n: "Hyperliquid HLP", wm: "hyperliquid.svg", cap: "read", u: "https://app.hyperliquid.xyz" },
1225
1223
  { n: "stHYPE + wstHYPE", img: "sthype", cap: "read + quote", u: "https://app.valantis.xyz" },
1226
1224
  { n: "Arcus Perps", img: "arcus", cap: "read", u: "https://arcus.xyz/" },
1227
1225
  { n: "NOXA Fun", img: "noxa", cap: "read + quote", u: "https://fun.noxa.eth.limo/" },
@@ -1238,17 +1236,17 @@ var BRAND = "brand/";
1238
1236
  { n: "Hypha", img: "hypha", cap: "read + quote", u: "https://www.hypha.sh/" },
1239
1237
  { n: "40 Acres", img: "fortyacres", cap: "read + quote", u: "https://www.40acres.finance/" },
1240
1238
  { n: "Hyperbeat", img: "hyperbeat", cap: "read + quote", u: "https://app.hyperbeat.org/" },
1241
- { n: "GMX V2", img: "gmx", cap: "read + order attestation", u: "https://gmx.io/" },
1242
- { n: "Relay", img: "relay", cap: "route source", u: "https://relay.link/" },
1243
- { n: "Odos", img: "odos", cap: "read + route source", u: "https://app.odos.xyz" },
1244
- { n: "Jupiter", img: "jupiter", cap: "solana route source", u: "https://jup.ag/" },
1245
- { n: "Stargate", img: "stargate", cap: "read + bridge route", u: "https://stargate.finance/" }
1239
+ { n: "GMX V2", wm: "gmx.svg", cap: "read + order attestation", u: "https://gmx.io/" },
1240
+ { n: "Relay", wm: "relay.svg", cap: "route source", u: "https://relay.link/" },
1241
+ { n: "Odos", wm: "odos.svg", cap: "read + route source", u: "https://app.odos.xyz" },
1242
+ { n: "Jupiter", wm: "jupiter.svg", cap: "solana route source", u: "https://jup.ag/" },
1243
+ { n: "Stargate", wm: "stargate.svg", cap: "read + bridge route", u: "https://stargate.finance/" }
1246
1244
  ];
1247
1245
  var PROTOS_B = [
1248
1246
  { n: "Uniswap V3 LP", img: "uniswap", cap: "preview + mint/collect prepare", u: "https://app.uniswap.org/" },
1249
- { n: "Velodrome V2", img: "velodrome", cap: "read + quote", u: "https://velodrome.finance/" },
1247
+ { n: "Velodrome V2", wm: "velodrome.svg", cap: "read + quote", u: "https://velodrome.finance/" },
1250
1248
  { n: "QuickSwap", img: "quickswap", cap: "read + quote", u: "https://quickswap.exchange/" },
1251
- { n: "HyperSwap V3", img: "hyperswap", cap: "read + quote", u: "https://app.hyperswap.exchange/" },
1249
+ { n: "HyperSwap V3", wm: "hyperswap.svg", cap: "read + quote", u: "https://app.hyperswap.exchange/" },
1252
1250
  { n: "Balancer V3", img: "balancer", cap: "read + quote + prepare + policy", u: "https://balancer.fi/" },
1253
1251
  { n: "Aave V3", img: "aave", cap: "read + supply/withdraw prepare + policy", u: "https://aave.com/" },
1254
1252
  { n: "Morpho Blue", img: "morpho", cap: "read", u: "https://app.morpho.org" },
@@ -1297,8 +1295,8 @@ var PROTOS_B = [
1297
1295
  { n: "Looped Hype", img: "loopedhype", cap: "read + quote", u: "https://www.loopingcollective.org/" },
1298
1296
  { n: "LI.FI", img: "lifi", cap: "read + route source", u: "https://li.fi/" },
1299
1297
  { n: "Velora", img: "velora", cap: "read + route source", u: "https://app.velora.xyz" },
1300
- { n: "CoW Swap", img: "cow", cap: "read + route source", u: "https://cow.fi/" },
1301
- { n: "Across", img: "across", cap: "read + bridge route", u: "https://across.to" }
1298
+ { n: "CoW Swap", wm: "cowswap.svg", cap: "read + route source", u: "https://cow.fi/" },
1299
+ { n: "Across", wm: "across.svg", cap: "read + bridge route", u: "https://across.to" }
1302
1300
  ];
1303
1301
 
1304
1302
  // Equalize optical weight: constant target area, clamped, then width-capped.
@@ -1311,29 +1309,91 @@ var PROTOS_B = [
1311
1309
  img.style.height = h.toFixed(1) + "px";
1312
1310
  }
1313
1311
  function wireMarks(root) {
1314
- root.querySelectorAll("img.wm:not(.tall)").forEach(function (img) {
1315
- if (img.complete && img.naturalWidth) normalizeMark(img);
1316
- else img.addEventListener("load", function () { normalizeMark(img); }, { once: true });
1312
+ root.querySelectorAll("img.wm").forEach(function (img) {
1313
+ if (img.complete) {
1314
+ if (!img.classList.contains("tall") && img.naturalWidth) normalizeMark(img);
1315
+ return;
1316
+ }
1317
+ img.addEventListener("load", function () {
1318
+ if (!img.classList.contains("tall")) normalizeMark(img);
1319
+ syncMarqueeVelocity();
1320
+ }, { once: true });
1321
+ });
1322
+ }
1323
+
1324
+ var MARQUEE_PX_PER_SECOND = 20;
1325
+ var marqueeResizeTimer = 0;
1326
+ function syncMarqueeVelocity() {
1327
+ document.querySelectorAll(".track").forEach(function (track) {
1328
+ var distance = track.scrollWidth / 2;
1329
+ if (distance > 0) {
1330
+ track.style.setProperty("--marquee-duration", Math.max(30, distance / MARQUEE_PX_PER_SECOND).toFixed(2) + "s");
1331
+ }
1317
1332
  });
1318
1333
  }
1319
1334
 
1335
+ function protocolName(name) {
1336
+ var label = name.replace(/\s+(?:DEX\s+)?V\d+(?:\s+LP)?\b/gi, "").trim();
1337
+ var aliases = [
1338
+ [/^Aerodrome\b/i, "Aerodrome"],
1339
+ [/^Pancake(?:Swap)?\b/i, "PancakeSwap"],
1340
+ [/^LFJ\b/i, "LFJ"],
1341
+ [/^Curve\b/i, "Curve"],
1342
+ [/^Pendle\b/i, "Pendle"],
1343
+ [/^Morpho\b/i, "Morpho"],
1344
+ [/^Lido\b/i, "Lido"],
1345
+ [/^Kinetiq\b/i, "Kinetiq"],
1346
+ [/^Aborean\b/i, "Aborean"],
1347
+ [/^Stable Swap\b/i, "Stable"],
1348
+ [/^Ethena\b/i, "Ethena"],
1349
+ [/^Benqi\b/i, "Benqi"],
1350
+ [/^Fluid\b/i, "Fluid"],
1351
+ [/^Lista\b/i, "Lista"],
1352
+ [/^Hyperliquid\b/i, "Hyperliquid"],
1353
+ [/^Arcus\b/i, "Arcus"],
1354
+ [/^NOXA\b/i, "NOXA"],
1355
+ [/^Kona\b/i, "Kona"],
1356
+ [/^Velodrome\b/i, "Velodrome"],
1357
+ [/^SakuraSwap\b/i, "SakuraSwap"],
1358
+ [/^Spark(?:Lend|\b)/i, "Spark"],
1359
+ [/^(?:ether\.fi|EtherFi)\b/i, "EtherFi"],
1360
+ [/^Sky\b/i, "Sky"],
1361
+ [/^Binance\b/i, "Binance"],
1362
+ [/^Avant\b/i, "Avant"],
1363
+ [/^Aster\b/i, "Aster"],
1364
+ [/^Lighter\b/i, "Lighter"],
1365
+ [/^stHYPE \+ wstHYPE$/i, "Valantis"]
1366
+ ];
1367
+ for (var i = 0; i < aliases.length; i++) {
1368
+ if (aliases[i][0].test(label)) return aliases[i][1];
1369
+ }
1370
+ return label;
1371
+ }
1372
+ function uniqueProtocols(list, seen) {
1373
+ return list.filter(function (x) {
1374
+ var label = protocolName(x.n);
1375
+ if (seen[label]) return false;
1376
+ seen[label] = true;
1377
+ return true;
1378
+ });
1379
+ }
1320
1380
  function chipRow(list) {
1321
1381
  var seq = list.concat(list);
1322
1382
  return seq.map(function (x) {
1323
- var tier = /policy/.test(x.cap || "") ? " t4" : /prepare/.test(x.cap || "") ? " t3" : "";
1383
+ var label = protocolName(x.n);
1324
1384
  var body = x.img
1325
- ? '<img class="wm tall" src="' + BRAND + x.img + '.webp" alt="' + x.n + '" decoding="async">' +
1326
- '<span class="wordmark">' + x.n + '</span>' +
1327
- '<span class="cap' + tier + '">' + x.cap + '</span>'
1385
+ ? '<img class="wm tall" src="' + BRAND + x.img + '.webp" alt="' + label + '" decoding="async">' +
1386
+ '<span class="wordmark">' + label + '</span>'
1328
1387
  : x.wm
1329
- ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + (x.mono ? ' mono' : '') + '" src="' + WM + x.wm + '" alt="' + x.n + '" decoding="async">' +
1330
- (x.tall ? '<span class="wordmark">' + x.n + '</span>' : '')
1331
- : '<span class="wordmark">' + x.n + '</span>';
1332
- return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + x.n + '">' + body + '</a>';
1388
+ ? '<img class="' + (x.tall ? 'wm tall' : 'wm') + (x.mono ? ' mono' : '') + '" src="' + WM + x.wm + '" alt="' + label + '" decoding="async">' +
1389
+ (x.tall ? '<span class="wordmark">' + label + '</span>' : '')
1390
+ : '<span class="wordmark">' + label + '</span>';
1391
+ return '<a class="chip wm-chip" href="' + x.u + '" target="_blank" rel="noopener noreferrer" aria-label="' + label + '">' + body + '</a>';
1333
1392
  }).join("");
1334
1393
  }
1335
- document.getElementById("proto-track-a").innerHTML = chipRow(PROTOS_A);
1336
- document.getElementById("proto-track-b").innerHTML = chipRow(PROTOS_B);
1394
+ var visibleProtocols = Object.create(null);
1395
+ document.getElementById("proto-track-a").innerHTML = chipRow(uniqueProtocols(PROTOS_A, visibleProtocols));
1396
+ document.getElementById("proto-track-b").innerHTML = chipRow(uniqueProtocols(PROTOS_B, visibleProtocols));
1337
1397
 
1338
1398
  var LM = "assets/llms/";
1339
1399
  var LLMS = [
@@ -1359,6 +1419,13 @@ var PROTOS_B = [
1359
1419
  wireMarks(document.getElementById("proto-track-a"));
1360
1420
  wireMarks(document.getElementById("proto-track-b"));
1361
1421
  wireMarks(document.getElementById("llm-track"));
1422
+ syncMarqueeVelocity();
1423
+ if (document.fonts && document.fonts.ready) document.fonts.ready.then(syncMarqueeVelocity);
1424
+ window.addEventListener("load", syncMarqueeVelocity);
1425
+ window.addEventListener("resize", function () {
1426
+ clearTimeout(marqueeResizeTimer);
1427
+ marqueeResizeTimer = setTimeout(syncMarqueeVelocity, 120);
1428
+ });
1362
1429
 
1363
1430
  var loader = document.getElementById("loader");
1364
1431
  var fill = document.getElementById("loader-fill");
@@ -60,6 +60,17 @@ function checkVersionPins(rel, text) {
60
60
  `${rel}:${i + 1} advertises oracle ${latest[1]} as latest but this package is ${pkg.version}\n ${line.trim().slice(0, 120)}`,
61
61
  );
62
62
  }
63
+ // The 2026-08-03 grok lane found `Source tree: **oracle \`0.5.0\`**` and a
64
+ // `Published npm: **oracle \`0.4.2\`**` line surviving inside a 0.10.0
65
+ // tarball. Both shapes sailed past the two matchers above, so a stranger
66
+ // reading the shipped README saw a version five releases stale. Match any
67
+ // prose that states an oracle version, not just the two blessed prefixes.
68
+ const stated = line.match(/oracle\s+`(\d+\.\d+\.\d+)`/i);
69
+ if (stated && stated[1] !== pkg.version) {
70
+ failures.push(
71
+ `${rel}:${i + 1} states oracle ${stated[1]} but this package is ${pkg.version}\n ${line.trim().slice(0, 120)}`,
72
+ );
73
+ }
63
74
  });
64
75
  }
65
76
 
@@ -9,7 +9,7 @@ import { jupiterQuote, jupiterPrepareSwap, SOL_MINT, USDC_MINT } from "../src/da
9
9
  import { solanaSimulateTransaction } from "../src/data/providers/solana-rpc.mjs";
10
10
  import { magicEdenSolStats, magicEdenSolListings, magicEdenSolPrepareBuy } from "../src/data/providers/magiceden-sol.mjs";
11
11
 
12
- const PROBE_WALLET = process.env.ORACLE_E2E_SOL_PUBKEY || "11111111111111111111111111111111";
12
+ const PROBE_WALLET = process.env.ORACLE_E2E_SOL_PUBKEY || "DtM6A1ivwvFeT14f7ggTAGvpUTZA5LeutV3rLe8wR6U3";
13
13
  const PROBE_BTC = process.env.ORACLE_E2E_BTC_ADDRESS || "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq";
14
14
 
15
15
  const results = [];
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { execFileSync } from "node:child_process";
8
8
 
9
- const ROOT = process.cwd();
9
+ const ROOT = execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd: process.cwd(), encoding: "utf8" }).trim();
10
10
 
11
11
  // Live values that must never appear. Sourced from the environment at scan
12
12
  // time so the scanner itself contains no secrets.