@oracle-agent/oracle 0.1.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 (169) hide show
  1. package/CONTRIBUTING.md +98 -0
  2. package/LICENSE +202 -0
  3. package/README.md +384 -0
  4. package/SECURITY.md +89 -0
  5. package/SETUP.md +235 -0
  6. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  7. package/artifacts/inscription/oracle-was-here.svg +1 -0
  8. package/artifacts/specialist-packs/oracle-full-crypto.json +273 -0
  9. package/bin/desk-server.mjs +438 -0
  10. package/bin/oracle-data-mcp.mjs +603 -0
  11. package/bin/oracle-init.mjs +423 -0
  12. package/bin/oracle-public-server.mjs +36 -0
  13. package/bin/oracle-route.mjs +254 -0
  14. package/bin/oracle-scan.mjs +192 -0
  15. package/docs/adding-a-chain.md +229 -0
  16. package/docs/architecture.md +135 -0
  17. package/docs/profiles.md +132 -0
  18. package/examples/add-a-chain.mjs +65 -0
  19. package/examples/research-a-token.mjs +70 -0
  20. package/package.json +90 -0
  21. package/profiles/_template/SOUL.md +47 -0
  22. package/profiles/_template/profile.json +22 -0
  23. package/profiles/bitcoin-agent/SOUL.md +31 -0
  24. package/profiles/bitcoin-agent/profile.json +32 -0
  25. package/profiles/hyperliquid-agent/SOUL.md +34 -0
  26. package/profiles/hyperliquid-agent/profile.json +37 -0
  27. package/profiles/oracle/SOUL.md +65 -0
  28. package/profiles/oracle/profile.json +35 -0
  29. package/profiles/polymarket-agent/SOUL.md +35 -0
  30. package/profiles/polymarket-agent/profile.json +34 -0
  31. package/profiles/profile.schema.json +90 -0
  32. package/profiles/protocol-builder/SOUL.md +50 -0
  33. package/profiles/protocol-builder/profile.json +37 -0
  34. package/profiles/robinhood-agent/SOUL.md +45 -0
  35. package/profiles/robinhood-agent/profile.json +39 -0
  36. package/profiles/solana-agent/SOUL.md +37 -0
  37. package/profiles/solana-agent/profile.json +37 -0
  38. package/profiles/stable-agent/SOUL.md +43 -0
  39. package/profiles/stable-agent/profile.json +37 -0
  40. package/public/oracle-console/app.js +272 -0
  41. package/public/oracle-console/bitcoin-wallets.js +206 -0
  42. package/public/oracle-console/index.html +91 -0
  43. package/public/oracle-console/styles.css +239 -0
  44. package/public/oracle-splash/index.html +931 -0
  45. package/scripts/build-inscription.py +230 -0
  46. package/scripts/check-test-count.mjs +105 -0
  47. package/scripts/e2e-hl-markets.mjs +21 -0
  48. package/scripts/e2e-hl-perps.mjs +48 -0
  49. package/scripts/e2e-hypercore-staking.mjs +128 -0
  50. package/scripts/e2e-solana-bitcoin.mjs +183 -0
  51. package/scripts/public-api-scan.mjs +23 -0
  52. package/scripts/secret-scan.mjs +181 -0
  53. package/scripts/verify-v3-venues.mjs +192 -0
  54. package/skills/oracle-best-execution/SKILL.md +127 -0
  55. package/skills/oracle-bitcoin/SKILL.md +53 -0
  56. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +59 -0
  57. package/skills/oracle-circuit-breaker/SKILL.md +51 -0
  58. package/skills/oracle-contract-research/SKILL.md +55 -0
  59. package/skills/oracle-desk/SKILL.md +58 -0
  60. package/skills/oracle-dex-launch/SKILL.md +38 -0
  61. package/skills/oracle-grants/SKILL.md +69 -0
  62. package/skills/oracle-hypercore-staking/SKILL.md +57 -0
  63. package/skills/oracle-hyperliquid/SKILL.md +56 -0
  64. package/skills/oracle-meme-token-sniper/SKILL.md +73 -0
  65. package/skills/oracle-nft-gacha-launch/SKILL.md +48 -0
  66. package/skills/oracle-nft-mint-gas-war/SKILL.md +63 -0
  67. package/skills/oracle-polymarket/SKILL.md +60 -0
  68. package/skills/oracle-protocol-builder/SKILL.md +38 -0
  69. package/skills/oracle-protocol-security/SKILL.md +60 -0
  70. package/skills/oracle-public-product/SKILL.md +44 -0
  71. package/skills/oracle-receipts/SKILL.md +52 -0
  72. package/skills/oracle-rfq-tokenized-assets/SKILL.md +69 -0
  73. package/skills/oracle-smart-wallet-scanner/SKILL.md +49 -0
  74. package/skills/oracle-solana/SKILL.md +65 -0
  75. package/skills/oracle-solana-nft/SKILL.md +54 -0
  76. package/skills/oracle-token-research/SKILL.md +67 -0
  77. package/src/agent-auth.mjs +191 -0
  78. package/src/approval-guard.mjs +282 -0
  79. package/src/attestation-secret.mjs +88 -0
  80. package/src/audit-log.mjs +196 -0
  81. package/src/auto-slippage.mjs +378 -0
  82. package/src/capability-posture.mjs +125 -0
  83. package/src/chains.mjs +62 -0
  84. package/src/data/catalog.mjs +495 -0
  85. package/src/data/desk-data.mjs +623 -0
  86. package/src/data/http.mjs +200 -0
  87. package/src/data/provider-endpoint.mjs +94 -0
  88. package/src/data/providers/aerodrome.mjs +244 -0
  89. package/src/data/providers/balancer.mjs +208 -0
  90. package/src/data/providers/bitcoin-esplora.mjs +230 -0
  91. package/src/data/providers/bitcoin-meta.mjs +378 -0
  92. package/src/data/providers/blockscout.mjs +14 -0
  93. package/src/data/providers/bridges.mjs +241 -0
  94. package/src/data/providers/cowswap.mjs +501 -0
  95. package/src/data/providers/curve.mjs +200 -0
  96. package/src/data/providers/defillama.mjs +88 -0
  97. package/src/data/providers/dexscreener.mjs +43 -0
  98. package/src/data/providers/evm-rpc.mjs +203 -0
  99. package/src/data/providers/geckoterminal.mjs +34 -0
  100. package/src/data/providers/gmx.mjs +495 -0
  101. package/src/data/providers/hl-info.mjs +102 -0
  102. package/src/data/providers/hl-markets.mjs +210 -0
  103. package/src/data/providers/hl-perps.mjs +382 -0
  104. package/src/data/providers/hl-staking.mjs +352 -0
  105. package/src/data/providers/hl-ws.mjs +119 -0
  106. package/src/data/providers/hyperevm-dex.mjs +49 -0
  107. package/src/data/providers/jupiter.mjs +182 -0
  108. package/src/data/providers/lifi.mjs +150 -0
  109. package/src/data/providers/magiceden-sol.mjs +355 -0
  110. package/src/data/providers/morpho.mjs +173 -0
  111. package/src/data/providers/odos.mjs +155 -0
  112. package/src/data/providers/oneinch.mjs +173 -0
  113. package/src/data/providers/opensea-multichain.mjs +136 -0
  114. package/src/data/providers/opensea-nft.mjs +99 -0
  115. package/src/data/providers/paraswap.mjs +117 -0
  116. package/src/data/providers/pendle.mjs +187 -0
  117. package/src/data/providers/poly-public.mjs +96 -0
  118. package/src/data/providers/poly-ws.mjs +103 -0
  119. package/src/data/providers/rh-agent.mjs +59 -0
  120. package/src/data/providers/satflow.mjs +336 -0
  121. package/src/data/providers/solana-rpc.mjs +186 -0
  122. package/src/data/providers/uniswap-v3.mjs +303 -0
  123. package/src/data/providers/zerox.mjs +166 -0
  124. package/src/data/public-api-scan.mjs +61 -0
  125. package/src/data/quote-placeholder.mjs +31 -0
  126. package/src/exact-integer.mjs +72 -0
  127. package/src/exec-policy.mjs +444 -0
  128. package/src/flags.mjs +15 -0
  129. package/src/fresh-window.mjs +76 -0
  130. package/src/gmx-attestation.mjs +175 -0
  131. package/src/index.mjs +50 -0
  132. package/src/nft-gas-war-guard.mjs +139 -0
  133. package/src/onboarding/agent-keys.mjs +157 -0
  134. package/src/onboarding/index.mjs +18 -0
  135. package/src/onboarding/tiers.mjs +139 -0
  136. package/src/oracle-env.mjs +38 -0
  137. package/src/protocol-execution.mjs +84 -0
  138. package/src/public-api/buzz-integration.mjs +256 -0
  139. package/src/public-api/connect-agent.mjs +397 -0
  140. package/src/public-api/grants.mjs +142 -0
  141. package/src/public-api/http.mjs +374 -0
  142. package/src/public-control/aa-adapter.mjs +402 -0
  143. package/src/public-control/build-registry.mjs +227 -0
  144. package/src/public-control/bundler-client.mjs +372 -0
  145. package/src/public-control/grant-indexer.mjs +296 -0
  146. package/src/public-control/policy-render.mjs +69 -0
  147. package/src/public-control/policy-schema.mjs +318 -0
  148. package/src/public-control/runtime-config.mjs +265 -0
  149. package/src/public-control/session-key-model.mjs +374 -0
  150. package/src/public-control/session-orchestrator.mjs +412 -0
  151. package/src/route-attestation.mjs +132 -0
  152. package/src/router/best-execution.mjs +221 -0
  153. package/src/router/index.mjs +185 -0
  154. package/src/router/prepare-bridge.mjs +288 -0
  155. package/src/router/prepare-route.mjs +341 -0
  156. package/src/router/proposal.mjs +311 -0
  157. package/src/router/risk-classifier.mjs +119 -0
  158. package/src/router/route-sources.mjs +292 -0
  159. package/src/scanner/chains.config.mjs +381 -0
  160. package/src/scanner/contract.mjs +270 -0
  161. package/src/scanner/evm-scanner.mjs +394 -0
  162. package/src/scanner/index.mjs +9 -0
  163. package/src/scanner/v2-venue.mjs +335 -0
  164. package/src/scanner/v3-venue.mjs +290 -0
  165. package/src/scopes.mjs +44 -0
  166. package/src/sell-simulation.mjs +167 -0
  167. package/src/token-transfer-guard.mjs +188 -0
  168. package/src/vault-attestation.mjs +145 -0
  169. package/src/venues.mjs +206 -0
