@oracle-agent/oracle 0.14.1 → 0.16.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 (450) hide show
  1. package/README.md +2 -2
  2. package/SETUP.md +4 -4
  3. package/dist/action-receipts.mjs +1 -0
  4. package/dist/action-semantics.mjs +1 -0
  5. package/dist/address-book.mjs +2 -0
  6. package/dist/bin/desk-server.mjs +60 -0
  7. package/dist/bin/oracle-data-mcp.mjs +9 -0
  8. package/dist/bin/oracle-equities.mjs +20 -0
  9. package/dist/bin/oracle-init.mjs +24 -0
  10. package/dist/bin/oracle-public-server.mjs +5 -0
  11. package/dist/bin/oracle-route.mjs +22 -0
  12. package/dist/bin/oracle-scan.mjs +18 -0
  13. package/dist/bin/oracle-upgrade.mjs +21 -0
  14. package/dist/bin/oracle.mjs +63 -0
  15. package/dist/chains.mjs +1 -0
  16. package/dist/cli/commands/auth.mjs +16 -0
  17. package/dist/cli/commands/bootstrap.mjs +18 -0
  18. package/dist/cli/commands/chain.mjs +21 -0
  19. package/dist/cli/commands/chat.mjs +45 -0
  20. package/dist/cli/commands/credential.mjs +1 -0
  21. package/dist/cli/commands/data-mcp.mjs +2 -0
  22. package/dist/cli/commands/data.mjs +12 -0
  23. package/dist/cli/commands/doctor.mjs +5 -0
  24. package/dist/cli/commands/equities.mjs +15 -0
  25. package/dist/cli/commands/farm.mjs +59 -0
  26. package/dist/cli/commands/fees.mjs +10 -0
  27. package/dist/cli/commands/follow.mjs +28 -0
  28. package/dist/cli/commands/harness.mjs +15 -0
  29. package/dist/cli/commands/help.mjs +1 -0
  30. package/dist/cli/commands/init.mjs +3 -0
  31. package/dist/cli/commands/mcp.mjs +36 -0
  32. package/dist/cli/commands/model.mjs +54 -0
  33. package/dist/cli/commands/plugins.mjs +43 -0
  34. package/dist/cli/commands/prepare.mjs +2 -0
  35. package/dist/cli/commands/public.mjs +3 -0
  36. package/dist/cli/commands/resolve.mjs +23 -0
  37. package/dist/cli/commands/route.mjs +2 -0
  38. package/dist/cli/commands/runner.mjs +1 -0
  39. package/dist/cli/commands/scan.mjs +2 -0
  40. package/dist/cli/commands/setup.mjs +34 -0
  41. package/dist/cli/commands/sign.mjs +4 -0
  42. package/dist/cli/commands/signer.mjs +1 -0
  43. package/dist/cli/commands/strategy.mjs +18 -0
  44. package/dist/cli/commands/swap.mjs +36 -0
  45. package/dist/cli/commands/upgrade.mjs +2 -0
  46. package/dist/cli/commands/vault.mjs +1 -0
  47. package/dist/cli/commands/version.mjs +2 -0
  48. package/dist/data/desk-data.mjs +55 -0
  49. package/dist/data/names.mjs +2 -0
  50. package/dist/data/providers/farming.mjs +2 -0
  51. package/dist/equities/index.mjs +1 -0
  52. package/dist/index.mjs +60 -0
  53. package/dist/nft-gas-war-guard.mjs +1 -0
  54. package/dist/onboarding/harness-configs.mjs +4 -0
  55. package/dist/portfolio-risk.mjs +1 -0
  56. package/dist/prepare-envelope.mjs +1 -0
  57. package/dist/public-api/agent-grants.mjs +3 -0
  58. package/dist/public-control/policy-schema.mjs +1 -0
  59. package/dist/router/index.mjs +2 -0
  60. package/dist/scanner/index.mjs +4 -0
  61. package/dist/signals/index.mjs +1 -0
  62. package/dist/strategy/index.mjs +3 -0
  63. package/dist/watch-preferences.mjs +1 -0
  64. package/package.json +33 -78
  65. package/public/oracle-splash/_variants/ice.html +5 -18
  66. package/public/oracle-splash/_variants/ivory.html +5 -18
  67. package/public/oracle-splash/downloads/index.html +4 -4
  68. package/public/oracle-splash/index.html +113 -34
  69. package/CONTRIBUTING.md +0 -99
  70. package/bin/desk-server.mjs +0 -473
  71. package/bin/oracle-data-mcp.mjs +0 -1252
  72. package/bin/oracle-equities.mjs +0 -168
  73. package/bin/oracle-init.mjs +0 -525
  74. package/bin/oracle-public-server.mjs +0 -36
  75. package/bin/oracle-route.mjs +0 -254
  76. package/bin/oracle-scan.mjs +0 -192
  77. package/bin/oracle-upgrade.mjs +0 -42
  78. package/bin/oracle.mjs +0 -34
  79. package/docs/adding-a-chain.md +0 -229
  80. package/docs/architecture.md +0 -139
  81. package/docs/buzz-integration.md +0 -115
  82. package/docs/cli.md +0 -143
  83. package/docs/connectors.md +0 -13
  84. package/docs/hyperliquid-builder-code.md +0 -50
  85. package/docs/locals-only-fee-waiver.md +0 -34
  86. package/docs/oracle-pack-standard.md +0 -29
  87. package/docs/profiles.md +0 -151
  88. package/docs/public-surface.md +0 -206
  89. package/examples/add-a-chain.mjs +0 -65
  90. package/examples/oracle-pack-template.mjs +0 -38
  91. package/examples/research-a-token.mjs +0 -70
  92. package/plugins/oracle-owner-gate/__init__.py +0 -288
  93. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  94. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  95. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  96. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  97. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  98. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  99. package/scripts/adversarial-bench.mjs +0 -114
  100. package/scripts/build-dist.mjs +0 -119
  101. package/scripts/build-inscription.py +0 -230
  102. package/scripts/check-doc-drift.mjs +0 -123
  103. package/scripts/check-test-count.mjs +0 -105
  104. package/scripts/e2e-hl-markets.mjs +0 -21
  105. package/scripts/e2e-hl-perps.mjs +0 -48
  106. package/scripts/e2e-hypercore-staking.mjs +0 -128
  107. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  108. package/scripts/guard-publish.mjs +0 -22
  109. package/scripts/protocol-template-gate.mjs +0 -15
  110. package/scripts/public-api-scan.mjs +0 -23
  111. package/scripts/publish-dist.mjs +0 -67
  112. package/scripts/record-hero-cli.sh +0 -80
  113. package/scripts/secret-scan.mjs +0 -169
  114. package/scripts/smoke-dist-bins.mjs +0 -89
  115. package/scripts/verify-dist.mjs +0 -29
  116. package/scripts/verify-v3-venues.mjs +0 -233
  117. package/skins/oracle.yaml +0 -56
  118. package/src/action-receipts.mjs +0 -265
  119. package/src/action-semantics.mjs +0 -62
  120. package/src/address-book.mjs +0 -208
  121. package/src/agent-auth.mjs +0 -206
  122. package/src/approval-guard.mjs +0 -282
  123. package/src/attestation-secret.mjs +0 -94
  124. package/src/audit-log.mjs +0 -196
  125. package/src/auth/oauth.mjs +0 -672
  126. package/src/auto-slippage.mjs +0 -378
  127. package/src/capability-posture.mjs +0 -125
  128. package/src/cards.mjs +0 -422
  129. package/src/chains.mjs +0 -62
  130. package/src/cli/chain-catalog.mjs +0 -215
  131. package/src/cli/chain-state.mjs +0 -74
  132. package/src/cli/commands/auth.mjs +0 -193
  133. package/src/cli/commands/bootstrap.mjs +0 -87
  134. package/src/cli/commands/chain.mjs +0 -143
  135. package/src/cli/commands/chat.mjs +0 -465
  136. package/src/cli/commands/credential.mjs +0 -9
  137. package/src/cli/commands/data-mcp.mjs +0 -18
  138. package/src/cli/commands/data.mjs +0 -75
  139. package/src/cli/commands/doctor.mjs +0 -136
  140. package/src/cli/commands/equities.mjs +0 -41
  141. package/src/cli/commands/farm.mjs +0 -129
  142. package/src/cli/commands/fees.mjs +0 -109
  143. package/src/cli/commands/follow.mjs +0 -130
  144. package/src/cli/commands/harness.mjs +0 -63
  145. package/src/cli/commands/help.mjs +0 -7
  146. package/src/cli/commands/init.mjs +0 -27
  147. package/src/cli/commands/mcp.mjs +0 -154
  148. package/src/cli/commands/model.mjs +0 -106
  149. package/src/cli/commands/plugins.mjs +0 -275
  150. package/src/cli/commands/prepare.mjs +0 -12
  151. package/src/cli/commands/public.mjs +0 -20
  152. package/src/cli/commands/resolve.mjs +0 -64
  153. package/src/cli/commands/route.mjs +0 -12
  154. package/src/cli/commands/runner.mjs +0 -9
  155. package/src/cli/commands/scan.mjs +0 -12
  156. package/src/cli/commands/setup.mjs +0 -294
  157. package/src/cli/commands/sign.mjs +0 -21
  158. package/src/cli/commands/signer.mjs +0 -9
  159. package/src/cli/commands/swap.mjs +0 -102
  160. package/src/cli/commands/upgrade.mjs +0 -12
  161. package/src/cli/commands/vault.mjs +0 -9
  162. package/src/cli/commands/version.mjs +0 -22
  163. package/src/cli/first-run.mjs +0 -23
  164. package/src/cli/kernel.mjs +0 -262
  165. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  166. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  167. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  168. package/src/cli/mcp-targets/codex.mjs +0 -41
  169. package/src/cli/mcp-targets/cursor.mjs +0 -32
  170. package/src/cli/mcp-targets/shared.mjs +0 -71
  171. package/src/cli/mcp-targets/vscode.mjs +0 -39
  172. package/src/cli/messaging-platforms.mjs +0 -217
  173. package/src/cli/model-config.mjs +0 -78
  174. package/src/cli/operator-dispatch.mjs +0 -194
  175. package/src/cli/oracle-harness.py +0 -415
  176. package/src/cli/paths.mjs +0 -107
  177. package/src/cli/runtime.mjs +0 -351
  178. package/src/cli/setup-state.mjs +0 -168
  179. package/src/cli/spawn-child.mjs +0 -43
  180. package/src/data/catalog.mjs +0 -858
  181. package/src/data/desk-data.mjs +0 -877
  182. package/src/data/http.mjs +0 -253
  183. package/src/data/names.mjs +0 -188
  184. package/src/data/provider-endpoint.mjs +0 -94
  185. package/src/data/providers/aave-v3.mjs +0 -139
  186. package/src/data/providers/across-bridge.mjs +0 -41
  187. package/src/data/providers/aerodrome.mjs +0 -245
  188. package/src/data/providers/aevo.mjs +0 -33
  189. package/src/data/providers/approval-indexer.mjs +0 -133
  190. package/src/data/providers/approvals.mjs +0 -594
  191. package/src/data/providers/babylon-staking.mjs +0 -149
  192. package/src/data/providers/balancer.mjs +0 -209
  193. package/src/data/providers/beefy-yields.mjs +0 -45
  194. package/src/data/providers/birdeye-tokens.mjs +0 -33
  195. package/src/data/providers/bisq-markets.mjs +0 -145
  196. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  197. package/src/data/providers/bitcoin-meta.mjs +0 -378
  198. package/src/data/providers/blockscout.mjs +0 -14
  199. package/src/data/providers/bob-rootstock.mjs +0 -198
  200. package/src/data/providers/braiins-insights.mjs +0 -103
  201. package/src/data/providers/bridge-aggregator.mjs +0 -259
  202. package/src/data/providers/bridges.mjs +0 -242
  203. package/src/data/providers/bungee.mjs +0 -29
  204. package/src/data/providers/celestia-da.mjs +0 -38
  205. package/src/data/providers/changenow.mjs +0 -135
  206. package/src/data/providers/compound.mjs +0 -32
  207. package/src/data/providers/connext.mjs +0 -28
  208. package/src/data/providers/convex.mjs +0 -30
  209. package/src/data/providers/cow-protocol.mjs +0 -110
  210. package/src/data/providers/cowswap.mjs +0 -415
  211. package/src/data/providers/curve.mjs +0 -201
  212. package/src/data/providers/das-assets.mjs +0 -59
  213. package/src/data/providers/debridge.mjs +0 -109
  214. package/src/data/providers/defillama.mjs +0 -88
  215. package/src/data/providers/dexscreener.mjs +0 -43
  216. package/src/data/providers/drift.mjs +0 -32
  217. package/src/data/providers/dydx.mjs +0 -41
  218. package/src/data/providers/evm-rpc.mjs +0 -225
  219. package/src/data/providers/farming.mjs +0 -291
  220. package/src/data/providers/geckoterminal.mjs +0 -34
  221. package/src/data/providers/gmx.mjs +0 -496
  222. package/src/data/providers/hiro-stacks.mjs +0 -150
  223. package/src/data/providers/hl-assets.mjs +0 -165
  224. package/src/data/providers/hl-info.mjs +0 -108
  225. package/src/data/providers/hl-markets.mjs +0 -210
  226. package/src/data/providers/hl-outcome.mjs +0 -61
  227. package/src/data/providers/hl-perps.mjs +0 -419
  228. package/src/data/providers/hl-staking.mjs +0 -353
  229. package/src/data/providers/hl-ws.mjs +0 -119
  230. package/src/data/providers/hyperevm-dex.mjs +0 -49
  231. package/src/data/providers/jito-mev.mjs +0 -117
  232. package/src/data/providers/jupiter-venues.mjs +0 -119
  233. package/src/data/providers/jupiter.mjs +0 -315
  234. package/src/data/providers/kamino-strategies.mjs +0 -143
  235. package/src/data/providers/l2beat-tvl.mjs +0 -42
  236. package/src/data/providers/lifi.mjs +0 -166
  237. package/src/data/providers/liquid-esplora.mjs +0 -152
  238. package/src/data/providers/magiceden-ordinals.mjs +0 -141
  239. package/src/data/providers/magiceden-sol.mjs +0 -406
  240. package/src/data/providers/mempool-lightning.mjs +0 -144
  241. package/src/data/providers/mempool-mining.mjs +0 -142
  242. package/src/data/providers/meteora-dlmm.mjs +0 -168
  243. package/src/data/providers/morpho.mjs +0 -177
  244. package/src/data/providers/nft-gallery.mjs +0 -163
  245. package/src/data/providers/nft-portfolio.mjs +0 -494
  246. package/src/data/providers/odos.mjs +0 -156
  247. package/src/data/providers/ondo.mjs +0 -31
  248. package/src/data/providers/oneinch.mjs +0 -174
  249. package/src/data/providers/opensea-multichain.mjs +0 -136
  250. package/src/data/providers/opensea-nft.mjs +0 -371
  251. package/src/data/providers/orca.mjs +0 -29
  252. package/src/data/providers/ordinals-runes.mjs +0 -180
  253. package/src/data/providers/pancakeswap.mjs +0 -28
  254. package/src/data/providers/paraswap.mjs +0 -125
  255. package/src/data/providers/pendle.mjs +0 -188
  256. package/src/data/providers/poly-clob.mjs +0 -283
  257. package/src/data/providers/poly-public.mjs +0 -96
  258. package/src/data/providers/poly-ws.mjs +0 -103
  259. package/src/data/providers/polygon-staking.mjs +0 -227
  260. package/src/data/providers/portfolio-history.mjs +0 -394
  261. package/src/data/providers/portfolio.mjs +0 -600
  262. package/src/data/providers/pyth-price-feeds.mjs +0 -172
  263. package/src/data/providers/raydium.mjs +0 -35
  264. package/src/data/providers/relayscan-mev.mjs +0 -72
  265. package/src/data/providers/rfq.mjs +0 -15
  266. package/src/data/providers/rh-agent.mjs +0 -59
  267. package/src/data/providers/sanctum-lst.mjs +0 -180
  268. package/src/data/providers/satflow.mjs +0 -341
  269. package/src/data/providers/signed-material-guard.mjs +0 -108
  270. package/src/data/providers/solana-rpc.mjs +0 -197
  271. package/src/data/providers/solend-lending.mjs +0 -166
  272. package/src/data/providers/spark-lend.mjs +0 -42
  273. package/src/data/providers/squid-router.mjs +0 -29
  274. package/src/data/providers/stargate.mjs +0 -29
  275. package/src/data/providers/sushiswap.mjs +0 -30
  276. package/src/data/providers/symbiotic-restaking.mjs +0 -41
  277. package/src/data/providers/thorchain.mjs +0 -36
  278. package/src/data/providers/traderjoe.mjs +0 -28
  279. package/src/data/providers/twap.mjs +0 -152
  280. package/src/data/providers/uniswap-v3.mjs +0 -457
  281. package/src/data/providers/uniswap-v4.mjs +0 -414
  282. package/src/data/providers/vertex.mjs +0 -41
  283. package/src/data/providers/wallet-watch.mjs +0 -264
  284. package/src/data/providers/wormhole.mjs +0 -28
  285. package/src/data/providers/yearn.mjs +0 -31
  286. package/src/data/providers/zerox.mjs +0 -167
  287. package/src/data/public-api-scan.mjs +0 -61
  288. package/src/data/quote-placeholder.mjs +0 -31
  289. package/src/desk/swap-prepare.mjs +0 -194
  290. package/src/equities/bridge.mjs +0 -388
  291. package/src/equities/fixtures/bridge_routes.json +0 -159
  292. package/src/equities/fixtures/dst_transitions.json +0 -29
  293. package/src/equities/fixtures/equity_dex_pools.json +0 -154
  294. package/src/equities/fixtures/hip3_l2books.json +0 -2711
  295. package/src/equities/fixtures/nyse_holidays.json +0 -1
  296. package/src/equities/fixtures/oracles.json +0 -100
  297. package/src/equities/fixtures/rh_pool_state.json +0 -244
  298. package/src/equities/fixtures/solana_xstocks.json +0 -704
  299. package/src/equities/fixtures/ton_xstocks.json +0 -35
  300. package/src/equities/fixtures/universe.json +0 -411
  301. package/src/equities/fixtures/venues.json +0 -3542
  302. package/src/equities/fixtures.mjs +0 -405
  303. package/src/equities/funding.mjs +0 -142
  304. package/src/equities/index.mjs +0 -166
  305. package/src/equities/liveness.mjs +0 -148
  306. package/src/equities/marketHours.mjs +0 -249
  307. package/src/equities/normalize.mjs +0 -295
  308. package/src/equities/num.mjs +0 -146
  309. package/src/equities/prepare.mjs +0 -95
  310. package/src/equities/rank.mjs +0 -260
  311. package/src/equities/sourceNum.mjs +0 -69
  312. package/src/equities/types.mjs +0 -220
  313. package/src/equities/venues/arcus-perp.mjs +0 -84
  314. package/src/equities/venues/arcus-spot.mjs +0 -105
  315. package/src/equities/venues/hyperliquid-hip3.mjs +0 -224
  316. package/src/equities/venues/rh-uniswap.mjs +0 -216
  317. package/src/equities/venues/solana-xstocks.mjs +0 -139
  318. package/src/equities/venues/ton-stonfi.mjs +0 -139
  319. package/src/exact-integer.mjs +0 -72
  320. package/src/exec-policy.mjs +0 -419
  321. package/src/flags.mjs +0 -15
  322. package/src/fresh-window.mjs +0 -76
  323. package/src/gmx-attestation.mjs +0 -176
  324. package/src/index.mjs +0 -107
  325. package/src/licensing/locals-only.mjs +0 -25
  326. package/src/nft-gas-war-guard.mjs +0 -139
  327. package/src/onboarding/agent-keys.mjs +0 -161
  328. package/src/onboarding/harness-configs.mjs +0 -102
  329. package/src/onboarding/index.mjs +0 -18
  330. package/src/onboarding/tiers.mjs +0 -139
  331. package/src/oracle-env.mjs +0 -55
  332. package/src/package-manifest.mjs +0 -42
  333. package/src/plugins/agent-plugin-loader.mjs +0 -225
  334. package/src/portfolio-risk.mjs +0 -170
  335. package/src/prepare-envelope.mjs +0 -204
  336. package/src/profile-upgrade.mjs +0 -277
  337. package/src/protocol-execution.mjs +0 -84
  338. package/src/protocol-templates/gate.mjs +0 -179
  339. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  340. package/src/public-api/agent-grants.mjs +0 -57
  341. package/src/public-api/buzz-integration.mjs +0 -267
  342. package/src/public-api/connect-agent.mjs +0 -424
  343. package/src/public-api/grants.mjs +0 -142
  344. package/src/public-api/http.mjs +0 -707
  345. package/src/public-api/metering.mjs +0 -111
  346. package/src/public-control/aa-adapter.mjs +0 -402
  347. package/src/public-control/build-registry.mjs +0 -227
  348. package/src/public-control/bundler-client.mjs +0 -357
  349. package/src/public-control/grant-indexer.mjs +0 -296
  350. package/src/public-control/policy-render.mjs +0 -69
  351. package/src/public-control/policy-schema.mjs +0 -322
  352. package/src/public-control/runtime-config.mjs +0 -275
  353. package/src/public-control/session-key-model.mjs +0 -379
  354. package/src/public-control/session-orchestrator.mjs +0 -418
  355. package/src/rfq/intent.mjs +0 -180
  356. package/src/rfq/sources.mjs +0 -181
  357. package/src/route-attestation.mjs +0 -132
  358. package/src/router/best-execution.mjs +0 -326
  359. package/src/router/index.mjs +0 -250
  360. package/src/router/integrator-fee.mjs +0 -135
  361. package/src/router/prepare-bridge.mjs +0 -293
  362. package/src/router/prepare-route.mjs +0 -398
  363. package/src/router/proposal.mjs +0 -311
  364. package/src/router/risk-classifier.mjs +0 -119
  365. package/src/router/route-sources.mjs +0 -364
  366. package/src/scanner/chains.config.mjs +0 -543
  367. package/src/scanner/contract.mjs +0 -270
  368. package/src/scanner/evm-scanner.mjs +0 -394
  369. package/src/scanner/index.mjs +0 -9
  370. package/src/scanner/v2-venue.mjs +0 -351
  371. package/src/scanner/v3-venue.mjs +0 -308
  372. package/src/scopes.mjs +0 -44
  373. package/src/sell-simulation.mjs +0 -167
  374. package/src/signals/engine.mjs +0 -146
  375. package/src/signals/index.mjs +0 -1
  376. package/src/token-transfer-guard.mjs +0 -188
  377. package/src/tui/app.mjs +0 -438
  378. package/src/tui/backend.mjs +0 -215
  379. package/src/tui/format.mjs +0 -272
  380. package/src/tui/gateway-client.mjs +0 -177
  381. package/src/tui/input.mjs +0 -501
  382. package/src/tui/memory.mjs +0 -105
  383. package/src/tui/meta-learn.mjs +0 -85
  384. package/src/tui/renderer.mjs +0 -443
  385. package/src/tui/scheduler.mjs +0 -205
  386. package/src/tui/skills-loader.mjs +0 -140
  387. package/src/tui/standalone-client.mjs +0 -752
  388. package/src/tui/theme.mjs +0 -81
  389. package/src/vault-attestation.mjs +0 -146
  390. package/src/venues.mjs +0 -206
  391. package/src/watch-preferences.mjs +0 -85
  392. /package/{profiles → dist/assets/profiles}/_template/SOUL.md +0 -0
  393. /package/{profiles → dist/assets/profiles}/_template/profile.json +0 -0
  394. /package/{profiles → dist/assets/profiles}/bitcoin-agent/SOUL.md +0 -0
  395. /package/{profiles → dist/assets/profiles}/bitcoin-agent/profile.json +0 -0
  396. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/SOUL.md +0 -0
  397. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/profile.json +0 -0
  398. /package/{profiles → dist/assets/profiles}/oracle/SOUL.md +0 -0
  399. /package/{profiles → dist/assets/profiles}/oracle/profile.json +0 -0
  400. /package/{profiles → dist/assets/profiles}/polymarket-agent/SOUL.md +0 -0
  401. /package/{profiles → dist/assets/profiles}/polymarket-agent/profile.json +0 -0
  402. /package/{profiles → dist/assets/profiles}/profile.schema.json +0 -0
  403. /package/{profiles → dist/assets/profiles}/protocol-builder/SOUL.md +0 -0
  404. /package/{profiles → dist/assets/profiles}/protocol-builder/profile.json +0 -0
  405. /package/{profiles → dist/assets/profiles}/robinhood-agent/SOUL.md +0 -0
  406. /package/{profiles → dist/assets/profiles}/robinhood-agent/profile.json +0 -0
  407. /package/{profiles → dist/assets/profiles}/solana-agent/SOUL.md +0 -0
  408. /package/{profiles → dist/assets/profiles}/solana-agent/profile.json +0 -0
  409. /package/{profiles → dist/assets/profiles}/stable-agent/SOUL.md +0 -0
  410. /package/{profiles → dist/assets/profiles}/stable-agent/profile.json +0 -0
  411. /package/{skills → dist/assets/skills}/balance/SKILL.md +0 -0
  412. /package/{skills → dist/assets/skills}/bitcoin-l1.md +0 -0
  413. /package/{skills → dist/assets/skills}/chain-defi-ecosystem-profiling.md +0 -0
  414. /package/{skills → dist/assets/skills}/evm-contract-research.md +0 -0
  415. /package/{skills → dist/assets/skills}/hyperliquid.md +0 -0
  416. /package/{skills → dist/assets/skills}/multichain-exec-desk.md +0 -0
  417. /package/{skills → dist/assets/skills}/oracle-action-semantics/SKILL.md +0 -0
  418. /package/{skills → dist/assets/skills}/oracle-best-execution/SKILL.md +0 -0
  419. /package/{skills → dist/assets/skills}/oracle-best-execution.md +0 -0
  420. /package/{skills → dist/assets/skills}/oracle-bitcoin/SKILL.md +0 -0
  421. /package/{skills → dist/assets/skills}/oracle-chain-graphs-telegram-cards/SKILL.md +0 -0
  422. /package/{skills → dist/assets/skills}/oracle-chat/SKILL.md +0 -0
  423. /package/{skills → dist/assets/skills}/oracle-chat/chain.SKILL.md +0 -0
  424. /package/{skills → dist/assets/skills}/oracle-chat/setup.SKILL.md +0 -0
  425. /package/{skills → dist/assets/skills}/oracle-circuit-breaker/SKILL.md +0 -0
  426. /package/{skills → dist/assets/skills}/oracle-contract-research/SKILL.md +0 -0
  427. /package/{skills → dist/assets/skills}/oracle-desk/SKILL.md +0 -0
  428. /package/{skills → dist/assets/skills}/oracle-desk.md +0 -0
  429. /package/{skills → dist/assets/skills}/oracle-dex-launch/SKILL.md +0 -0
  430. /package/{skills → dist/assets/skills}/oracle-equities/SKILL.md +0 -0
  431. /package/{skills → dist/assets/skills}/oracle-grants/SKILL.md +0 -0
  432. /package/{skills → dist/assets/skills}/oracle-hypercore-staking/SKILL.md +0 -0
  433. /package/{skills → dist/assets/skills}/oracle-hyperliquid/SKILL.md +0 -0
  434. /package/{skills → dist/assets/skills}/oracle-meme-token-sniper/SKILL.md +0 -0
  435. /package/{skills → dist/assets/skills}/oracle-multichain-nft-launch/SKILL.md +0 -0
  436. /package/{skills → dist/assets/skills}/oracle-multichain-token-launch/SKILL.md +0 -0
  437. /package/{skills → dist/assets/skills}/oracle-nft-gacha-launch/SKILL.md +0 -0
  438. /package/{skills → dist/assets/skills}/oracle-nft-mint-gas-war/SKILL.md +0 -0
  439. /package/{skills → dist/assets/skills}/oracle-polymarket/SKILL.md +0 -0
  440. /package/{skills → dist/assets/skills}/oracle-protocol-builder/SKILL.md +0 -0
  441. /package/{skills → dist/assets/skills}/oracle-protocol-security/SKILL.md +0 -0
  442. /package/{skills → dist/assets/skills}/oracle-public-product/SKILL.md +0 -0
  443. /package/{skills → dist/assets/skills}/oracle-receipts/SKILL.md +0 -0
  444. /package/{skills → dist/assets/skills}/oracle-receipts.md +0 -0
  445. /package/{skills → dist/assets/skills}/oracle-rfq-tokenized-assets/SKILL.md +0 -0
  446. /package/{skills → dist/assets/skills}/oracle-smart-wallet-scanner/SKILL.md +0 -0
  447. /package/{skills → dist/assets/skills}/oracle-solana/SKILL.md +0 -0
  448. /package/{skills → dist/assets/skills}/oracle-solana-nft/SKILL.md +0 -0
  449. /package/{skills → dist/assets/skills}/oracle-token-research/SKILL.md +0 -0
  450. /package/{skills → dist/assets/skills}/solana.md +0 -0
@@ -1,494 +0,0 @@
1
- // Read-only NFT inventory and valuation coverage across configured wallet families.
2
-
3
- import { mapLimit, timed } from "../http.mjs";
4
- import { resolvePortfolioAddresses } from "./portfolio.mjs";
5
- import { openseaAccountNfts, openseaAccountPnl, openseaPrepareList } from "./opensea-nft.mjs";
6
- import { satflowWalletContents, satflowPrepareList } from "./satflow.mjs";
7
- import { btcInscriptions } from "./bitcoin-meta.mjs";
8
- import { magicEdenSolPrepareList } from "./magiceden-sol.mjs";
9
- import { nftGallery } from "./nft-gallery.mjs";
10
-
11
- export const OPENSEA_WALLET_CHAINS = Object.freeze([
12
- { chain: "ethereum", chainId: 1, family: "evm" },
13
- { chain: "optimism", chainId: 10, family: "evm" },
14
- { chain: "polygon", chainId: 137, family: "evm" },
15
- { chain: "stablechain", chainId: 988, family: "evm" },
16
- { chain: "hyperevm", chainId: 999, family: "evm" },
17
- { chain: "abstract", chainId: 2741, family: "evm" },
18
- { chain: "robinhood", chainId: 4663, family: "evm" },
19
- { chain: "base", chainId: 8453, family: "evm" },
20
- { chain: "arbitrum", chainId: 42161, family: "evm" },
21
- { chain: "avalanche", chainId: 43114, family: "evm" },
22
- { chain: "hyperliquid", chainId: null, family: "hyperliquid" },
23
- ]);
24
-
25
- const KNOWN_UNSUPPORTED = Object.freeze([
26
- { family: "evm", chain: "bsc", chainId: 56, reason: "OpenSea account inventory does not support BSC" },
27
- { family: "cosmos", reason: "requires a chain-specific bech32 address and NFT indexer" },
28
- { family: "sui", reason: "owner inventory adapter not installed" },
29
- { family: "aptos", reason: "owner inventory adapter not installed" },
30
- ]);
31
-
32
- function childOpts(opts = {}, key) {
33
- return {
34
- fetchImpl: opts.fetchImpl,
35
- timeoutMs: opts.timeoutMs,
36
- ...(opts[key] || {}),
37
- };
38
- }
39
-
40
- async function safe(label, fn) {
41
- const result = await timed(fn);
42
- return result.ok
43
- ? { ok: true, data: result.data }
44
- : { ok: false, error: `${label}: ${result.error}`.slice(0, 300) };
45
- }
46
-
47
- function rowsFromSatflow(contents) {
48
- if (Array.isArray(contents)) return contents;
49
- for (const key of ["items", "results", "ordinals", "inscriptions", "data"]) {
50
- if (Array.isArray(contents?.[key])) return contents[key];
51
- }
52
- return [];
53
- }
54
-
55
- function normalizeSatflowItem(raw = {}, owner) {
56
- const inscriptionId = raw.inscription_id || raw.inscriptionId || raw.id || raw.inscription || null;
57
- return {
58
- chain: "bitcoin",
59
- family: "bitcoin",
60
- owner,
61
- contract: null,
62
- tokenId: inscriptionId == null ? null : String(inscriptionId),
63
- tokenStandard: "ordinal",
64
- collection: raw.collection_slug || raw.collectionSlug || raw.collection?.slug || raw.collection || null,
65
- name: raw.name || raw.meta?.name || (inscriptionId ? `Inscription ${inscriptionId}` : "Bitcoin inscription"),
66
- description: raw.description || raw.meta?.description || null,
67
- imageUrl: raw.image_url || raw.imageUrl || raw.content_url || raw.contentUrl || raw.thumbnail || null,
68
- originalImageUrl: raw.content_url || raw.contentUrl || raw.image_url || raw.imageUrl || null,
69
- animationUrl: null,
70
- metadataUrl: raw.metadata_url || raw.metadataUrl || null,
71
- marketplaceUrl: raw.marketplace_url || raw.marketplaceUrl || null,
72
- estimatedValueUsd: raw.estimated_value_usd != null && Number.isFinite(Number(raw.estimated_value_usd))
73
- ? Number(raw.estimated_value_usd)
74
- : null,
75
- estimatedValueSats: (raw.floor_price_sats ?? raw.price_sats) != null && Number.isFinite(Number(raw.floor_price_sats ?? raw.price_sats))
76
- ? Number(raw.floor_price_sats ?? raw.price_sats)
77
- : null,
78
- spam: false,
79
- disabled: false,
80
- nsfw: false,
81
- listed: raw.listed === true || raw.is_listed === true,
82
- listingId: raw.listing_id || raw.listingId || null,
83
- traits: Array.isArray(raw.traits) ? raw.traits : [],
84
- updatedAt: raw.updated_at || raw.updatedAt || null,
85
- acquisitionCost: null,
86
- itemPnl: {
87
- status: "unavailable",
88
- reason: "Satflow wallet inventory does not expose trustworthy acquisition cost",
89
- },
90
- listingAdapter: "satflow",
91
- source: "satflow-wallet-contents",
92
- };
93
- }
94
-
95
- function normalizeFallbackInscription(id, owner) {
96
- return {
97
- chain: "bitcoin",
98
- family: "bitcoin",
99
- owner,
100
- contract: null,
101
- tokenId: String(id),
102
- tokenStandard: "ordinal",
103
- collection: null,
104
- name: `Inscription ${id}`,
105
- description: null,
106
- imageUrl: null,
107
- originalImageUrl: null,
108
- animationUrl: null,
109
- metadataUrl: null,
110
- marketplaceUrl: null,
111
- estimatedValueUsd: null,
112
- spam: false,
113
- disabled: false,
114
- nsfw: false,
115
- traits: [],
116
- updatedAt: null,
117
- acquisitionCost: null,
118
- itemPnl: { status: "unavailable", reason: "address indexer returned no acquisition or valuation data" },
119
- listingAdapter: "satflow",
120
- source: "bitcoin-meta-address-indexer",
121
- };
122
- }
123
-
124
- export function nftAssetKey(item = {}) {
125
- return [item.chain || "unknown", item.contract || "native", item.tokenId || "unknown"].join(":").toLowerCase();
126
- }
127
-
128
- function costBasisMap(input) {
129
- const out = new Map();
130
- if (Array.isArray(input)) {
131
- for (const row of input) {
132
- if (row?.assetKey) out.set(String(row.assetKey).toLowerCase(), row);
133
- }
134
- return out;
135
- }
136
- if (input && typeof input === "object") {
137
- for (const [key, value] of Object.entries(input)) out.set(key.toLowerCase(), value);
138
- }
139
- return out;
140
- }
141
-
142
- function applyCostBasis(item, basis) {
143
- const key = nftAssetKey(item);
144
- const row = basis.get(key);
145
- const current = item.estimatedValueUsd == null ? null : Number(item.estimatedValueUsd);
146
- if (!row) return { ...item, assetKey: key };
147
- const cost = Number(row.costUsd);
148
- const fees = Number(row.feesUsd ?? 0);
149
- if (!Number.isFinite(cost) || cost < 0 || !Number.isFinite(fees) || fees < 0) {
150
- return {
151
- ...item,
152
- assetKey: key,
153
- acquisitionCost: null,
154
- itemPnl: { status: "unavailable", reason: "invalid user-supplied cost basis" },
155
- };
156
- }
157
- const totalCostUsd = Math.round((cost + fees) * 100) / 100;
158
- if (!Number.isFinite(current)) {
159
- return {
160
- ...item,
161
- assetKey: key,
162
- acquisitionCost: {
163
- costUsd: cost,
164
- feesUsd: fees,
165
- totalCostUsd,
166
- acquiredAt: row.acquiredAt || null,
167
- source: row.source || "user-supplied",
168
- },
169
- itemPnl: { status: "unavailable", reason: "current NFT valuation is unavailable" },
170
- };
171
- }
172
- return {
173
- ...item,
174
- assetKey: key,
175
- acquisitionCost: {
176
- costUsd: cost,
177
- feesUsd: fees,
178
- totalCostUsd,
179
- acquiredAt: row.acquiredAt || null,
180
- source: row.source || "user-supplied",
181
- },
182
- itemPnl: {
183
- status: "estimated",
184
- methodology: "provider estimated current value minus supplied USD acquisition cost and fees",
185
- unrealizedUsd: Math.round((current - totalCostUsd) * 100) / 100,
186
- currentValueUsd: current,
187
- totalCostUsd,
188
- realizedUsd: null,
189
- },
190
- };
191
- }
192
-
193
- function dedupe(items) {
194
- const map = new Map();
195
- for (const item of items) {
196
- const key = nftAssetKey(item);
197
- if (!map.has(key)) map.set(key, item);
198
- }
199
- return [...map.values()];
200
- }
201
-
202
- function pnlSummary(items, accountPnl) {
203
- const known = items.filter((item) => item.itemPnl?.status === "estimated");
204
- const unknown = items.length - known.length;
205
- const knownUnrealizedUsd = Math.round(
206
- known.reduce((sum, item) => sum + Number(item.itemPnl.unrealizedUsd || 0), 0) * 100,
207
- ) / 100;
208
- return {
209
- nftItemPnl: {
210
- status: unknown === 0 && items.length ? "estimated-complete-for-held-items" : known.length ? "partial" : "unavailable",
211
- methodology: "Only items with explicit acquisition cost and provider estimated current value are included",
212
- knownUnrealizedUsd,
213
- knownItems: known.length,
214
- unknownItems: unknown,
215
- realizedUsd: null,
216
- warning: "Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete.",
217
- },
218
- providerAccountPnl: accountPnl,
219
- };
220
- }
221
-
222
- /** One normalized owner NFT inventory with per-chain partial failure reporting. */
223
- export async function nftHealth() {
224
- return {
225
- ok: true,
226
- provider: "nft-portfolio",
227
- readOnly: true,
228
- marketplaces: ["opensea", "magiceden-sol", "satflow"],
229
- listingExecution: "prepare-only",
230
- };
231
- }
232
-
233
- export async function nftInventory(args = {}, opts = {}) {
234
- const generatedAt = new Date().toISOString();
235
- const addresses = resolvePortfolioAddresses(args, opts.env || process.env);
236
- const selected = Array.isArray(args.chains) && args.chains.length
237
- ? new Set(args.chains.map((value) => String(value).toLowerCase()))
238
- : null;
239
- const openSeaChains = OPENSEA_WALLET_CHAINS.filter((row) => !selected || selected.has(row.chain));
240
- const coverage = [];
241
- const items = [];
242
- const openseaOpts = childOpts(opts, "opensea");
243
-
244
- const evmRows = addresses.evm
245
- ? openSeaChains.filter((row) => row.family !== "solana")
246
- : [];
247
- const evmResults = await mapLimit(evmRows, 4, async (row) => ({
248
- row,
249
- result: await safe(
250
- `opensea-${row.chain}`,
251
- () => openseaAccountNfts({
252
- chain: row.chain,
253
- address: addresses.evm,
254
- pageSize: args.pageSize,
255
- maxPages: args.maxPages,
256
- }, openseaOpts),
257
- opts.timeoutMs ?? 35_000,
258
- ),
259
- }));
260
-
261
- for (const { row, result } of evmResults) {
262
- if (result.ok) {
263
- const rows = result.data.nfts.map((item) => ({
264
- ...item,
265
- family: row.family,
266
- chainId: row.chainId,
267
- listingAdapter: "opensea",
268
- source: "opensea-account-inventory",
269
- }));
270
- items.push(...rows);
271
- coverage.push({
272
- family: row.family,
273
- chain: row.chain,
274
- chainId: row.chainId,
275
- status: result.data.complete ? "ok" : "partial",
276
- count: rows.length,
277
- complete: result.data.complete,
278
- next: result.data.next,
279
- source: "opensea",
280
- });
281
- } else {
282
- coverage.push({ family: row.family, chain: row.chain, chainId: row.chainId, status: "unavailable", error: result.error, source: "opensea" });
283
- }
284
- }
285
-
286
- if (!addresses.evm) {
287
- for (const row of openSeaChains.filter((item) => item.family !== "solana")) {
288
- coverage.push({ family: row.family, chain: row.chain, chainId: row.chainId, status: "not-configured", reason: "EVM address missing" });
289
- }
290
- }
291
-
292
- if (addresses.solana && (!selected || selected.has("solana"))) {
293
- const result = await safe(
294
- "opensea-solana",
295
- () => openseaAccountNfts({
296
- chain: "solana",
297
- address: addresses.solana,
298
- pageSize: args.pageSize,
299
- maxPages: args.maxPages,
300
- }, openseaOpts),
301
- opts.timeoutMs ?? 35_000,
302
- );
303
- if (result.ok) {
304
- const rows = result.data.nfts.map((item) => ({
305
- ...item,
306
- family: "solana",
307
- chainId: null,
308
- listingAdapter: null,
309
- source: "opensea-account-inventory",
310
- }));
311
- items.push(...rows);
312
- coverage.push({ family: "solana", chain: "solana", status: result.data.complete ? "ok" : "partial", count: rows.length, complete: result.data.complete, next: result.data.next, source: "opensea" });
313
- } else {
314
- coverage.push({ family: "solana", chain: "solana", status: "unavailable", error: result.error, source: "opensea" });
315
- }
316
- } else if (!selected || selected.has("solana")) {
317
- coverage.push({ family: "solana", chain: "solana", status: "not-configured", reason: "Solana address missing" });
318
- }
319
-
320
- if (addresses.bitcoin && (!selected || selected.has("bitcoin"))) {
321
- const satflow = await safe(
322
- "satflow-wallet-contents",
323
- () => satflowWalletContents({ address: addresses.bitcoin, type: "ordinals", limit: args.bitcoinLimit ?? 100, offset: 0 }, childOpts(opts, "satflow")),
324
- opts.timeoutMs ?? 35_000,
325
- );
326
- if (satflow.ok) {
327
- const rows = rowsFromSatflow(satflow.data.contents).map((item) => normalizeSatflowItem(item, addresses.bitcoin));
328
- items.push(...rows);
329
- const complete = rows.length < Number(args.bitcoinLimit ?? 100);
330
- coverage.push({ family: "bitcoin", chain: "bitcoin", status: complete ? "ok" : "partial", count: rows.length, complete, source: "satflow" });
331
- } else {
332
- const fallback = await safe(
333
- "bitcoin-meta-inscriptions",
334
- () => btcInscriptions({ address: addresses.bitcoin }, childOpts(opts, "bitcoinMeta")),
335
- opts.timeoutMs ?? 35_000,
336
- );
337
- const ids = fallback.ok && fallback.data?.ok && Array.isArray(fallback.data.inscriptions)
338
- ? fallback.data.inscriptions
339
- : [];
340
- items.push(...ids.map((id) => normalizeFallbackInscription(id, addresses.bitcoin)));
341
- coverage.push({
342
- family: "bitcoin",
343
- chain: "bitcoin",
344
- status: ids.length ? "partial" : "unavailable",
345
- count: ids.length,
346
- complete: false,
347
- source: ids.length ? "bitcoin-meta" : "satflow",
348
- error: ids.length ? "Satflow unavailable; fallback has IDs only" : satflow.error,
349
- });
350
- }
351
- } else if (!selected || selected.has("bitcoin")) {
352
- coverage.push({ family: "bitcoin", chain: "bitcoin", status: "not-configured", reason: "Bitcoin address missing" });
353
- }
354
-
355
- const accountPnl = [];
356
- if (args.includePnl !== false) {
357
- for (const address of [...new Set([addresses.evm, addresses.solana].filter(Boolean))]) {
358
- const result = await safe(
359
- `opensea-pnl-${address}`,
360
- () => openseaAccountPnl({ address }, openseaOpts),
361
- opts.timeoutMs ?? 35_000,
362
- );
363
- accountPnl.push(result.ok
364
- ? { status: "ok", ...result.data }
365
- : { status: "unavailable", address, source: "opensea-indexed-account-pnl", error: result.error });
366
- }
367
- }
368
-
369
- const basis = costBasisMap(args.costBasis);
370
- const normalized = dedupe(items).map((item) => applyCostBasis(item, basis));
371
- const visible = normalized.filter((item) => !item.spam);
372
- const flagged = normalized.filter((item) => item.spam);
373
- const estimated = visible.filter((item) =>
374
- item.estimatedValueUsd != null && Number.isFinite(Number(item.estimatedValueUsd)),
375
- );
376
- const estimatedCurrentValueUsd = Math.round(
377
- estimated.reduce((sum, item) => sum + Number(item.estimatedValueUsd), 0) * 100,
378
- ) / 100;
379
- const missingValueItems = visible.length - estimated.length;
380
- const failedCoverage = coverage.filter((row) => row.status !== "ok" || row.complete === false);
381
-
382
- return {
383
- provider: "nft-portfolio",
384
- operation: "inventory",
385
- readOnly: true,
386
- generatedAt,
387
- addresses,
388
- coverage,
389
- unsupported: KNOWN_UNSUPPORTED,
390
- inventory: {
391
- count: normalized.length,
392
- visibleCount: visible.length,
393
- flaggedCount: flagged.length,
394
- items: normalized,
395
- visibleItems: visible,
396
- flaggedItems: flagged,
397
- },
398
- valuation: {
399
- estimatedCurrentValueUsd,
400
- valuedItems: estimated.length,
401
- unvaluedItems: missingValueItems,
402
- complete: missingValueItems === 0 && failedCoverage.length === 0,
403
- methodology: "Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid.",
404
- },
405
- pnl: pnlSummary(visible, accountPnl),
406
- listingCoverage: {
407
- opensea: "EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",
408
- satflow: "Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",
409
- solana: "Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",
410
- unsupported: "Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed",
411
- },
412
- metadataSafety: {
413
- imagesAreUntrusted: true,
414
- animationAndHtmlNotRendered: true,
415
- galleryRasterOnly: true,
416
- missingImagesUsePlaceholders: true,
417
- },
418
- };
419
- }
420
-
421
- function futureUnixSeconds(value, label) {
422
- const raw = typeof value === "number" ? value * 1000 : Date.parse(String(value || ""));
423
- if (!Number.isFinite(raw)) throw new Error(`${label} must be an ISO 8601 timestamp or Unix seconds`);
424
- const seconds = Math.floor(raw / 1000);
425
- if (seconds <= Math.floor(Date.now() / 1000)) throw new Error(`${label} must be in the future`);
426
- return seconds;
427
- }
428
-
429
- function positiveSats(value) {
430
- const text = String(value ?? "").trim();
431
- if (!/^[1-9]\d*$/.test(text)) throw new Error("Bitcoin NFT list priceSats must be a positive integer");
432
- return text;
433
- }
434
-
435
- export async function nftPrepareList(args = {}, opts = {}) {
436
- if (args.userConfirmed !== true) {
437
- throw new Error("NFT listing preparation requires userConfirmed=true after reviewing asset, marketplace, price, currency, fees, royalties, and expiry");
438
- }
439
- const marketplace = String(args.marketplace || "").trim().toLowerCase();
440
- if (marketplace === "opensea") {
441
- return openseaPrepareList(args, childOpts(opts, "opensea"));
442
- }
443
- if (marketplace === "magiceden" || marketplace === "magiceden-sol") {
444
- const expiry = futureUnixSeconds(args.expiry ?? args.endTime, "Solana NFT listing expiry");
445
- return magicEdenSolPrepareList({ ...args, expiry }, childOpts(opts, "magiceden"));
446
- }
447
- if (marketplace === "satflow") {
448
- const expiry = futureUnixSeconds(args.expiry ?? args.endTime ?? args.expiresAt, "Bitcoin NFT listing expiry");
449
- return satflowPrepareList({
450
- inscription_id: args.inscriptionId || args.tokenId,
451
- runes_output: args.runesOutput,
452
- ord_address: args.ordAddress || args.seller,
453
- receive_address: args.receiveAddress,
454
- price: positiveSats(args.priceSats ?? args.price),
455
- tap_key: args.tapKey,
456
- collection_slug: args.collectionSlug || args.collection,
457
- expires_at: expiry,
458
- }, childOpts(opts, "satflow"));
459
- }
460
- throw new Error(`unsupported NFT marketplace: ${marketplace || "<missing>"}`);
461
- }
462
-
463
- export async function nftPnl(args = {}, opts = {}) {
464
- const inventory = await nftInventory({ ...args, includePnl: true }, opts);
465
- return {
466
- provider: "nft-portfolio",
467
- operation: "pnl",
468
- readOnly: true,
469
- generatedAt: inventory.generatedAt,
470
- addresses: inventory.addresses,
471
- coverage: inventory.coverage,
472
- unsupported: inventory.unsupported,
473
- valuation: inventory.valuation,
474
- pnl: inventory.pnl,
475
- };
476
- }
477
-
478
- export async function nftPortfolioGallery(args = {}, opts = {}) {
479
- let items = Array.isArray(args.items) ? args.items : null;
480
- let inventory = null;
481
- if (!items) {
482
- inventory = await nftInventory({ ...args, includePnl: false }, opts);
483
- items = inventory.inventory.visibleItems;
484
- }
485
- const gallery = await nftGallery({ ...args, items }, childOpts(opts, "gallery"));
486
- return {
487
- ...gallery,
488
- inventorySummary: inventory ? {
489
- visibleCount: inventory.inventory.visibleCount,
490
- flaggedCount: inventory.inventory.flaggedCount,
491
- coverage: inventory.coverage,
492
- } : null,
493
- };
494
- }
@@ -1,156 +0,0 @@
1
- // DEPRECATED UPSTREAM (2026-07-30).
2
- //
3
- // Odos sunset their public SOR API. Both /sor/quote/v2 and /sor/quote/v3 return
4
- // HTTP 410 Gone with `sunset: Thu, 30 Jul 2026 12:00:00 GMT` and a link to the
5
- // protocol's deprecation notice.
6
- //
7
- // The module is kept rather than deleted so that (a) an existing caller gets a
8
- // clear 410 instead of a missing-import crash, and (b) it re-activates if Odos
9
- // ships a replacement endpoint. The best-execution router already tolerates a
10
- // failing source, so this degrades the comparison by one source rather than
11
- // breaking it.
12
- //
13
- // Do NOT mark this provider as healthy in the catalog while the sunset stands.
14
-
15
- // Odos public SOR v3 quote + simulated transaction assembly.
16
- import { isAddress } from "ethers";
17
- import { httpJson } from "../http.mjs";
18
- import { attachAutoSlippage, bindAutoSlippageGuardToCall, resolveAutoSlippage } from "../../auto-slippage.mjs";
19
- import { stampPrepared } from "../../prepare-envelope.mjs";
20
-
21
- export const ODOS_API = "https://api.odos.xyz";
22
- const base = (o = {}) => (o.baseUrl || process.env.ODOS_API_URL || ODOS_API).replace(/\/$/, "");
23
-
24
- export async function odosChains(opts = {}) {
25
- return httpJson(`${base(opts)}/info/chains`, { fetchImpl: opts.fetchImpl, timeoutMs: opts.timeoutMs });
26
- }
27
-
28
- function validateQuoteArgs(args = {}) {
29
- const chainId = Number(args.chainId);
30
- if (!Number.isInteger(chainId)) throw new Error("odos: chainId required");
31
- if (!Array.isArray(args.inputTokens) || args.inputTokens.length < 1) throw new Error("odos: inputTokens[] required");
32
- if (!Array.isArray(args.outputTokens) || args.outputTokens.length !== 1) {
33
- throw new Error("odos: agentic execution currently requires exactly one output token");
34
- }
35
- if (!isAddress(String(args.userAddr || ""))) throw new Error("odos: valid userAddr required");
36
- return chainId;
37
- }
38
-
39
- async function rawQuote(args = {}, opts = {}) {
40
- const chainId = validateQuoteArgs(args);
41
- const selected = resolveAutoSlippage({
42
- liquidityUsd: args.liquidityUsd,
43
- priceChange5m: args.priceChange5m,
44
- requestedCapBps: args.maxSlippageBps ?? args.slippageBps,
45
- });
46
- if (!selected.executable) {
47
- throw new Error(`odos: route requires ${selected.requiredBps} bps above cap ${selected.capBps}`);
48
- }
49
- const body = {
50
- chainId,
51
- inputTokens: args.inputTokens,
52
- outputTokens: args.outputTokens,
53
- userAddr: args.userAddr,
54
- slippageLimitPercent: selected.selectedBps / 100,
55
- disableRFQs: args.disableRFQs ?? true,
56
- compact: args.compact ?? true,
57
- simple: args.simple ?? false,
58
- };
59
- const quote = await httpJson(`${base(opts)}/sor/quote/v3`, {
60
- method: "POST",
61
- body,
62
- fetchImpl: opts.fetchImpl,
63
- timeoutMs: opts.timeoutMs ?? 25_000,
64
- });
65
- const amountOut = quote?.outAmounts?.[0];
66
- if (!quote?.pathId || !amountOut) throw new Error("odos: quote missing pathId or outAmounts[0]");
67
- return { chainId, selected, quote, amountOut };
68
- }
69
-
70
- export async function odosQuote(args = {}, opts = {}) {
71
- const { chainId, quote, amountOut } = await rawQuote(args, opts);
72
- return {
73
- ...attachAutoSlippage(quote, {
74
- chainId,
75
- venue: "odos-quote",
76
- amountOut,
77
- liquidityUsd: args.liquidityUsd,
78
- priceChange5m: args.priceChange5m,
79
- requestedCapBps: args.maxSlippageBps ?? args.slippageBps,
80
- }),
81
- executionReady: false,
82
- executionBlocker: "call prepare to assemble and simulate the path",
83
- };
84
- }
85
-
86
- export async function odosPrepare(args = {}, opts = {}) {
87
- const { chainId, quote: quoteRaw, amountOut } = await rawQuote(args, opts);
88
- const assembled = await httpJson(`${base(opts)}/sor/assemble`, {
89
- method: "POST",
90
- body: {
91
- userAddr: args.userAddr,
92
- pathId: quoteRaw.pathId,
93
- simulate: true,
94
- ...(args.receiver ? { receiver: args.receiver } : {}),
95
- },
96
- fetchImpl: opts.fetchImpl,
97
- timeoutMs: opts.timeoutMs ?? 30_000,
98
- });
99
- const tx = assembled?.transaction;
100
- if (!tx?.to || !tx?.data) throw new Error("odos: assemble returned no executable transaction");
101
- if (Number(tx.chainId ?? chainId) !== chainId) throw new Error("odos: transaction chain mismatch");
102
- if (tx.from && String(tx.from).toLowerCase() !== String(args.userAddr).toLowerCase()) {
103
- throw new Error("odos: transaction sender mismatch");
104
- }
105
- if (assembled?.simulation?.isSuccess !== true) {
106
- throw new Error(`odos: assembled transaction simulation failed: ${assembled?.simulation?.simulationError || "unknown"}`);
107
- }
108
- const quote = attachAutoSlippage(quoteRaw, {
109
- chainId,
110
- venue: tx.to,
111
- amountOut,
112
- liquidityUsd: args.liquidityUsd,
113
- priceChange5m: args.priceChange5m,
114
- requestedCapBps: args.maxSlippageBps ?? args.slippageBps,
115
- });
116
- const simulatedOut = assembled?.simulation?.amountsOut?.[0];
117
- if (simulatedOut != null && BigInt(simulatedOut) < BigInt(quote.amountOutMinimum)) {
118
- throw new Error("odos: simulation output is below the bounded automatic floor");
119
- }
120
- const native = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
121
- const zeroNative = "0x0000000000000000000000000000000000000000";
122
- const approvals = args.inputTokens
123
- .filter((item) => ![native, zeroNative].includes(String(item.tokenAddress).toLowerCase()))
124
- .map((item) => ({ token: item.tokenAddress, spender: tx.to, amount: String(item.amount) }));
125
- return stampPrepared({
126
- provider: "odos",
127
- calldataReady: true,
128
- // NOT executable authority. The bytes are assembled but nothing is signed:
129
- // the user's wallet is still the only thing that can authorize this. The
130
- // previous `executionReady: true` read as "cleared to execute" and trained
131
- // agents to treat a quote as permission.
132
- requiresUserSignature: true,
133
- signingReady: false,
134
- broadcastReady: false,
135
- chainId,
136
- quote,
137
- simulation: assembled.simulation,
138
- requiresApproval: approvals,
139
- autoSlippage: quote.autoSlippage,
140
- transaction: {
141
- chainId,
142
- from: tx.from || args.userAddr,
143
- to: tx.to,
144
- data: tx.data,
145
- value: tx.value ?? "0x0",
146
- ...(tx.gas != null ? { gasLimit: tx.gas } : {}),
147
- ...(tx.nonce != null ? { nonce: tx.nonce } : {}),
148
- slippageGuard: bindAutoSlippageGuardToCall(quote.autoSlippage, { chainId, venue: tx.to, data: tx.data }),
149
- },
150
- }, { provider: "odos", kind: "odos-tx" });
151
- }
152
-
153
- export async function odosHealth(opts = {}) {
154
- const data = await odosChains(opts);
155
- return { ok: Array.isArray(data?.chains) && data.chains.length > 0, chainCount: data?.chains?.length || 0 };
156
- }
@@ -1,31 +0,0 @@
1
- // Ondo Finance — tokenized real-world assets (USDY, OUSG treasuries).
2
- // https://ondo.finance — public pool data.
3
- // Never signs, never broadcasts.
4
-
5
- import { httpJson } from "../http.mjs";
6
-
7
- export const ONDO_API = "https://api.ondo.finance/v1";
8
-
9
- export async function ondoPools() {
10
- try {
11
- const data = await httpJson(`${ONDO_API}/pools`);
12
- return (data?.pools || data || []).map(p => ({
13
- name: p?.name,
14
- symbol: p?.symbol,
15
- apy: p?.apy ? `${(Number(p.apy) * 100).toFixed(2)}%` : null,
16
- tvl: p?.tvl,
17
- chain: p?.chain,
18
- type: "RWA", // real-world asset
19
- }));
20
- } catch (e) {
21
- return { error: String(e.message || e).slice(0, 200) };
22
- }
23
- }
24
-
25
- export async function ondoHealth() {
26
- try {
27
- return { ok: true, note: "Ondo Finance — tokenized US treasuries + bonds" };
28
- } catch (e) {
29
- return { ok: false, error: String(e.message || e).slice(0, 160) };
30
- }
31
- }