@@ -0,0 +1,931 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>ORACLE</title>
7
+ <meta name="description" content="Oracle multichain agent control. Routes across EVM + Solana. Self-custody. Powered by Hermes." />
8
+ <meta name="theme-color" content="#0B1018" />
9
+ <meta name="robots" content="noindex,nofollow" />
10
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=Outfit:wght@300;400;500&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet" />
13
+ <style>
14
+ :root{
15
+ --bg:#0B1018;
16
+ --panel:#111925;
17
+ --panel-2:#152031;
18
+ --blue:#7CC4FF;
19
+ --blue2:#A7D8FF;
20
+ --blue-dim:#3a6f99;
21
+ --ink:#E8F1FA;
22
+ --cool:#9BB6D1;
23
+ --mute:#5B738F;
24
+ --line:rgba(124,196,255,.14);
25
+ --line-2:rgba(124,196,255,.24);
26
+ --evm:#7CC4FF;
27
+ --hl:#50D2C1;
28
+ --rh:#d7ff4d;
29
+ --sol:#9945FF;
30
+ --poly:#3B82F6;
31
+ --stable:#F0B90B;
32
+ --display:"Cormorant Garamond",Georgia,"Times New Roman",serif;
33
+ --sans:"Outfit",system-ui,sans-serif;
34
+ --mono:"IBM Plex Mono",ui-monospace,monospace;
35
+ --ease:cubic-bezier(.16,1,.3,1);
36
+ --pad:clamp(18px,4vw,48px);
37
+ --max:1100px;
38
+ }
39
+ *{box-sizing:border-box;margin:0;padding:0}
40
+ html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
41
+ body{
42
+ min-height:100dvh;background:var(--bg);color:var(--ink);
43
+ font-family:var(--sans);font-weight:300;overflow-x:hidden;
44
+ }
45
+ ::selection{background:var(--blue);color:#061018}
46
+ a{color:inherit;text-decoration:none}
47
+ button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
48
+
49
+ .grain{
50
+ position:fixed;inset:-40%;z-index:40;pointer-events:none;opacity:.04;mix-blend-mode:soft-light;
51
+ background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .55 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
52
+ }
53
+
54
+ .loader{
55
+ position:fixed;inset:0;z-index:50;background:var(--bg);
56
+ display:grid;place-items:center;
57
+ transition:opacity .7s var(--ease),visibility .7s;
58
+ }
59
+ .loader.out{opacity:0;visibility:hidden;pointer-events:none}
60
+ .loader-inner{display:flex;flex-direction:column;align-items:center;gap:18px}
61
+ .loader-mark{width:42px;height:42px;position:relative}
62
+ .loader-mark i{position:absolute;inset:0;border:1px solid var(--blue);border-radius:50%;animation:pulse 1.4s var(--ease) infinite;opacity:.35}
63
+ .loader-mark b{position:absolute;inset:12px;border-radius:50%;background:var(--blue);box-shadow:0 0 24px rgba(124,196,255,.5)}
64
+ .loader-word{font-family:var(--display);font-size:18px;letter-spacing:.08em;text-transform:none;color:var(--cool);font-style:italic}
65
+ .loader-bar{width:120px;height:1px;background:rgba(124,196,255,.15);overflow:hidden}
66
+ .loader-bar span{display:block;height:100%;width:0;background:var(--blue);transition:width 1.1s var(--ease)}
67
+ @keyframes pulse{0%{transform:scale(.85);opacity:.55}70%{transform:scale(1.35);opacity:0}100%{transform:scale(1.35);opacity:0}}
68
+
69
+ .nav{
70
+ position:fixed;top:0;left:0;right:0;z-index:30;
71
+ display:grid;
72
+ grid-template-columns:1fr auto 1fr;
73
+ align-items:center;gap:16px;
74
+ padding:16px var(--pad);
75
+ background:rgba(11,16,24,.82);
76
+ backdrop-filter:blur(14px);
77
+ border-bottom:1px solid var(--line);
78
+ }
79
+ .brand{
80
+ display:flex;align-items:center;gap:12px;
81
+ font-family:var(--display);font-size:24px;font-weight:400;letter-spacing:.02em;
82
+ text-transform:none;justify-self:start;
83
+ }
84
+ .brand .orb{width:8px;height:8px;border-radius:50%;background:var(--blue);box-shadow:0 0 14px rgba(124,196,255,.85)}
85
+ .nav-mid{
86
+ display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:10px 18px;
87
+ font-family:var(--mono);font-size:9px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute);
88
+ }
89
+ .nav-mid b{color:var(--blue2);font-weight:500}
90
+ .nav-mid a.hermes{
91
+ color:var(--blue);font-weight:600;border-bottom:1px solid transparent;
92
+ transition:border-color .25s,color .25s;
93
+ }
94
+ .nav-mid a.hermes:hover{border-bottom-color:var(--blue);color:var(--ink)}
95
+ .nav-links{
96
+ display:flex;align-items:center;gap:18px;justify-self:end;
97
+ font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--cool);
98
+ }
99
+ .nav-links a{opacity:.78;transition:opacity .25s,color .25s}
100
+ .nav-links a:hover{opacity:1;color:var(--blue2)}
101
+ .nav-cta{
102
+ border:1px solid rgba(124,196,255,.28);border-radius:999px;padding:10px 16px;color:var(--ink);
103
+ transition:border-color .3s,color .3s,box-shadow .3s;
104
+ }
105
+ .nav-cta:hover{border-color:var(--blue);color:var(--blue2);box-shadow:0 0 0 1px rgba(124,196,255,.12)}
106
+
107
+ /* fixed soft field behind content */
108
+ #gl{position:fixed;inset:0;width:100%;height:100%;z-index:0;display:block;opacity:.9}
109
+ .veil{
110
+ position:fixed;inset:0;z-index:1;pointer-events:none;
111
+ background:
112
+ radial-gradient(60% 50% at 50% 28%, rgba(124,196,255,.08), transparent 58%),
113
+ linear-gradient(180deg, rgba(11,16,24,.2), var(--bg) 88%);
114
+ }
115
+ main{position:relative;z-index:2;padding-top:84px}
116
+
117
+ /* kill old hero */
118
+ .hero,.hero-core,.title-powered,.scroll-cue,.eyebrow,.lede,.actions,.btn,.meta-row{display:none!important}
119
+
120
+ .section{
121
+ position:relative;z-index:2;max-width:var(--max);margin:0 auto;
122
+ padding:clamp(28px,5vh,48px) var(--pad) 0;
123
+ }
124
+ .section:first-of-type{padding-top:clamp(18px,3vh,28px)}
125
+ .section-label{
126
+ font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;
127
+ }
128
+ .veil{
129
+ position:absolute;inset:0;z-index:1;pointer-events:none;
130
+ background:
131
+ radial-gradient(70% 55% at 50% 42%, transparent 0%, rgba(11,16,24,.3) 48%, var(--bg) 82%),
132
+ linear-gradient(180deg, rgba(11,16,24,.28) 0%, transparent 24%, transparent 70%, var(--bg) 100%);
133
+ }
134
+ .hero-core{
135
+ position:relative;z-index:2;width:min(920px,100%);
136
+ display:flex;flex-direction:column;align-items:center;text-align:center;
137
+ gap:clamp(18px,3vw,28px);
138
+ }
139
+ .eyebrow{
140
+ font-family:var(--mono);font-size:11px;letter-spacing:.46em;text-transform:uppercase;color:var(--blue);
141
+ display:inline-flex;align-items:center;gap:12px;
142
+ }
143
+ .eyebrow::before,.eyebrow::after{content:"";width:28px;height:1px;background:var(--blue-dim)}
144
+ h1{
145
+ font-family:var(--display);font-weight:300;
146
+ font-size:clamp(78px,17vw,176px);line-height:.86;letter-spacing:.01em;
147
+ text-transform:none;
148
+ }
149
+ h1 em{
150
+ font-style:italic;font-weight:400;
151
+ background:linear-gradient(110deg, var(--blue2) 8%, var(--blue) 48%, #cfe9ff 100%);
152
+ -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
153
+ }
154
+ .title-powered{
155
+ display:inline-flex;align-items:center;gap:10px;
156
+ margin-top:-6px;
157
+ font-family:var(--mono);font-size:11px;letter-spacing:.28em;text-transform:uppercase;color:var(--mute);
158
+ }
159
+ .title-powered .mark{
160
+ width:6px;height:6px;border-radius:50%;background:var(--blue);
161
+ box-shadow:0 0 10px rgba(124,196,255,.7);
162
+ }
163
+ .title-powered a{
164
+ color:var(--blue);font-weight:500;border-bottom:1px solid transparent;
165
+ transition:border-color .25s,color .25s;letter-spacing:.2em;
166
+ }
167
+ .title-powered a:hover{border-bottom-color:var(--blue);color:var(--ink)}
168
+ .lede{max-width:34ch;font-size:clamp(15px,1.7vw,18px);line-height:1.65;color:var(--cool);font-weight:300}
169
+ .actions{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:6px}
170
+ .btn{
171
+ font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;
172
+ border-radius:999px;padding:15px 26px;
173
+ transition:transform .3s var(--ease),box-shadow .35s,background .3s,border-color .3s,color .3s;
174
+ }
175
+ .btn-primary{background:var(--blue);color:#061018;font-weight:500}
176
+ .btn-primary:hover{transform:translateY(-2px);box-shadow:0 14px 36px rgba(124,196,255,.28)}
177
+ .btn-ghost{border:1px solid var(--line);color:var(--cool)}
178
+ .btn-ghost:hover{border-color:var(--blue-dim);color:var(--blue2)}
179
+ .meta-row{
180
+ margin-top:10px;display:flex;flex-wrap:wrap;gap:18px;justify-content:center;
181
+ font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute);
182
+ }
183
+ .meta-row span{display:inline-flex;align-items:center;gap:8px}
184
+ .meta-row i{width:5px;height:5px;border-radius:50%;background:var(--blue);opacity:.75;box-shadow:0 0 8px rgba(124,196,255,.6)}
185
+ .scroll-cue{
186
+ position:absolute;left:50%;bottom:28px;transform:translateX(-50%);z-index:2;
187
+ display:flex;flex-direction:column;align-items:center;gap:10px;
188
+ font-family:var(--mono);font-size:9px;letter-spacing:.32em;text-transform:uppercase;color:var(--mute);
189
+ }
190
+ .scroll-cue .line{width:1px;height:42px;background:linear-gradient(var(--blue),transparent)}
191
+
192
+ .section{
193
+ position:relative;z-index:2;max-width:var(--max);margin:0 auto;
194
+ padding:clamp(72px,12vh,130px) var(--pad) 0;
195
+ }
196
+ .section-label{
197
+ font-family:var(--mono);font-size:10px;letter-spacing:.34em;text-transform:uppercase;color:var(--blue);margin-bottom:14px;
198
+ }
199
+ .section-title{
200
+ font-family:var(--display);font-weight:400;
201
+ font-size:clamp(34px,5vw,54px);line-height:1.06;letter-spacing:-.01em;
202
+ max-width:16ch;margin-bottom:12px;
203
+ }
204
+ .section-title em{font-style:italic;color:var(--blue2)}
205
+ .section-lede{max-width:50ch;color:var(--cool);font-size:15px;line-height:1.65;margin-bottom:clamp(28px,4vw,44px)}
206
+
207
+ /* orchestration graph */
208
+ .graph-shell{
209
+ border:1px solid var(--line);border-radius:20px;overflow:hidden;
210
+ background:linear-gradient(180deg, rgba(124,196,255,.04), transparent 42%), var(--panel);
211
+ }
212
+ .graph-top{
213
+ display:flex;flex-wrap:wrap;justify-content:space-between;gap:10px;
214
+ padding:14px 18px;border-bottom:1px solid var(--line);
215
+ font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
216
+ }
217
+ .graph-top b{color:var(--blue);font-weight:500}
218
+ .graph-canvas{padding:clamp(28px,4vw,40px) clamp(14px,2.5vw,24px) clamp(22px,3vw,30px);overflow:auto}
219
+ .orch{width:min(980px,100%);margin:0 auto;min-width:680px}
220
+ .row{display:flex;justify-content:center;gap:14px;align-items:stretch}
221
+ .row.profiles{
222
+ display:grid;
223
+ grid-template-columns:repeat(3,minmax(0,1fr));
224
+ gap:10px;width:100%;
225
+ }
226
+ .route-strip{
227
+ display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
228
+ gap:1px;background:var(--line);border-top:1px solid var(--line);
229
+ }
230
+ @media (min-width:1100px){
231
+ .route-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
232
+ }
233
+ .node{
234
+ border:1px solid var(--line-2);border-radius:14px;background:rgba(11,16,24,.72);
235
+ padding:14px 12px;text-align:center;
236
+ transition:border-color .3s,transform .3s var(--ease),box-shadow .3s;
237
+ }
238
+ .node:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,0,0,.28)}
239
+ .node.hub{
240
+ width:min(280px,100%);
241
+ border-color:rgba(124,196,255,.5);
242
+ background:linear-gradient(180deg, rgba(124,196,255,.12), rgba(11,16,24,.88));
243
+ box-shadow:0 0 0 1px rgba(124,196,255,.08), 0 16px 40px rgba(0,0,0,.3);
244
+ padding:18px 16px;
245
+ }
246
+ .node .tag{font-family:var(--mono);font-size:9px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);margin-bottom:8px}
247
+ .node.hub .tag{color:var(--blue)}
248
+ .node .name{font-family:var(--display);font-size:22px;line-height:1;letter-spacing:.01em;margin-bottom:6px}
249
+ .node.hub .name{font-size:34px;font-weight:400}
250
+ .node .sub{font-family:var(--mono);font-size:10px;letter-spacing:.06em;color:var(--cool);line-height:1.45}
251
+ .node.route{min-height:132px;display:flex;flex-direction:column;justify-content:flex-start;text-align:left;padding:14px}
252
+ .node.route .name{font-size:18px;margin-bottom:8px}
253
+ .node.route .chains{
254
+ margin-top:auto;padding-top:10px;
255
+ font-family:var(--mono);font-size:10px;letter-spacing:.04em;line-height:1.55;
256
+ }
257
+ .node.add{
258
+ border-style:dashed;border-color:rgba(124,196,255,.28);
259
+ background:rgba(11,16,24,.35);
260
+ min-height:132px;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;
261
+ text-align:left;padding:14px;
262
+ }
263
+ .node.add .name{font-size:18px;color:var(--blue2)}
264
+ .node.add .sub{color:var(--mute)}
265
+ .node.add:hover{border-color:rgba(124,196,255,.55);background:rgba(124,196,255,.06)}
266
+
267
+ /* protocol colors */
268
+ .node.p-hl{border-color:rgba(80,210,193,.45);background:linear-gradient(180deg, rgba(80,210,193,.14), rgba(11,16,24,.88))}
269
+ .node.p-hl .tag,.node.p-hl .name{color:var(--hl)}
270
+ .node.p-hl .chains{color:rgba(80,210,193,.9)}
271
+ .node.p-hl:hover{border-color:var(--hl);box-shadow:0 12px 30px rgba(80,210,193,.12)}
272
+
273
+ .node.p-rh{border-color:rgba(215,255,77,.55);background:linear-gradient(180deg, rgba(215,255,77,.14), rgba(11,16,24,.88))}
274
+ .node.p-rh .tag,.node.p-rh .name{color:var(--rh)}
275
+ .node.p-rh .chains{color:rgba(215,255,77,.92)}
276
+ .node.p-rh:hover{border-color:var(--rh);box-shadow:0 12px 30px rgba(215,255,77,.16)}
277
+
278
+ .node.p-sol{border-color:rgba(153,69,255,.5);background:linear-gradient(180deg, rgba(153,69,255,.14), rgba(11,16,24,.88))}
279
+ .node.p-sol .tag,.node.p-sol .name{color:#c4a0ff}
280
+ .node.p-sol .chains{color:rgba(196,160,255,.9)}
281
+ .node.p-sol:hover{border-color:var(--sol);box-shadow:0 12px 30px rgba(153,69,255,.14)}
282
+
283
+ .node.p-poly{border-color:rgba(59,130,246,.5);background:linear-gradient(180deg, rgba(59,130,246,.14), rgba(11,16,24,.88))}
284
+ .node.p-poly .tag,.node.p-poly .name{color:#93c5fd}
285
+ .node.p-poly .chains{color:rgba(147,197,253,.9)}
286
+ .node.p-poly:hover{border-color:var(--poly);box-shadow:0 12px 30px rgba(59,130,246,.14)}
287
+
288
+ .node.p-stable{border-color:rgba(240,185,11,.5);background:linear-gradient(180deg, rgba(240,185,11,.12), rgba(11,16,24,.88))}
289
+ .node.p-build{border-color:rgba(255,140,90,.55);background:linear-gradient(180deg, rgba(255,140,90,.14), rgba(11,16,24,.88))}
290
+ .node.p-build .tag,.node.p-build .name{color:#ffb089}
291
+ .node.p-build .chains{color:rgba(255,176,137,.92)}
292
+ .node.p-build:hover{border-color:#ff8c5a;box-shadow:0 12px 30px rgba(255,140,90,.14)}
293
+ .route-card.p-build .where{color:#ffb089}
294
+ .route-card.p-build{box-shadow:inset 3px 0 0 #ff8c5a}
295
+ .node.p-stable .tag,.node.p-stable .name{color:#fcd34d}
296
+ .node.p-stable .chains{color:rgba(252,211,77,.9)}
297
+ .node.p-stable:hover{border-color:var(--stable);box-shadow:0 12px 30px rgba(240,185,11,.12)}
298
+
299
+ .route-card.p-hl .where{color:var(--hl)}
300
+ .route-card.p-rh .where{color:var(--rh)}
301
+ .route-card.p-sol .where{color:#c4a0ff}
302
+ .route-card.p-poly .where{color:#93c5fd}
303
+ .route-card.p-stable .where{color:#fcd34d}
304
+ .route-card.p-add .where{color:var(--blue2)}
305
+ .route-card.p-hl{box-shadow:inset 3px 0 0 var(--hl)}
306
+ .route-card.p-rh{box-shadow:inset 3px 0 0 var(--rh)}
307
+ .route-card.p-sol{box-shadow:inset 3px 0 0 var(--sol)}
308
+ .route-card.p-poly{box-shadow:inset 3px 0 0 var(--poly)}
309
+ .route-card.p-stable{box-shadow:inset 3px 0 0 var(--stable)}
310
+ .route-card.p-add{box-shadow:inset 3px 0 0 rgba(124,196,255,.45);opacity:.92}
311
+
312
+ .moat-grid{
313
+ display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
314
+ gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;
315
+ margin-top:22px;
316
+ }
317
+ .moat-card{
318
+ background:var(--bg);padding:clamp(20px,3vw,28px);min-height:140px;
319
+ display:flex;flex-direction:column;gap:10px;
320
+ }
321
+ .moat-card:hover{background:var(--panel-2)}
322
+ .moat-card .n{font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue)}
323
+ .moat-card h3{font-family:var(--display);font-weight:400;font-size:clamp(20px,2.2vw,26px)}
324
+ .moat-card p{color:var(--cool);font-size:14px;line-height:1.55;max-width:40ch}
325
+ @media (max-width:860px){.moat-grid{grid-template-columns:1fr}}
326
+ .posture-chip{
327
+ font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;
328
+ border:1px solid rgba(124,196,255,.35);border-radius:999px;padding:6px 10px;color:var(--blue2);
329
+ }
330
+ .evolve-rail{
331
+ display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
332
+ padding:14px 16px 4px;
333
+ }
334
+ .evolve-pill{
335
+ font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;
336
+ border:1px solid var(--line);border-radius:999px;padding:8px 12px;color:var(--cool);
337
+ }
338
+ .evolve-pill.on{border-color:rgba(124,196,255,.35);color:var(--blue2)}
339
+
340
+ .wires{height:40px;position:relative}
341
+ .wires svg{width:100%;height:100%;display:block;overflow:visible}
342
+ .wires path{fill:none;stroke:rgba(124,196,255,.35);stroke-width:1.25;stroke-linecap:round}
343
+ .wires circle{fill:var(--blue)}
344
+ .wires.multi path.w-poly{stroke:rgba(59,130,246,.55)}
345
+ .wires.multi path.w-hl{stroke:rgba(80,210,193,.55)}
346
+ .wires.multi path.w-rh{stroke:rgba(215,255,77,.6)}
347
+ .wires.multi path.w-sol{stroke:rgba(153,69,255,.55)}
348
+ .wires.multi path.w-stable{stroke:rgba(240,185,11,.55)}
349
+ .wires.multi path.w-add{stroke:rgba(124,196,255,.35);stroke-dasharray:3 3}
350
+ .wires.multi circle.c-poly{fill:var(--poly)}
351
+ .wires.multi circle.c-hl{fill:var(--hl)}
352
+ .wires.multi circle.c-rh{fill:var(--rh)}
353
+ .wires.multi circle.c-sol{fill:var(--sol)}
354
+ .wires.multi circle.c-stable{fill:var(--stable)}
355
+ .wires.multi circle.c-add{fill:var(--blue2)}
356
+
357
+ /* route detail cards */
358
+ .route-card{
359
+ background:var(--bg);padding:22px 20px;min-height:150px;
360
+ display:flex;flex-direction:column;gap:10px;transition:background .35s;
361
+ }
362
+ .route-card:hover{background:var(--panel-2)}
363
+ .route-card h3{font-family:var(--display);font-weight:400;font-size:26px}
364
+ .route-card .where{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue)}
365
+ .route-card p{color:var(--cool);font-size:13.5px;line-height:1.55}
366
+ .route-card .chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:auto}
367
+ .chip-s{
368
+ font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;
369
+ border:1px solid var(--line);border-radius:999px;padding:5px 8px;color:var(--cool);
370
+ }
371
+ .route-card .why{
372
+ margin-top:4px;padding-top:12px;border-top:1px solid var(--line);
373
+ font-family:var(--display);font-style:italic;font-size:17px;line-height:1.45;color:var(--blue2);
374
+ }
375
+ .why-band{
376
+ border-top:1px solid var(--line);
377
+ padding:22px 24px 24px;
378
+ background:rgba(11,16,24,.55);
379
+ }
380
+ .why-band p{
381
+ max-width:62ch;margin:0 auto;text-align:center;
382
+ font-family:var(--display);font-style:italic;font-weight:400;
383
+ font-size:clamp(18px,2.2vw,24px);line-height:1.4;color:var(--blue2);
384
+ }
385
+ .why-band span{
386
+ display:block;margin-top:10px;
387
+ font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);font-style:normal;
388
+ }
389
+
390
+ /* chains */
391
+ .chain-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
392
+ .chain{
393
+ border:1px solid var(--line);border-radius:14px;padding:16px;
394
+ background:linear-gradient(180deg, rgba(124,196,255,.035), transparent 55%), var(--panel);
395
+ min-height:100px;display:flex;flex-direction:column;justify-content:space-between;gap:12px;
396
+ transition:border-color .3s,transform .3s var(--ease);
397
+ }
398
+ .chain:hover{border-color:rgba(124,196,255,.35);transform:translateY(-2px)}
399
+ .chain-top{display:flex;justify-content:space-between;gap:8px}
400
+ .chain .nm{font-family:var(--display);font-size:20px}
401
+ .chain .id{font-family:var(--mono);font-size:11px;color:var(--blue)}
402
+ .chain .meta{
403
+ display:flex;justify-content:space-between;gap:8px;
404
+ font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);
405
+ }
406
+ .badge{border:1px solid var(--line);border-radius:999px;padding:4px 8px;color:var(--cool)}
407
+ .badge.live{border-color:rgba(124,196,255,.35);color:var(--blue)}
408
+
409
+ .venues{margin-top:14px;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:rgba(17,25,37,.85)}
410
+ .venues-head{
411
+ padding:11px 14px;border-bottom:1px solid var(--line);
412
+ font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
413
+ }
414
+ .marquee{overflow:hidden;white-space:nowrap;mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
415
+ .track{display:inline-flex;gap:24px;padding:13px 0;animation:scroll 42s linear infinite;will-change:transform}
416
+ .chip{
417
+ display:inline-flex;align-items:center;gap:8px;
418
+ font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--cool);
419
+ }
420
+ .chip::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--blue);opacity:.75}
421
+ @keyframes scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
422
+
423
+ .wallet-grid{
424
+ display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
425
+ gap:1px;background:var(--line);border:1px solid var(--line);border-radius:18px;overflow:hidden;
426
+ margin-top:8px;
427
+ }
428
+ .wallet-card{
429
+ background:var(--bg);padding:clamp(22px,3vw,30px);
430
+ display:flex;flex-direction:column;gap:12px;min-height:170px;
431
+ transition:background .35s;
432
+ }
433
+ .wallet-card:hover{background:var(--panel-2)}
434
+ .wallet-card .n{
435
+ font-family:var(--mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--blue);
436
+ }
437
+ .wallet-card h3{
438
+ font-family:var(--display);font-weight:400;font-size:clamp(22px,2.4vw,28px);letter-spacing:-.01em;
439
+ }
440
+ .wallet-card p{color:var(--cool);font-size:14px;line-height:1.55;max-width:32ch}
441
+ @media (max-width:860px){
442
+ .wallet-grid{grid-template-columns:1fr}
443
+ }
444
+
445
+ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);padding:32px var(--pad) 40px}
446
+ .foot-row{
447
+ max-width:var(--max);margin:0 auto 14px;
448
+ display:flex;flex-wrap:wrap;gap:14px 24px;justify-content:space-between;align-items:center;
449
+ }
450
+ .powered{
451
+ display:inline-flex;align-items:center;gap:10px;
452
+ font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--mute);
453
+ }
454
+ .powered .mark{width:7px;height:7px;border-radius:50%;background:var(--blue);box-shadow:0 0 12px rgba(124,196,255,.7)}
455
+ .powered a{color:var(--blue);font-weight:600;border-bottom:1px solid transparent;transition:border-color .25s,color .25s}
456
+ .powered a:hover{border-bottom-color:var(--blue);color:var(--ink)}
457
+ .foot-links{display:flex;gap:18px;font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute)}
458
+ .foot-links a:hover{color:var(--blue)}
459
+ .foot-meta{
460
+ max-width:var(--max);margin:0 auto;
461
+ display:flex;flex-wrap:wrap;gap:12px 22px;justify-content:space-between;
462
+ font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
463
+ }
464
+
465
+ .js .rv{opacity:0;transform:translateY(16px)}
466
+ .js .rv.in{opacity:1;transform:none;transition:opacity 1s var(--ease),transform 1s var(--ease)}
467
+
468
+ @media (max-width:960px){
469
+ .nav{grid-template-columns:1fr auto}
470
+ .nav-mid{display:none}
471
+ .nav-links .hide-sm{display:none}
472
+ .route-strip{grid-template-columns:1fr}
473
+ .chain-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
474
+ .orch{min-width:680px}
475
+ .row.profiles{grid-template-columns:repeat(2,minmax(0,1fr))}
476
+ }
477
+ @media (max-width:560px){
478
+ .chain-grid{grid-template-columns:1fr}
479
+ .row.profiles{grid-template-columns:1fr}
480
+ h1{font-size:clamp(68px,18vw,96px)}
481
+ }
482
+ @media (prefers-reduced-motion:reduce){
483
+ html{scroll-behavior:auto}
484
+ .js .rv{opacity:1;transform:none}
485
+ .loader-mark i,.track{animation:none}
486
+ .node:hover,.chain:hover{transform:none}
487
+ }
488
+ </style>
489
+ </head>
490
+ <body>
491
+ <div class="grain" aria-hidden="true"></div>
492
+
493
+ <div class="loader" id="loader" aria-hidden="true">
494
+ <div class="loader-inner">
495
+ <div class="loader-mark" aria-hidden="true"><i></i><b></b></div>
496
+ <div class="loader-word">oracle</div>
497
+ <div class="loader-bar"><span id="loader-fill"></span></div>
498
+ </div>
499
+ </div>
500
+
501
+ <header class="nav">
502
+ <a class="brand" href="#top"><span class="orb" aria-hidden="true"></span>oracle</a>
503
+ <div class="nav-mid" aria-label="Status">
504
+ <span>for <b>users</b></span>
505
+ <span>full crypto pack // protocol builder</span>
506
+ <span class="posture-chip">disarmed by default</span>
507
+ <span>powered by <a class="hermes" href="https://hermes-agent.nousresearch.com" target="_blank" rel="noopener noreferrer">Hermes</a></span>
508
+ </div>
509
+ <nav class="nav-links" aria-label="Primary">
510
+ <a class="hide-sm" href="#orchestration">How it works</a>
511
+ <a class="hide-sm" href="#wallets">Wallets</a>
512
+ <a class="hide-sm" href="#chains">Chains</a>
513
+ <a class="nav-cta" href="/oracle-console/">Open console</a>
514
+ </nav>
515
+ </header>
516
+
517
+ <main id="top">
518
+ <canvas id="gl" aria-hidden="true"></canvas>
519
+ <div class="veil" aria-hidden="true"></div>
520
+
521
+ <section class="section" id="orchestration">
522
+ <p class="section-label rv">How it works</p>
523
+ <h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
524
+ <p class="section-lede rv">oracle ships with the full crypto skill pack and a protocol builder. Specialist profiles for venues — plus scaffold, security, and user-signed deploys.</p>
525
+
526
+ <div class="graph-shell rv">
527
+ <div class="graph-top">
528
+ <span>for <b>users</b></span>
529
+ <span>full crypto pack // protocol builder</span>
530
+ <span>powered by Hermes</span>
531
+ </div>
532
+
533
+ <div class="evolve-rail">
534
+ <span class="evolve-pill on">full crypto pack</span>
535
+ <span class="evolve-pill on">customizable</span>
536
+ <span class="evolve-pill on">protocol builder</span>
537
+ <span class="evolve-pill on">more chains</span>
538
+ <span class="evolve-pill on"><a href="https://hermes-agent.nousresearch.com" target="_blank" rel="noopener noreferrer" style="color:inherit">powered by Hermes</a></span>
539
+ </div>
540
+
541
+ <div class="graph-canvas">
542
+ <div class="orch" aria-label="Oracle multi-profile graph">
543
+ <div class="row">
544
+ <div class="node" style="width:170px">
545
+ <div class="tag">you</div>
546
+ <div class="name">Task</div>
547
+ <div class="sub">what you want done</div>
548
+ </div>
549
+ </div>
550
+
551
+ <div class="wires" aria-hidden="true">
552
+ <svg viewBox="0 0 100 36" preserveAspectRatio="none">
553
+ <path d="M50 2 V34"/><circle cx="50" cy="2" r="1.4"/><circle cx="50" cy="34" r="1.4"/>
554
+ </svg>
555
+ </div>
556
+
557
+ <div class="row">
558
+ <div class="node hub">
559
+ <div class="tag">control plane</div>
560
+ <div class="name">oracle</div>
561
+ <div class="sub">route · bound · prepare</div>
562
+ </div>
563
+ </div>
564
+
565
+ <div class="wires multi" aria-hidden="true">
566
+ <svg viewBox="0 0 100 40" preserveAspectRatio="none">
567
+ <path d="M50 2 V12"/>
568
+ <path class="w-poly" d="M16.6 38 V18 H50 V12"/>
569
+ <path class="w-hl" d="M50 12 V38"/>
570
+ <path class="w-rh" d="M83.4 38 V18 H50 V12"/>
571
+ <path class="w-sol" d="M16.6 38"/>
572
+ <path class="w-stable" d="M50 38"/>
573
+ <path class="w-add" d="M83.4 38"/>
574
+ <!-- lower fan visual anchors via second row centers approximated in nodes -->
575
+ <circle cx="50" cy="2" r="1.3"/>
576
+ <circle class="c-poly" cx="16.6" cy="38" r="1.4"/>
577
+ <circle class="c-hl" cx="50" cy="38" r="1.4"/>
578
+ <circle class="c-rh" cx="83.4" cy="38" r="1.4"/>
579
+ </svg>
580
+ </div>
581
+
582
+ <div class="row profiles" id="profile-grid">
583
+ <div class="node route p-poly">
584
+ <div class="tag">profile</div>
585
+ <div class="name">polymarket agent</div>
586
+ <div class="sub">events · arb · markets</div>
587
+ <div class="chains">Polymarket</div>
588
+ </div>
589
+ <div class="node route p-hl">
590
+ <div class="tag">profile</div>
591
+ <div class="name">hyperliquid agent</div>
592
+ <div class="sub">perps · hip-3/4 · ta</div>
593
+ <div class="chains">Hyperliquid · HyperEVM 999</div>
594
+ </div>
595
+ <div class="node route p-rh">
596
+ <div class="tag">profile</div>
597
+ <div class="name">robinhood agent</div>
598
+ <div class="sub">markets · nfts · names</div>
599
+ <div class="chains">Robinhood Chain 4663</div>
600
+ </div>
601
+ <div class="node route p-sol">
602
+ <div class="tag">profile</div>
603
+ <div class="name">solana agent</div>
604
+ <div class="sub">swaps · research · jupiter</div>
605
+ <div class="chains">Solana mainnet</div>
606
+ </div>
607
+ <div class="node route p-stable">
608
+ <div class="tag">profile</div>
609
+ <div class="name">stable agent</div>
610
+ <div class="sub">launches · venue ops</div>
611
+ <div class="chains">Stable 988</div>
612
+ </div>
613
+ <div class="node route p-build">
614
+ <div class="tag">profile</div>
615
+ <div class="name">protocol builder</div>
616
+ <div class="sub">scaffold · security · deploy prep</div>
617
+ <div class="chains">any EVM · user-signed deploys</div>
618
+ </div>
619
+ <div class="node add">
620
+ <div class="tag">open slot</div>
621
+ <div class="name">+ add agent</div>
622
+ <div class="sub">new chain · new venue · your rules</div>
623
+ <div class="chains" style="margin-top:12px;font-family:var(--mono);font-size:10px;color:var(--blue2)">full crypto pack · powered by Hermes</div>
624
+ </div>
625
+ </div>
626
+ </div>
627
+ </div>
628
+
629
+ <div class="route-strip">
630
+ <article class="route-card p-poly">
631
+ <div class="where">polymarket agent →</div>
632
+ <h3>Polymarket</h3>
633
+ <p>Event markets, sports, arb paths, and prediction flow under bounds you set.</p>
634
+ <div class="chips">
635
+ <span class="chip-s">events</span>
636
+ <span class="chip-s">arb</span>
637
+ <span class="chip-s">Polymarket</span>
638
+ </div>
639
+ </article>
640
+ <article class="route-card p-hl">
641
+ <div class="where">hyperliquid agent →</div>
642
+ <h3>Hyperliquid</h3>
643
+ <p>Native perps, HIP-3/4, TA, event risk, and HyperEVM when you need HL’s EVM surface.</p>
644
+ <div class="chips">
645
+ <span class="chip-s">perps</span>
646
+ <span class="chip-s">HIP-3/4</span>
647
+ <span class="chip-s">HyperEVM</span>
648
+ </div>
649
+ </article>
650
+ <article class="route-card p-rh">
651
+ <div class="where">robinhood agent →</div>
652
+ <h3>Robinhood</h3>
653
+ <p>RH Chain markets, NFTs, names, and chain-local execution on 4663.</p>
654
+ <div class="chips">
655
+ <span class="chip-s">markets</span>
656
+ <span class="chip-s">NFTs</span>
657
+ <span class="chip-s">4663</span>
658
+ </div>
659
+ </article>
660
+ <article class="route-card p-sol">
661
+ <div class="where">solana agent →</div>
662
+ <h3>Solana</h3>
663
+ <p>Swaps, research, Jupiter routes, and wallet-signed execution as the lane activates.</p>
664
+ <div class="chips">
665
+ <span class="chip-s">Jupiter</span>
666
+ <span class="chip-s">swaps</span>
667
+ <span class="chip-s">research</span>
668
+ </div>
669
+ </article>
670
+ <article class="route-card p-stable">
671
+ <div class="where">stable agent →</div>
672
+ <h3>Stable</h3>
673
+ <p>Stable mainnet launches and venue ops on chain 988.</p>
674
+ <div class="chips">
675
+ <span class="chip-s">launches</span>
676
+ <span class="chip-s">Stable 988</span>
677
+ </div>
678
+ </article>
679
+ <article class="route-card p-build">
680
+ <div class="where">protocol builder →</div>
681
+ <h3>Build protocols</h3>
682
+ <p>Scaffold contracts, run security checks, and prepare unsigned deploys. Full crypto skill pack included — you still sign every deploy.</p>
683
+ <div class="chips">
684
+ <span class="chip-s">scaffold</span>
685
+ <span class="chip-s">security</span>
686
+ <span class="chip-s">unsigned deploy</span>
687
+ <span class="chip-s">launchpad</span>
688
+ </div>
689
+ </article>
690
+ <article class="route-card p-add">
691
+ <div class="where">+ add agent →</div>
692
+ <h3>Next chain</h3>
693
+ <p>Drop in another profile for a new chain or venue. Same custody model — your wallet, your limits, your revoke.</p>
694
+ <div class="chips">
695
+ <span class="chip-s">custom profile</span>
696
+ <span class="chip-s">more chains</span>
697
+ <span class="chip-s">powered by Hermes</span>
698
+ </div>
699
+ </article>
700
+ </div>
701
+
702
+ <div class="why-band">
703
+ <p>The model proposes. Policy bounds. You own signatures. Multi-profile desks — not one omniscient chatbot. Intents, vaults, perps, and bridges — not just swaps. Disarmed by default.</p>
704
+ <span>powered by Hermes · claims without receipts don't count</span>
705
+ </div>
706
+ </div>
707
+
708
+ <div class="moat-grid rv" style="margin-top:28px">
709
+ <article class="moat-card">
710
+ <div class="n">bound grants</div>
711
+ <h3>Wallet with temporary agent permission</h3>
712
+ <p>Max value, chain, venue, destinations, and TTL. Outside the grant = hard refuse — not an agent with a free wallet.</p>
713
+ </article>
714
+ <article class="moat-card">
715
+ <div class="n">receipts</div>
716
+ <h3>Claims without receipts don't count</h3>
717
+ <p>Money claims end in tx hash, receipt status, balance delta, and allowance state. No “looks filled.”</p>
718
+ </article>
719
+ <article class="moat-card">
720
+ <div class="n">custody</div>
721
+ <h3>Self-custodial by default</h3>
722
+ <p>You sign with your wallet. Agentic dust is optional, capped, and never your main capital as the always-on signer.</p>
723
+ </article>
724
+ <article class="moat-card">
725
+ <div class="n">intent desk + build</div>
726
+ <h3>Trade and build protocols</h3>
727
+ <p>Orders, vaults, perps, bridges — and protocol scaffold/deploy prep. Full crypto skills included. You sign.</p>
728
+ </article>
729
+ <article class="moat-card">
730
+ <div class="n">simulation</div>
731
+ <h3>Show the work before you sign</h3>
732
+ <p>minOut, impact, spender, and decoded calldata before approval. Export unsigned artifacts for hardware wallets.</p>
733
+ </article>
734
+ <article class="moat-card">
735
+ <div class="n">allowlists</div>
736
+ <h3>Where money may land</h3>
737
+ <p>Destination allowlists stop silent router drift. New contracts stay blocked until you add them.</p>
738
+ </article>
739
+ </div>
740
+ </section>
741
+
742
+ <section class="section" id="wallets">
743
+ <p class="section-label rv">Wallets</p>
744
+ <h2 class="section-title rv">Your wallets. <em>Your limits.</em></h2>
745
+ <p class="section-lede rv">Use one wallet everywhere, or separate wallets per chain. Permissions are per wallet — change them, tighten them, or revoke them anytime.</p>
746
+
747
+ <div class="wallet-grid rv">
748
+ <article class="wallet-card">
749
+ <div class="n">setup</div>
750
+ <h3>Single or multi</h3>
751
+ <p>One wallet across chains, or a dedicated wallet per chain. Same desk either way.</p>
752
+ </article>
753
+ <article class="wallet-card">
754
+ <div class="n">control</div>
755
+ <h3>Limit per wallet</h3>
756
+ <p>Caps, allowed actions, and scopes sit on each wallet — not a global free pass.</p>
757
+ </article>
758
+ <article class="wallet-card">
759
+ <div class="n">lifecycle</div>
760
+ <h3>Change · revoke</h3>
761
+ <p>Edit permissions when risk changes. Revoke a wallet’s access without killing the whole account.</p>
762
+ </article>
763
+ </div>
764
+ </section>
765
+
766
+ <section class="section" id="chains">
767
+ <p class="section-label rv">Chains</p>
768
+ <h2 class="section-title rv">Where you can <em>operate.</em></h2>
769
+ <p class="section-lede rv">Live coverage grows with the profile mesh. Each chain maps to an agent — and new agents can join.</p>
770
+ <div class="chain-grid" id="chain-grid"></div>
771
+ <div class="venues rv">
772
+ <div class="venues-head">protocols // venues</div>
773
+ <div class="marquee" aria-hidden="true"><div class="track" id="proto-track"></div></div>
774
+ </div>
775
+ </section>
776
+
777
+ <section class="section" id="custody" style="padding-top:clamp(48px,8vh,80px)">
778
+ <div class="strip-inner rv" style="border:1px solid var(--line);border-radius:16px;padding:22px 24px;display:flex;flex-wrap:wrap;gap:18px 28px;align-items:center;justify-content:space-between;background:linear-gradient(180deg, rgba(124,196,255,.05), transparent)">
779
+ <div class="strip-left">
780
+ <strong style="font-family:var(--display);font-weight:400;font-size:26px;display:block;margin-bottom:6px">You keep custody.</strong>
781
+ <span style="font-family:var(--mono);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute)">oracle never holds your keys</span>
782
+ </div>
783
+ <div class="strip-right" style="display:flex;flex-wrap:wrap;gap:10px">
784
+ <span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(124,196,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Multi-wallet</span>
785
+ <span class="pill on" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(124,196,255,.35);border-radius:999px;padding:9px 12px;color:var(--blue)">Per-wallet limits</span>
786
+ <span class="pill" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;border:1px solid var(--line);border-radius:999px;padding:9px 12px;color:var(--cool)">Revoke anytime</span>
787
+ </div>
788
+ </div>
789
+ </section>
790
+ </main>
791
+
792
+ <footer>
793
+ <div class="foot-row">
794
+ <div class="powered">
795
+ <span class="mark" aria-hidden="true"></span>
796
+ powered by
797
+ <a href="https://hermes-agent.nousresearch.com" target="_blank" rel="noopener noreferrer">Hermes</a>
798
+ </div>
799
+ <div class="foot-links">
800
+ <a href="/oracle-console/">Console</a>
801
+ <a href="https://hermes-agent.nousresearch.com/docs" target="_blank" rel="noopener noreferrer">Docs</a>
802
+ </div>
803
+ </div>
804
+ <div class="foot-meta">
805
+ <span>oracle · for users</span>
806
+ <span>full crypto pack · protocol builder · powered by Hermes</span>
807
+ <span>you sign // no house custody</span>
808
+ </div>
809
+ </footer>
810
+
811
+ <script>
812
+ (function () {
813
+ "use strict";
814
+ document.documentElement.classList.add("js");
815
+
816
+ var CHAINS = [
817
+ { name: "Ethereum", id: "1", note: "open / add agent", badge: "live" },
818
+ { name: "Base", id: "8453", note: "open / add agent", badge: "live" },
819
+ { name: "Arbitrum", id: "42161", note: "open / add agent", badge: "live" },
820
+ { name: "Optimism", id: "10", note: "open / add agent", badge: "live" },
821
+ { name: "Polygon", id: "137", note: "open / add agent", badge: "live" },
822
+ { name: "BNB Chain", id: "56", note: "open / add agent", badge: "live" },
823
+ { name: "Avalanche", id: "43114", note: "open / add agent", badge: "live" },
824
+ { name: "HyperEVM", id: "999", note: "hyperliquid agent", badge: "live" },
825
+ { name: "Abstract", id: "2741", note: "open / add agent", badge: "live" },
826
+ { name: "Stable", id: "988", note: "stable agent", badge: "live" },
827
+ { name: "Robinhood", id: "4663", note: "robinhood agent", badge: "live" },
828
+ { name: "Solana", id: "—", note: "solana agent", badge: "live" }
829
+ ];
830
+ var PROTOS = [
831
+ "uniswap-v3","aerodrome","velodrome","pancakeswap","quickswap",
832
+ "lfj","hyperswap","curve","balancer","pendle","morpho","gmx-v2",
833
+ "lifi","relay","paraswap","odos","cow","jupiter","across","stargate"
834
+ ];
835
+
836
+ document.getElementById("chain-grid").innerHTML = CHAINS.map(function (c) {
837
+ var cls = c.badge === "live" ? "badge live" : "badge";
838
+ var label = c.badge === "live" ? "live" : "read";
839
+ return '<article class="chain rv"><div class="chain-top"><div class="nm">' + c.name + '</div><div class="id">' + c.id + '</div></div><div class="meta"><span>' + c.note + '</span><span class="' + cls + '">' + label + '</span></div></article>';
840
+ }).join("");
841
+
842
+ var seq = PROTOS.concat(PROTOS);
843
+ document.getElementById("proto-track").innerHTML = seq.map(function (x) {
844
+ return '<span class="chip">' + x + '</span>';
845
+ }).join("");
846
+
847
+ var loader = document.getElementById("loader");
848
+ var fill = document.getElementById("loader-fill");
849
+ requestAnimationFrame(function () { fill.style.width = "100%"; });
850
+ window.addEventListener("load", function () {
851
+ setTimeout(function () { loader.classList.add("out"); }, 650);
852
+ });
853
+
854
+ var reduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
855
+ var coarse = window.matchMedia("(pointer: coarse)").matches;
856
+ var nodes = Array.prototype.slice.call(document.querySelectorAll(".rv"));
857
+ if (reduced || !("IntersectionObserver" in window)) {
858
+ nodes.forEach(function (n) { n.classList.add("in"); });
859
+ } else {
860
+ var io = new IntersectionObserver(function (entries) {
861
+ entries.forEach(function (e) {
862
+ if (e.isIntersecting) { e.target.classList.add("in"); io.unobserve(e.target); }
863
+ });
864
+ }, { threshold: 0.1, rootMargin: "0px 0px -6% 0px" });
865
+ nodes.forEach(function (n) { io.observe(n); });
866
+ }
867
+
868
+ var canvas = document.getElementById("gl");
869
+ if (!canvas || reduced || coarse) return;
870
+ var gl = canvas.getContext("webgl", { antialias:false, alpha:false, depth:false, stencil:false, premultipliedAlpha:false });
871
+ if (!gl) return;
872
+
873
+ var vs = "attribute vec2 p;void main(){gl_Position=vec4(p,0.,1.);}";
874
+ var fs = [
875
+ "precision highp float;",
876
+ "uniform vec2 r; uniform float t;",
877
+ "float hash(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}",
878
+ "float noise(vec2 p){vec2 i=floor(p),f=fract(p);float a=hash(i),b=hash(i+vec2(1.,0.)),c=hash(i+vec2(0.,1.)),d=hash(i+vec2(1.,1.));vec2 u=f*f*(3.-2.*f);return mix(a,b,u.x)+(c-a)*u.y*(1.-u.x)+(d-b)*u.x*u.y;}",
879
+ "void main(){",
880
+ " vec2 uv=(gl_FragCoord.xy-.5*r)/min(r.x,r.y);",
881
+ " vec2 p=uv*1.15; float tt=t*.08;",
882
+ " float n=noise(p*2.2+vec2(tt*.6,-tt*.4)); n+=.5*noise(p*4.6-vec2(tt,tt*.7)); n*=.55;",
883
+ " vec2 g=abs(fract(p*6.5)-.5); float grid=smoothstep(.06,0.,min(g.x,g.y));",
884
+ " float d=length(p); float rings=0.;",
885
+ " for(float i=0.;i<4.;i++){float ph=fract(tt*.35+i*.21);float rad=.08+ph*1.15;rings+=exp(-pow((d-rad)*28.,2.))*(1.-ph);}",
886
+ " float nodes=0.;",
887
+ " for(float i=0.;i<12.;i++){float a=i*2.399963;vec2 o=vec2(cos(a+tt*.2),sin(a-tt*.15))*(.18+.05*sin(tt+i));nodes+=exp(-dot(p-o,p-o)*420.);}",
888
+ " vec3 bg=vec3(0.043,0.063,0.094);",
889
+ " vec3 blue=vec3(0.486,0.769,1.0);",
890
+ " vec3 cool=vec3(0.655,0.847,1.0);",
891
+ " vec3 col=bg;",
892
+ " col+=blue*(n*.2); col+=blue*grid*.05;",
893
+ " col+=mix(blue,cool,.35)*rings*.22; col+=blue*nodes*.5;",
894
+ " col+=blue*exp(-d*d*1.8)*.08;",
895
+ " float vig=pow(max(1.-dot(uv*.72,uv*.72),0.),1.55);",
896
+ " col*=vig; gl_FragColor=vec4(col,1.);",
897
+ "}"
898
+ ].join("\n");
899
+
900
+ function compile(type, src){var s=gl.createShader(type);gl.shaderSource(s,src);gl.compileShader(s);return s;}
901
+ var prog=gl.createProgram();
902
+ gl.attachShader(prog,compile(gl.VERTEX_SHADER,vs));
903
+ gl.attachShader(prog,compile(gl.FRAGMENT_SHADER,fs));
904
+ gl.linkProgram(prog);gl.useProgram(prog);
905
+ var buf=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buf);
906
+ gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,3,-1,-1,3]),gl.STATIC_DRAW);
907
+ var loc=gl.getAttribLocation(prog,"p");gl.enableVertexAttribArray(loc);gl.vertexAttribPointer(loc,2,gl.FLOAT,false,0,0);
908
+ var uR=gl.getUniformLocation(prog,"r"), uT=gl.getUniformLocation(prog,"t");
909
+ var running=true;
910
+ function resize(){
911
+ var dpr=Math.min(window.devicePixelRatio||1,1.5);
912
+ var w=Math.floor(canvas.clientWidth*dpr), h=Math.floor(canvas.clientHeight*dpr);
913
+ if(canvas.width!==w||canvas.height!==h){canvas.width=w;canvas.height=h;gl.viewport(0,0,w,h);}
914
+ }
915
+ function frame(now){
916
+ if(!running) return;
917
+ resize();
918
+ gl.uniform2f(uR,canvas.width,canvas.height);
919
+ gl.uniform1f(uT,now*0.001);
920
+ gl.drawArrays(gl.TRIANGLES,0,3);
921
+ requestAnimationFrame(frame);
922
+ }
923
+ function fit(){canvas.style.width="100%";canvas.style.height="100%";resize();}
924
+ fit();
925
+ window.addEventListener("resize",fit,{passive:true});
926
+ document.addEventListener("visibilitychange",function(){running=document.visibilityState==="visible";if(running)requestAnimationFrame(frame);});
927
+ requestAnimationFrame(frame);
928
+ })();
929
+ </script>
930
+ </body>
931
+ </html>