@oracle-agent/oracle 0.14.0 → 0.15.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 (447) 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 +59 -0
  7. package/dist/bin/oracle-data-mcp.mjs +8 -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 +61 -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/swap.mjs +36 -0
  44. package/dist/cli/commands/upgrade.mjs +2 -0
  45. package/dist/cli/commands/vault.mjs +1 -0
  46. package/dist/cli/commands/version.mjs +2 -0
  47. package/dist/data/desk-data.mjs +55 -0
  48. package/dist/data/names.mjs +2 -0
  49. package/dist/data/providers/farming.mjs +2 -0
  50. package/dist/equities/index.mjs +1 -0
  51. package/dist/index.mjs +60 -0
  52. package/dist/nft-gas-war-guard.mjs +1 -0
  53. package/dist/onboarding/harness-configs.mjs +4 -0
  54. package/dist/portfolio-risk.mjs +1 -0
  55. package/dist/prepare-envelope.mjs +1 -0
  56. package/dist/public-api/agent-grants.mjs +3 -0
  57. package/dist/public-control/policy-schema.mjs +1 -0
  58. package/dist/router/index.mjs +2 -0
  59. package/dist/scanner/index.mjs +4 -0
  60. package/dist/signals/index.mjs +1 -0
  61. package/dist/watch-preferences.mjs +1 -0
  62. package/package.json +32 -78
  63. package/public/oracle-splash/_variants/ice.html +5 -18
  64. package/public/oracle-splash/_variants/ivory.html +5 -18
  65. package/public/oracle-splash/index.html +114 -34
  66. package/CONTRIBUTING.md +0 -99
  67. package/bin/desk-server.mjs +0 -473
  68. package/bin/oracle-data-mcp.mjs +0 -1252
  69. package/bin/oracle-equities.mjs +0 -168
  70. package/bin/oracle-init.mjs +0 -525
  71. package/bin/oracle-public-server.mjs +0 -36
  72. package/bin/oracle-route.mjs +0 -254
  73. package/bin/oracle-scan.mjs +0 -192
  74. package/bin/oracle-upgrade.mjs +0 -42
  75. package/bin/oracle.mjs +0 -34
  76. package/docs/adding-a-chain.md +0 -229
  77. package/docs/architecture.md +0 -139
  78. package/docs/buzz-integration.md +0 -115
  79. package/docs/cli.md +0 -143
  80. package/docs/connectors.md +0 -13
  81. package/docs/hyperliquid-builder-code.md +0 -50
  82. package/docs/locals-only-fee-waiver.md +0 -34
  83. package/docs/oracle-pack-standard.md +0 -29
  84. package/docs/profiles.md +0 -151
  85. package/docs/public-surface.md +0 -206
  86. package/examples/add-a-chain.mjs +0 -65
  87. package/examples/oracle-pack-template.mjs +0 -38
  88. package/examples/research-a-token.mjs +0 -70
  89. package/plugins/oracle-owner-gate/__init__.py +0 -288
  90. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  91. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  92. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  93. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  94. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  95. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  96. package/scripts/adversarial-bench.mjs +0 -114
  97. package/scripts/build-dist.mjs +0 -119
  98. package/scripts/build-inscription.py +0 -230
  99. package/scripts/check-doc-drift.mjs +0 -123
  100. package/scripts/check-test-count.mjs +0 -105
  101. package/scripts/e2e-hl-markets.mjs +0 -21
  102. package/scripts/e2e-hl-perps.mjs +0 -48
  103. package/scripts/e2e-hypercore-staking.mjs +0 -128
  104. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  105. package/scripts/guard-publish.mjs +0 -22
  106. package/scripts/protocol-template-gate.mjs +0 -15
  107. package/scripts/public-api-scan.mjs +0 -23
  108. package/scripts/publish-dist.mjs +0 -67
  109. package/scripts/record-hero-cli.sh +0 -80
  110. package/scripts/secret-scan.mjs +0 -168
  111. package/scripts/smoke-dist-bins.mjs +0 -89
  112. package/scripts/verify-dist.mjs +0 -29
  113. package/scripts/verify-v3-venues.mjs +0 -233
  114. package/skins/oracle.yaml +0 -56
  115. package/src/action-receipts.mjs +0 -265
  116. package/src/action-semantics.mjs +0 -62
  117. package/src/address-book.mjs +0 -208
  118. package/src/agent-auth.mjs +0 -206
  119. package/src/approval-guard.mjs +0 -282
  120. package/src/attestation-secret.mjs +0 -94
  121. package/src/audit-log.mjs +0 -196
  122. package/src/auth/oauth.mjs +0 -672
  123. package/src/auto-slippage.mjs +0 -378
  124. package/src/capability-posture.mjs +0 -125
  125. package/src/cards.mjs +0 -422
  126. package/src/chains.mjs +0 -62
  127. package/src/cli/chain-catalog.mjs +0 -215
  128. package/src/cli/chain-state.mjs +0 -74
  129. package/src/cli/commands/auth.mjs +0 -193
  130. package/src/cli/commands/bootstrap.mjs +0 -87
  131. package/src/cli/commands/chain.mjs +0 -143
  132. package/src/cli/commands/chat.mjs +0 -465
  133. package/src/cli/commands/credential.mjs +0 -9
  134. package/src/cli/commands/data-mcp.mjs +0 -18
  135. package/src/cli/commands/data.mjs +0 -75
  136. package/src/cli/commands/doctor.mjs +0 -136
  137. package/src/cli/commands/equities.mjs +0 -41
  138. package/src/cli/commands/farm.mjs +0 -129
  139. package/src/cli/commands/fees.mjs +0 -109
  140. package/src/cli/commands/follow.mjs +0 -130
  141. package/src/cli/commands/harness.mjs +0 -63
  142. package/src/cli/commands/help.mjs +0 -7
  143. package/src/cli/commands/init.mjs +0 -27
  144. package/src/cli/commands/mcp.mjs +0 -154
  145. package/src/cli/commands/model.mjs +0 -106
  146. package/src/cli/commands/plugins.mjs +0 -241
  147. package/src/cli/commands/prepare.mjs +0 -12
  148. package/src/cli/commands/public.mjs +0 -20
  149. package/src/cli/commands/resolve.mjs +0 -64
  150. package/src/cli/commands/route.mjs +0 -12
  151. package/src/cli/commands/runner.mjs +0 -9
  152. package/src/cli/commands/scan.mjs +0 -12
  153. package/src/cli/commands/setup.mjs +0 -294
  154. package/src/cli/commands/sign.mjs +0 -21
  155. package/src/cli/commands/signer.mjs +0 -9
  156. package/src/cli/commands/swap.mjs +0 -102
  157. package/src/cli/commands/upgrade.mjs +0 -12
  158. package/src/cli/commands/vault.mjs +0 -9
  159. package/src/cli/commands/version.mjs +0 -22
  160. package/src/cli/first-run.mjs +0 -23
  161. package/src/cli/kernel.mjs +0 -262
  162. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  163. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  164. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  165. package/src/cli/mcp-targets/codex.mjs +0 -41
  166. package/src/cli/mcp-targets/cursor.mjs +0 -32
  167. package/src/cli/mcp-targets/shared.mjs +0 -71
  168. package/src/cli/mcp-targets/vscode.mjs +0 -39
  169. package/src/cli/messaging-platforms.mjs +0 -217
  170. package/src/cli/model-config.mjs +0 -78
  171. package/src/cli/operator-dispatch.mjs +0 -257
  172. package/src/cli/oracle-harness.py +0 -415
  173. package/src/cli/paths.mjs +0 -107
  174. package/src/cli/runtime.mjs +0 -351
  175. package/src/cli/setup-state.mjs +0 -168
  176. package/src/cli/spawn-child.mjs +0 -43
  177. package/src/data/catalog.mjs +0 -858
  178. package/src/data/desk-data.mjs +0 -877
  179. package/src/data/http.mjs +0 -253
  180. package/src/data/names.mjs +0 -188
  181. package/src/data/provider-endpoint.mjs +0 -94
  182. package/src/data/providers/aave-v3.mjs +0 -139
  183. package/src/data/providers/across-bridge.mjs +0 -41
  184. package/src/data/providers/aerodrome.mjs +0 -245
  185. package/src/data/providers/aevo.mjs +0 -33
  186. package/src/data/providers/approval-indexer.mjs +0 -133
  187. package/src/data/providers/approvals.mjs +0 -594
  188. package/src/data/providers/babylon-staking.mjs +0 -149
  189. package/src/data/providers/balancer.mjs +0 -209
  190. package/src/data/providers/beefy-yields.mjs +0 -45
  191. package/src/data/providers/birdeye-tokens.mjs +0 -33
  192. package/src/data/providers/bisq-markets.mjs +0 -145
  193. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  194. package/src/data/providers/bitcoin-meta.mjs +0 -378
  195. package/src/data/providers/blockscout.mjs +0 -14
  196. package/src/data/providers/bob-rootstock.mjs +0 -198
  197. package/src/data/providers/braiins-insights.mjs +0 -103
  198. package/src/data/providers/bridge-aggregator.mjs +0 -259
  199. package/src/data/providers/bridges.mjs +0 -242
  200. package/src/data/providers/bungee.mjs +0 -29
  201. package/src/data/providers/celestia-da.mjs +0 -38
  202. package/src/data/providers/changenow.mjs +0 -135
  203. package/src/data/providers/compound.mjs +0 -32
  204. package/src/data/providers/connext.mjs +0 -28
  205. package/src/data/providers/convex.mjs +0 -30
  206. package/src/data/providers/cow-protocol.mjs +0 -110
  207. package/src/data/providers/cowswap.mjs +0 -415
  208. package/src/data/providers/curve.mjs +0 -201
  209. package/src/data/providers/das-assets.mjs +0 -59
  210. package/src/data/providers/debridge.mjs +0 -109
  211. package/src/data/providers/defillama.mjs +0 -88
  212. package/src/data/providers/dexscreener.mjs +0 -43
  213. package/src/data/providers/drift.mjs +0 -32
  214. package/src/data/providers/dydx.mjs +0 -41
  215. package/src/data/providers/evm-rpc.mjs +0 -225
  216. package/src/data/providers/farming.mjs +0 -291
  217. package/src/data/providers/geckoterminal.mjs +0 -34
  218. package/src/data/providers/gmx.mjs +0 -496
  219. package/src/data/providers/hiro-stacks.mjs +0 -150
  220. package/src/data/providers/hl-assets.mjs +0 -165
  221. package/src/data/providers/hl-info.mjs +0 -108
  222. package/src/data/providers/hl-markets.mjs +0 -210
  223. package/src/data/providers/hl-outcome.mjs +0 -61
  224. package/src/data/providers/hl-perps.mjs +0 -419
  225. package/src/data/providers/hl-staking.mjs +0 -353
  226. package/src/data/providers/hl-ws.mjs +0 -119
  227. package/src/data/providers/hyperevm-dex.mjs +0 -49
  228. package/src/data/providers/jito-mev.mjs +0 -117
  229. package/src/data/providers/jupiter-venues.mjs +0 -119
  230. package/src/data/providers/jupiter.mjs +0 -315
  231. package/src/data/providers/kamino-strategies.mjs +0 -143
  232. package/src/data/providers/l2beat-tvl.mjs +0 -42
  233. package/src/data/providers/lifi.mjs +0 -166
  234. package/src/data/providers/liquid-esplora.mjs +0 -152
  235. package/src/data/providers/magiceden-ordinals.mjs +0 -141
  236. package/src/data/providers/magiceden-sol.mjs +0 -406
  237. package/src/data/providers/mempool-lightning.mjs +0 -144
  238. package/src/data/providers/mempool-mining.mjs +0 -142
  239. package/src/data/providers/meteora-dlmm.mjs +0 -168
  240. package/src/data/providers/morpho.mjs +0 -177
  241. package/src/data/providers/nft-gallery.mjs +0 -163
  242. package/src/data/providers/nft-portfolio.mjs +0 -494
  243. package/src/data/providers/odos.mjs +0 -156
  244. package/src/data/providers/ondo.mjs +0 -31
  245. package/src/data/providers/oneinch.mjs +0 -174
  246. package/src/data/providers/opensea-multichain.mjs +0 -136
  247. package/src/data/providers/opensea-nft.mjs +0 -371
  248. package/src/data/providers/orca.mjs +0 -29
  249. package/src/data/providers/ordinals-runes.mjs +0 -180
  250. package/src/data/providers/pancakeswap.mjs +0 -28
  251. package/src/data/providers/paraswap.mjs +0 -125
  252. package/src/data/providers/pendle.mjs +0 -188
  253. package/src/data/providers/poly-clob.mjs +0 -283
  254. package/src/data/providers/poly-public.mjs +0 -96
  255. package/src/data/providers/poly-ws.mjs +0 -103
  256. package/src/data/providers/polygon-staking.mjs +0 -227
  257. package/src/data/providers/portfolio-history.mjs +0 -394
  258. package/src/data/providers/portfolio.mjs +0 -600
  259. package/src/data/providers/pyth-price-feeds.mjs +0 -172
  260. package/src/data/providers/raydium.mjs +0 -35
  261. package/src/data/providers/relayscan-mev.mjs +0 -72
  262. package/src/data/providers/rfq.mjs +0 -15
  263. package/src/data/providers/rh-agent.mjs +0 -59
  264. package/src/data/providers/sanctum-lst.mjs +0 -180
  265. package/src/data/providers/satflow.mjs +0 -341
  266. package/src/data/providers/signed-material-guard.mjs +0 -108
  267. package/src/data/providers/solana-rpc.mjs +0 -197
  268. package/src/data/providers/solend-lending.mjs +0 -166
  269. package/src/data/providers/spark-lend.mjs +0 -42
  270. package/src/data/providers/squid-router.mjs +0 -29
  271. package/src/data/providers/stargate.mjs +0 -29
  272. package/src/data/providers/sushiswap.mjs +0 -30
  273. package/src/data/providers/symbiotic-restaking.mjs +0 -41
  274. package/src/data/providers/thorchain.mjs +0 -36
  275. package/src/data/providers/traderjoe.mjs +0 -28
  276. package/src/data/providers/twap.mjs +0 -152
  277. package/src/data/providers/uniswap-v3.mjs +0 -457
  278. package/src/data/providers/uniswap-v4.mjs +0 -414
  279. package/src/data/providers/vertex.mjs +0 -41
  280. package/src/data/providers/wallet-watch.mjs +0 -264
  281. package/src/data/providers/wormhole.mjs +0 -28
  282. package/src/data/providers/yearn.mjs +0 -31
  283. package/src/data/providers/zerox.mjs +0 -167
  284. package/src/data/public-api-scan.mjs +0 -61
  285. package/src/data/quote-placeholder.mjs +0 -31
  286. package/src/desk/swap-prepare.mjs +0 -194
  287. package/src/equities/bridge.mjs +0 -388
  288. package/src/equities/fixtures/bridge_routes.json +0 -159
  289. package/src/equities/fixtures/dst_transitions.json +0 -29
  290. package/src/equities/fixtures/equity_dex_pools.json +0 -154
  291. package/src/equities/fixtures/hip3_l2books.json +0 -2711
  292. package/src/equities/fixtures/nyse_holidays.json +0 -1
  293. package/src/equities/fixtures/oracles.json +0 -100
  294. package/src/equities/fixtures/rh_pool_state.json +0 -244
  295. package/src/equities/fixtures/solana_xstocks.json +0 -704
  296. package/src/equities/fixtures/ton_xstocks.json +0 -35
  297. package/src/equities/fixtures/universe.json +0 -411
  298. package/src/equities/fixtures/venues.json +0 -3542
  299. package/src/equities/fixtures.mjs +0 -405
  300. package/src/equities/funding.mjs +0 -142
  301. package/src/equities/index.mjs +0 -166
  302. package/src/equities/liveness.mjs +0 -148
  303. package/src/equities/marketHours.mjs +0 -249
  304. package/src/equities/normalize.mjs +0 -295
  305. package/src/equities/num.mjs +0 -146
  306. package/src/equities/prepare.mjs +0 -95
  307. package/src/equities/rank.mjs +0 -260
  308. package/src/equities/sourceNum.mjs +0 -69
  309. package/src/equities/types.mjs +0 -220
  310. package/src/equities/venues/arcus-perp.mjs +0 -84
  311. package/src/equities/venues/arcus-spot.mjs +0 -105
  312. package/src/equities/venues/hyperliquid-hip3.mjs +0 -224
  313. package/src/equities/venues/rh-uniswap.mjs +0 -216
  314. package/src/equities/venues/solana-xstocks.mjs +0 -139
  315. package/src/equities/venues/ton-stonfi.mjs +0 -139
  316. package/src/exact-integer.mjs +0 -72
  317. package/src/exec-policy.mjs +0 -419
  318. package/src/flags.mjs +0 -15
  319. package/src/fresh-window.mjs +0 -76
  320. package/src/gmx-attestation.mjs +0 -176
  321. package/src/index.mjs +0 -107
  322. package/src/licensing/locals-only.mjs +0 -25
  323. package/src/nft-gas-war-guard.mjs +0 -139
  324. package/src/onboarding/agent-keys.mjs +0 -161
  325. package/src/onboarding/harness-configs.mjs +0 -102
  326. package/src/onboarding/index.mjs +0 -18
  327. package/src/onboarding/tiers.mjs +0 -139
  328. package/src/oracle-env.mjs +0 -55
  329. package/src/package-manifest.mjs +0 -42
  330. package/src/plugins/agent-plugin-loader.mjs +0 -225
  331. package/src/portfolio-risk.mjs +0 -170
  332. package/src/prepare-envelope.mjs +0 -204
  333. package/src/profile-upgrade.mjs +0 -277
  334. package/src/protocol-execution.mjs +0 -84
  335. package/src/protocol-templates/gate.mjs +0 -179
  336. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  337. package/src/public-api/agent-grants.mjs +0 -57
  338. package/src/public-api/buzz-integration.mjs +0 -267
  339. package/src/public-api/connect-agent.mjs +0 -424
  340. package/src/public-api/grants.mjs +0 -142
  341. package/src/public-api/http.mjs +0 -707
  342. package/src/public-api/metering.mjs +0 -111
  343. package/src/public-control/aa-adapter.mjs +0 -402
  344. package/src/public-control/build-registry.mjs +0 -227
  345. package/src/public-control/bundler-client.mjs +0 -357
  346. package/src/public-control/grant-indexer.mjs +0 -296
  347. package/src/public-control/policy-render.mjs +0 -69
  348. package/src/public-control/policy-schema.mjs +0 -322
  349. package/src/public-control/runtime-config.mjs +0 -275
  350. package/src/public-control/session-key-model.mjs +0 -379
  351. package/src/public-control/session-orchestrator.mjs +0 -418
  352. package/src/rfq/intent.mjs +0 -180
  353. package/src/rfq/sources.mjs +0 -181
  354. package/src/route-attestation.mjs +0 -132
  355. package/src/router/best-execution.mjs +0 -326
  356. package/src/router/index.mjs +0 -250
  357. package/src/router/integrator-fee.mjs +0 -135
  358. package/src/router/prepare-bridge.mjs +0 -293
  359. package/src/router/prepare-route.mjs +0 -398
  360. package/src/router/proposal.mjs +0 -311
  361. package/src/router/risk-classifier.mjs +0 -119
  362. package/src/router/route-sources.mjs +0 -364
  363. package/src/scanner/chains.config.mjs +0 -543
  364. package/src/scanner/contract.mjs +0 -270
  365. package/src/scanner/evm-scanner.mjs +0 -394
  366. package/src/scanner/index.mjs +0 -9
  367. package/src/scanner/v2-venue.mjs +0 -351
  368. package/src/scanner/v3-venue.mjs +0 -308
  369. package/src/scopes.mjs +0 -44
  370. package/src/sell-simulation.mjs +0 -167
  371. package/src/signals/engine.mjs +0 -146
  372. package/src/signals/index.mjs +0 -1
  373. package/src/token-transfer-guard.mjs +0 -188
  374. package/src/tui/app.mjs +0 -438
  375. package/src/tui/backend.mjs +0 -215
  376. package/src/tui/format.mjs +0 -272
  377. package/src/tui/gateway-client.mjs +0 -177
  378. package/src/tui/input.mjs +0 -501
  379. package/src/tui/memory.mjs +0 -105
  380. package/src/tui/meta-learn.mjs +0 -85
  381. package/src/tui/renderer.mjs +0 -443
  382. package/src/tui/scheduler.mjs +0 -205
  383. package/src/tui/skills-loader.mjs +0 -140
  384. package/src/tui/standalone-client.mjs +0 -752
  385. package/src/tui/theme.mjs +0 -81
  386. package/src/vault-attestation.mjs +0 -146
  387. package/src/venues.mjs +0 -206
  388. package/src/watch-preferences.mjs +0 -85
  389. /package/{profiles → dist/assets/profiles}/_template/SOUL.md +0 -0
  390. /package/{profiles → dist/assets/profiles}/_template/profile.json +0 -0
  391. /package/{profiles → dist/assets/profiles}/bitcoin-agent/SOUL.md +0 -0
  392. /package/{profiles → dist/assets/profiles}/bitcoin-agent/profile.json +0 -0
  393. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/SOUL.md +0 -0
  394. /package/{profiles → dist/assets/profiles}/hyperliquid-agent/profile.json +0 -0
  395. /package/{profiles → dist/assets/profiles}/oracle/SOUL.md +0 -0
  396. /package/{profiles → dist/assets/profiles}/oracle/profile.json +0 -0
  397. /package/{profiles → dist/assets/profiles}/polymarket-agent/SOUL.md +0 -0
  398. /package/{profiles → dist/assets/profiles}/polymarket-agent/profile.json +0 -0
  399. /package/{profiles → dist/assets/profiles}/profile.schema.json +0 -0
  400. /package/{profiles → dist/assets/profiles}/protocol-builder/SOUL.md +0 -0
  401. /package/{profiles → dist/assets/profiles}/protocol-builder/profile.json +0 -0
  402. /package/{profiles → dist/assets/profiles}/robinhood-agent/SOUL.md +0 -0
  403. /package/{profiles → dist/assets/profiles}/robinhood-agent/profile.json +0 -0
  404. /package/{profiles → dist/assets/profiles}/solana-agent/SOUL.md +0 -0
  405. /package/{profiles → dist/assets/profiles}/solana-agent/profile.json +0 -0
  406. /package/{profiles → dist/assets/profiles}/stable-agent/SOUL.md +0 -0
  407. /package/{profiles → dist/assets/profiles}/stable-agent/profile.json +0 -0
  408. /package/{skills → dist/assets/skills}/balance/SKILL.md +0 -0
  409. /package/{skills → dist/assets/skills}/bitcoin-l1.md +0 -0
  410. /package/{skills → dist/assets/skills}/chain-defi-ecosystem-profiling.md +0 -0
  411. /package/{skills → dist/assets/skills}/evm-contract-research.md +0 -0
  412. /package/{skills → dist/assets/skills}/hyperliquid.md +0 -0
  413. /package/{skills → dist/assets/skills}/multichain-exec-desk.md +0 -0
  414. /package/{skills → dist/assets/skills}/oracle-action-semantics/SKILL.md +0 -0
  415. /package/{skills → dist/assets/skills}/oracle-best-execution/SKILL.md +0 -0
  416. /package/{skills → dist/assets/skills}/oracle-best-execution.md +0 -0
  417. /package/{skills → dist/assets/skills}/oracle-bitcoin/SKILL.md +0 -0
  418. /package/{skills → dist/assets/skills}/oracle-chain-graphs-telegram-cards/SKILL.md +0 -0
  419. /package/{skills → dist/assets/skills}/oracle-chat/SKILL.md +0 -0
  420. /package/{skills → dist/assets/skills}/oracle-chat/chain.SKILL.md +0 -0
  421. /package/{skills → dist/assets/skills}/oracle-chat/setup.SKILL.md +0 -0
  422. /package/{skills → dist/assets/skills}/oracle-circuit-breaker/SKILL.md +0 -0
  423. /package/{skills → dist/assets/skills}/oracle-contract-research/SKILL.md +0 -0
  424. /package/{skills → dist/assets/skills}/oracle-desk/SKILL.md +0 -0
  425. /package/{skills → dist/assets/skills}/oracle-desk.md +0 -0
  426. /package/{skills → dist/assets/skills}/oracle-dex-launch/SKILL.md +0 -0
  427. /package/{skills → dist/assets/skills}/oracle-equities/SKILL.md +0 -0
  428. /package/{skills → dist/assets/skills}/oracle-grants/SKILL.md +0 -0
  429. /package/{skills → dist/assets/skills}/oracle-hypercore-staking/SKILL.md +0 -0
  430. /package/{skills → dist/assets/skills}/oracle-hyperliquid/SKILL.md +0 -0
  431. /package/{skills → dist/assets/skills}/oracle-meme-token-sniper/SKILL.md +0 -0
  432. /package/{skills → dist/assets/skills}/oracle-multichain-nft-launch/SKILL.md +0 -0
  433. /package/{skills → dist/assets/skills}/oracle-multichain-token-launch/SKILL.md +0 -0
  434. /package/{skills → dist/assets/skills}/oracle-nft-gacha-launch/SKILL.md +0 -0
  435. /package/{skills → dist/assets/skills}/oracle-nft-mint-gas-war/SKILL.md +0 -0
  436. /package/{skills → dist/assets/skills}/oracle-polymarket/SKILL.md +0 -0
  437. /package/{skills → dist/assets/skills}/oracle-protocol-builder/SKILL.md +0 -0
  438. /package/{skills → dist/assets/skills}/oracle-protocol-security/SKILL.md +0 -0
  439. /package/{skills → dist/assets/skills}/oracle-public-product/SKILL.md +0 -0
  440. /package/{skills → dist/assets/skills}/oracle-receipts/SKILL.md +0 -0
  441. /package/{skills → dist/assets/skills}/oracle-receipts.md +0 -0
  442. /package/{skills → dist/assets/skills}/oracle-rfq-tokenized-assets/SKILL.md +0 -0
  443. /package/{skills → dist/assets/skills}/oracle-smart-wallet-scanner/SKILL.md +0 -0
  444. /package/{skills → dist/assets/skills}/oracle-solana/SKILL.md +0 -0
  445. /package/{skills → dist/assets/skills}/oracle-solana-nft/SKILL.md +0 -0
  446. /package/{skills → dist/assets/skills}/oracle-token-research/SKILL.md +0 -0
  447. /package/{skills → dist/assets/skills}/solana.md +0 -0
@@ -1,29 +0,0 @@
1
- // Orca — Solana's #2 DEX (concentrated liquidity AMM).
2
- // https://docs.orca.so — public API via Jupiter for quotes.
3
- // Never signs, never broadcasts.
4
-
5
- import { httpJson } from "../http.mjs";
6
-
7
- const JUPITER_QUOTE = "https://quote-api.jup.ag/v6";
8
-
9
- export async function orcaQuote({ inputMint, outputMint, amount, slippageBps = 50 } = {}) {
10
- if (!inputMint || !outputMint || !amount) {
11
- return { error: "orca quote requires inputMint, outputMint, amount" };
12
- }
13
- try {
14
- const params = new URLSearchParams({ inputMint, outputMint, amount: String(amount), slippageBps: String(slippageBps), onlyDirectRoutes: "true" });
15
- const data = await httpJson(`${JUPITER_QUOTE}/quote?${params}`);
16
- const orcaRoutes = (data?.routePlan || []).filter(r => r?.swapInfo?.label?.toLowerCase().includes("orca"));
17
- return { amountOut: data?.outAmount, priceImpactPct: data?.priceImpactPct, orcaRoutes: orcaRoutes.length };
18
- } catch (e) {
19
- return { error: String(e.message || e).slice(0, 200) };
20
- }
21
- }
22
-
23
- export async function orcaHealth() {
24
- try {
25
- return { ok: true, note: "Orca — Solana concentrated liquidity AMM" };
26
- } catch (e) {
27
- return { ok: false, error: String(e.message || e).slice(0, 160) };
28
- }
29
- }
@@ -1,180 +0,0 @@
1
- // Ordinals + Runes reads via a public `ord` server (ordinals.com) — keyless.
2
- //
3
- // Complements bitcoin-meta: that module covers inscription metadata and the
4
- // keyed indexer gap; this one covers the ord server's block/sat/rune index.
5
- //
6
- // Verified live against ordinals.com:
7
- // GET /r/blockheight 200 PLAIN TEXT integer, not JSON
8
- // GET /r/blockhash 200 JSON string
9
- // GET /r/blockinfo/{height} 200 JSON
10
- // GET /r/sat/{sat} 200 JSON { ids, more, page }
11
- // GET /rune/{NAME} 200 JSON (Accept: application/json required)
12
- //
13
- // KNOWN LIMITS (measured, not assumed):
14
- // - /runes (the index listing) returns 406 "JSON API disabled" on
15
- // ordinals.com. Only the per-rune route works, so there is no listAll op.
16
- // - /r/rune/... and /r/runes/... are 404 on this host — the rune route is
17
- // the non-recursive /rune/{NAME}.
18
- // - Rune names must be sent WITHOUT the • spacer (UNCOMMONGOODS, not
19
- // UNCOMMON•GOODS); the spaced form 406s. Normalized below.
20
-
21
- import { httpJson } from "../http.mjs";
22
-
23
- export const ORDINALS_BASE = "https://ordinals.com";
24
-
25
- function baseUrl(opts = {}) {
26
- return String(opts.baseUrl || opts.ordinalsBase || process.env.ORDINALS_BASE_URL || ORDINALS_BASE).replace(/\/$/, "");
27
- }
28
-
29
- /**
30
- * Strip the spacer characters ord renders for display. The API indexes the
31
- * bare name; sending the pretty form is a 406.
32
- */
33
- export function normalizeRuneName(value, label = "name") {
34
- const text = String(value || "")
35
- .trim()
36
- .toUpperCase()
37
- .replace(/[•.\s_-]/g, "");
38
- if (!/^[A-Z]{1,28}$/.test(text)) {
39
- throw new Error(`ordinals-runes: ${label} must be 1-28 letters (spacers are stripped automatically)`);
40
- }
41
- return text;
42
- }
43
-
44
- async function getText(path, opts = {}) {
45
- const url = `${baseUrl(opts)}${path.startsWith("/") ? path : `/${path}`}`;
46
- const fetchImpl = opts.fetchImpl || fetch;
47
- const res = await fetchImpl(url, {
48
- method: "GET",
49
- headers: { accept: "application/json,text/plain;q=0.9,*/*;q=0.8" },
50
- signal: AbortSignal.timeout(opts.timeoutMs ?? 12_000),
51
- });
52
- const text = await res.text();
53
- if (!res.ok) throw new Error(`ordinals-runes GET ${path}: HTTP ${res.status} ${text.slice(0, 160)}`);
54
- return text.trim();
55
- }
56
-
57
- function getJson(path, opts = {}) {
58
- return httpJson(`${baseUrl(opts)}${path.startsWith("/") ? path : `/${path}`}`, {
59
- fetchImpl: opts.fetchImpl,
60
- timeoutMs: opts.timeoutMs ?? 15_000,
61
- // ord serves HTML to browsers and JSON only when explicitly asked.
62
- headers: { Accept: "application/json" },
63
- });
64
- }
65
-
66
- export async function ordHealth(opts = {}) {
67
- try {
68
- const text = await getText("/r/blockheight", opts);
69
- const height = Number(text);
70
- return {
71
- ok: Number.isFinite(height) && height > 0,
72
- provider: "ordinals-runes",
73
- baseUrl: baseUrl(opts),
74
- blockHeight: height,
75
- exec: false,
76
- };
77
- } catch (error) {
78
- return {
79
- ok: false,
80
- provider: "ordinals-runes",
81
- baseUrl: baseUrl(opts),
82
- error: String(error?.message || error),
83
- exec: false,
84
- };
85
- }
86
- }
87
-
88
- /** Indexed tip height. Endpoint returns PLAIN TEXT, so this does not JSON.parse. */
89
- export async function ordBlockHeight(_args = {}, opts = {}) {
90
- const text = await getText("/r/blockheight", opts);
91
- const height = Number(text);
92
- if (!Number.isFinite(height)) throw new Error(`ordinals-runes: unexpected blockheight response ${text.slice(0, 60)}`);
93
- return { provider: "ordinals-runes", blockHeight: height };
94
- }
95
-
96
- export async function ordBlockInfo(args = {}, opts = {}) {
97
- const raw = args.height ?? args.block ?? args.hash;
98
- if (raw == null || raw === "") throw new Error("ordinals-runes: blockInfo requires height or hash");
99
- let ref;
100
- if (/^[0-9a-f]{64}$/i.test(String(raw))) {
101
- ref = String(raw).toLowerCase();
102
- } else {
103
- const h = Number(raw);
104
- if (!Number.isInteger(h) || h < 0) throw new Error("ordinals-runes: height must be a non-negative integer or a 64-hex block hash");
105
- ref = String(h);
106
- }
107
- const info = await getJson(`/r/blockinfo/${ref}`, opts);
108
- return {
109
- provider: "ordinals-runes",
110
- height: info.height ?? null,
111
- hash: info.hash ?? null,
112
- timestamp: info.timestamp ?? null,
113
- difficulty: info.difficulty ?? null,
114
- transactionCount: info.transaction_count ?? null,
115
- averageFee: info.average_fee ?? null,
116
- averageFeeRate: info.average_fee_rate ?? null,
117
- feerangeSats: info.feerange ?? null,
118
- totalFee: info.total_fee ?? null,
119
- totalSize: info.total_size ?? null,
120
- confirmations: info.confirmations ?? null,
121
- raw: info,
122
- };
123
- }
124
-
125
- /** Inscriptions bound to a given sat ordinal. Empty ids[] means an unused sat. */
126
- export async function ordSatInfo(args = {}, opts = {}) {
127
- const sat = args.sat ?? args.ordinal;
128
- const n = Number(sat);
129
- // 2.1 quadrillion sats total supply — reject out-of-range early rather than
130
- // paying a round trip for a 400.
131
- if (!Number.isInteger(n) || n < 0 || n > 2_099_999_997_690_000) {
132
- throw new Error("ordinals-runes: sat must be an integer in [0, 2099999997690000]");
133
- }
134
- const page = Math.max(0, Number(args.page || 0));
135
- const path = page > 0 ? `/r/sat/${n}/${page}` : `/r/sat/${n}`;
136
- const info = await getJson(path, opts);
137
- const ids = Array.isArray(info?.ids) ? info.ids : [];
138
- return {
139
- provider: "ordinals-runes",
140
- sat: n,
141
- page,
142
- inscriptionCount: ids.length,
143
- inscriptionIds: ids,
144
- more: Boolean(info?.more),
145
- raw: info,
146
- };
147
- }
148
-
149
- /**
150
- * Per-rune entry: supply, mint terms, divisibility, mint progress.
151
- * Only the per-rune route is available keylessly — see the 406 note at the top.
152
- */
153
- export async function ordRuneInfo(args = {}, opts = {}) {
154
- const name = normalizeRuneName(args.name || args.rune || args.runeName, "name");
155
- const info = await getJson(`/rune/${name}`, opts);
156
- const e = info?.entry || {};
157
- const terms = e.terms || {};
158
- const cap = terms.cap == null ? null : Number(terms.cap);
159
- const mints = e.mints == null ? null : Number(e.mints);
160
- return {
161
- provider: "ordinals-runes",
162
- name,
163
- spacedRune: e.spaced_rune ?? null,
164
- number: e.number ?? null,
165
- symbol: e.symbol ?? null,
166
- divisibility: e.divisibility ?? null,
167
- etchingBlock: e.block ?? null,
168
- etchingTxid: e.etching ?? null,
169
- premine: e.premine == null ? null : String(e.premine),
170
- mints: mints == null ? null : String(mints),
171
- burned: e.burned == null ? null : String(e.burned),
172
- mintCap: cap == null ? null : String(cap),
173
- mintProgressPct: cap && cap > 0 && mints != null ? (mints / cap) * 100 : null,
174
- mintable: info?.mintable ?? null,
175
- amountPerMint: terms.amount == null ? null : String(terms.amount),
176
- turbo: e.turbo ?? null,
177
- parent: info?.parent ?? null,
178
- raw: info,
179
- };
180
- }
@@ -1,28 +0,0 @@
1
- // PancakeSwap — largest BSC DEX, v3 concentrated liquidity on multiple chains.
2
- // https://developers.pancakeswap.finance — public REST + subgraph APIs.
3
- // Never signs, never broadcasts.
4
-
5
- import { httpJson } from "../http.mjs";
6
-
7
- const PANCAKE_SUBGRAPH = "https://api.thegraph.com/subgraphs/name/pancakeswap/exchange-v3-bsc";
8
-
9
- export async function pancakeQuote({ chainId = 56, tokenIn, tokenOut, amountIn, fee = 500 } = {}) {
10
- if (!tokenIn || !tokenOut || !amountIn) {
11
- return { error: "pancake quote requires tokenIn, tokenOut, amountIn" };
12
- }
13
- try {
14
- const body = { tokenIn: String(tokenIn).toLowerCase(), tokenOut: String(tokenOut).toLowerCase(), amountIn: String(amountIn), fee: String(fee) };
15
- const data = await httpJson(`${PANCAKE_SUBGRAPH}/quote`, { method: "POST", body: JSON.stringify(body), headers: { "content-type": "application/json" } });
16
- return { amountOut: data?.amountOut, route: data?.route };
17
- } catch (e) {
18
- return { error: String(e.message || e).slice(0, 200) };
19
- }
20
- }
21
-
22
- export async function pancakeHealth() {
23
- try {
24
- return { ok: true, chains: ["bsc (56)", "ethereum (1)", "arbitrum (42161)", "base (8453)", "opbnb (204)", "zksync (324)", "linea (59144)"] };
25
- } catch (e) {
26
- return { ok: false, error: String(e.message || e).slice(0, 160) };
27
- }
28
- }
@@ -1,125 +0,0 @@
1
- // ParaSwap/Velora public market API — keyless price routes, quote-only here.
2
- import { httpJson } from "../http.mjs";
3
- import { attachAutoSlippage, bindAutoSlippageGuardToCall } from "../../auto-slippage.mjs";
4
- import { stampPrepared } from "../../prepare-envelope.mjs";
5
- import { resolveFee, paraswapFeeParams } from "../../router/integrator-fee.mjs";
6
-
7
- export const PARASWAP_API = "https://api.paraswap.io";
8
- const base = (o = {}) => (o.baseUrl || process.env.PARASWAP_API_URL || PARASWAP_API).replace(/\/$/, "");
9
- function token(value, name) {
10
- const s = String(value || "");
11
- if (!/^0x[0-9a-fA-F]{40}$/.test(s)) throw new Error(`${name} must be a 20-byte token address`);
12
- return s.toLowerCase();
13
- }
14
-
15
- export async function paraswapTokens(args = {}, opts = {}) {
16
- const chainId = Number(args.chainId || 1);
17
- return httpJson(`${base(opts)}/tokens/${chainId}`, { fetchImpl: opts.fetchImpl, timeoutMs: opts.timeoutMs });
18
- }
19
-
20
- export async function paraswapPrice(args = {}, opts = {}) {
21
- const chainId = Number(args.chainId || args.network || 1);
22
- if (args.amount == null) throw new Error("amount required");
23
- const params = new URLSearchParams({
24
- srcToken: token(args.srcToken, "srcToken"),
25
- destToken: token(args.destToken, "destToken"),
26
- amount: String(args.amount),
27
- srcDecimals: String(Number(args.srcDecimals)),
28
- destDecimals: String(Number(args.destDecimals)),
29
- side: String(args.side || "SELL").toUpperCase(),
30
- network: String(chainId),
31
- version: String(args.version || "6.2"),
32
- });
33
- if (args.includeDEXS) params.set("includeDEXS", String(args.includeDEXS));
34
- if (args.excludeDEXS) params.set("excludeDEXS", String(args.excludeDEXS));
35
- // Integrator fee. Unlike LI.FI, ParaSwap needs no prior registration: a live
36
- // quote echoes back partner/partnerFee as sent. Still off unless configured,
37
- // and always zero for Locals Only holders.
38
- const fee = resolveFee({ isHolder: args.isHolder });
39
- for (const [k, v] of Object.entries(paraswapFeeParams(fee))) params.set(k, v);
40
- const result = await httpJson(`${base(opts)}/prices?${params}`, {
41
- fetchImpl: opts.fetchImpl,
42
- timeoutMs: opts.timeoutMs ?? 20_000,
43
- });
44
- const amountOut = result?.priceRoute?.destAmount;
45
- if (!amountOut) return { ...result, executionReady: false, oracleFee: fee };
46
- return {
47
- ...attachAutoSlippage(result, {
48
- chainId,
49
- venue: result?.priceRoute?.contractAddress || "paraswap-quote",
50
- amountOut,
51
- liquidityUsd: args.liquidityUsd,
52
- priceChange5m: args.priceChange5m,
53
- quoteAgeMs: 0,
54
- requestedCapBps: args.maxSlippageBps ?? args.slippageBps,
55
- }),
56
- executionReady: false,
57
- executionBlocker: "call prepare to bind the price route to a validated transaction",
58
- oracleFee: fee,
59
- };
60
- }
61
-
62
- export async function paraswapPrepare(args = {}, opts = {}) {
63
- if (String(args.side || "SELL").toUpperCase() !== "SELL") {
64
- throw new Error("paraswap: agentic prepare currently supports exact-input SELL only");
65
- }
66
- const chainId = Number(args.chainId || args.network || 1);
67
- const userAddress = token(args.userAddress, "userAddress");
68
- const quote = await paraswapPrice(args, opts);
69
- const priceRoute = quote?.priceRoute;
70
- const expectedTarget = String(priceRoute?.contractAddress || "").toLowerCase();
71
- if (!expectedTarget) throw new Error("paraswap: price route missing contractAddress");
72
- const body = {
73
- srcToken: token(args.srcToken, "srcToken"),
74
- destToken: token(args.destToken, "destToken"),
75
- srcAmount: String(priceRoute.srcAmount || args.amount),
76
- // ParaSwap treats destAmount as the on-chain minimum for SELL routes.
77
- destAmount: String(quote.amountOutMinimum),
78
- priceRoute,
79
- userAddress,
80
- ignoreChecks: false,
81
- ignoreGasEstimate: false,
82
- };
83
- if (args.receiver) body.receiver = token(args.receiver, "receiver");
84
- const tx = await httpJson(`${base(opts)}/transactions/${chainId}`, {
85
- method: "POST",
86
- body,
87
- fetchImpl: opts.fetchImpl,
88
- timeoutMs: opts.timeoutMs ?? 25_000,
89
- });
90
- if (Number(tx.chainId ?? chainId) !== chainId) throw new Error("paraswap: transaction chain mismatch");
91
- if (String(tx.to || "").toLowerCase() !== expectedTarget) throw new Error("paraswap: transaction target mismatch");
92
- if (tx.from && String(tx.from).toLowerCase() !== userAddress) throw new Error("paraswap: transaction sender mismatch");
93
- return stampPrepared({
94
- provider: "paraswap",
95
- calldataReady: true,
96
- // NOT executable authority. The bytes are assembled but nothing is signed:
97
- // the user's wallet is still the only thing that can authorize this. The
98
- // previous `executionReady: true` read as "cleared to execute" and trained
99
- // agents to treat a quote as permission.
100
- requiresUserSignature: true,
101
- signingReady: false,
102
- broadcastReady: false,
103
- chainId,
104
- quote,
105
- autoSlippage: quote.autoSlippage,
106
- requiresApproval: body.srcToken !== "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
107
- ? { token: body.srcToken, spender: priceRoute.tokenTransferProxy || expectedTarget, amount: body.srcAmount }
108
- : null,
109
- transaction: {
110
- chainId,
111
- from: tx.from || userAddress,
112
- to: tx.to,
113
- data: tx.data,
114
- value: tx.value ?? "0x0",
115
- ...(tx.gas != null ? { gasLimit: tx.gas } : {}),
116
- slippageGuard: bindAutoSlippageGuardToCall(quote.autoSlippage, { chainId, venue: tx.to, data: tx.data }),
117
- },
118
- }, { provider: "paraswap", kind: "paraswap-tx" });
119
- }
120
-
121
- export async function paraswapHealth(opts = {}) {
122
- const data = await paraswapTokens({ chainId: 1 }, opts);
123
- const count = Array.isArray(data?.tokens) ? data.tokens.length : Object.keys(data?.tokens || {}).length;
124
- return { ok: count > 0, tokenSample: count };
125
- }
@@ -1,188 +0,0 @@
1
- // Pendle public core API — markets and Hosted SDK Convert tx builder, no key.
2
- import { getAddress } from "ethers";
3
- import { httpJson } from "../http.mjs";
4
- import { attachAutoSlippage, bindAutoSlippageGuardToCall, resolveAutoSlippage } from "../../auto-slippage.mjs";
5
- import { stampPrepared } from "../../prepare-envelope.mjs";
6
-
7
- export const PENDLE_API = "https://api-v2.pendle.finance/core";
8
-
9
- // Official Pendle Router from deployment docs. Bytecode checked via eth_getCode
10
- // on Arbitrum/Base 2026-07-23.
11
- export const PENDLE_ROUTER_BY_CHAIN = Object.freeze({
12
- 42161: "0x888888888889758F76e7103c6CbF23ABbF58F946",
13
- 8453: "0x888888888889758F76e7103c6CbF23ABbF58F946",
14
- });
15
-
16
- const ZERO = "0x0000000000000000000000000000000000000000";
17
- const NATIVE = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
18
-
19
- const base = (o = {}) => (o.baseUrl || process.env.PENDLE_API_URL || PENDLE_API).replace(/\/$/, "");
20
-
21
- function checksum(value, label) {
22
- try {
23
- return getAddress(value);
24
- } catch {
25
- throw new Error(`${label} must be a valid EVM address`);
26
- }
27
- }
28
-
29
- function normal(value, label) {
30
- return checksum(value, label).toLowerCase();
31
- }
32
-
33
- function isNative(value) {
34
- const v = String(value || "").toLowerCase();
35
- return v === "native" || v === "eth" || v === NATIVE || v === ZERO;
36
- }
37
-
38
- function amountString(value, label) {
39
- let amount;
40
- try {
41
- amount = BigInt(String(value));
42
- } catch {
43
- throw new Error(`${label} must be an integer string`);
44
- }
45
- if (amount <= 0n) throw new Error(`${label} must be positive`);
46
- return amount.toString();
47
- }
48
-
49
- function normalizeInputs(inputs) {
50
- if (!Array.isArray(inputs) || inputs.length === 0) throw new Error("pendle convert requires inputs[]");
51
- return inputs.map((input, i) => ({
52
- token: checksum(input.token, `pendle input ${i} token`),
53
- amount: amountString(input.amount, `pendle input ${i} amount`),
54
- }));
55
- }
56
-
57
- function normalizeOutputs(outputs) {
58
- if (!Array.isArray(outputs) || outputs.length === 0) throw new Error("pendle convert requires outputs[]");
59
- return outputs.map((token, i) => checksum(token, `pendle output ${i} token`));
60
- }
61
-
62
- function routerFor(chainId) {
63
- const router = PENDLE_ROUTER_BY_CHAIN[Number(chainId)];
64
- if (!router) throw new Error(`Pendle prepare not enabled for chainId ${chainId}`);
65
- return router;
66
- }
67
-
68
- function firstOutputAmount(result) {
69
- const amount = result?.routes?.[0]?.outputs?.[0]?.amount || result?.outputs?.[0]?.amount;
70
- if (!amount) throw new Error("Pendle convert response missing output amount");
71
- return amountString(amount, "pendle output amount");
72
- }
73
-
74
- function normalizeRequiredApprovals(requiredApprovals, spender) {
75
- const approvals = (Array.isArray(requiredApprovals) ? requiredApprovals : [])
76
- .filter((approval) => approval?.token && approval?.amount && !isNative(approval.token))
77
- .map((approval) => ({
78
- token: normal(approval.token, "pendle approval token"),
79
- spender: normal(spender, "pendle approval spender"),
80
- amount: amountString(approval.amount, "pendle approval amount"),
81
- }));
82
- if (!approvals.length) return null;
83
- return approvals.length === 1 ? approvals[0] : approvals;
84
- }
85
-
86
- export async function pendleMarkets(args = {}, opts = {}) {
87
- const chainId = Number(args.chainId || 42161);
88
- const p = new URLSearchParams({
89
- limit: String(Math.min(100, Math.max(1, Number(args.limit || 20)))),
90
- skip: String(Math.max(0, Number(args.skip || 0))),
91
- });
92
- if (args.isExpired != null) p.set("isExpired", String(Boolean(args.isExpired)));
93
- return httpJson(`${base(opts)}/v1/${chainId}/markets?${p}`, {
94
- fetchImpl: opts.fetchImpl,
95
- timeoutMs: opts.timeoutMs,
96
- });
97
- }
98
-
99
- export async function pendleHealth(opts = {}) {
100
- const data = await pendleMarkets({ chainId: 42161, limit: 1 }, opts);
101
- return { ok: Array.isArray(data?.results), marketSample: data?.results?.length || 0 };
102
- }
103
-
104
- export async function pendlePrepare(q = {}, opts = {}) {
105
- const chainId = Number(q.chainId ?? 42161);
106
- const router = routerFor(chainId);
107
- const from = q.from || q.fromAddress || q.userAddress || q.taker || q.receiver;
108
- if (!from) throw new Error("pendlePrepare requires from/receiver");
109
- const receiver = checksum(q.receiver || from, "pendle receiver");
110
- const inputs = normalizeInputs(q.inputs);
111
- const outputs = normalizeOutputs(q.outputs);
112
- if (q.enableAggregator === true || (Array.isArray(q.aggregators) && q.aggregators.length)) {
113
- throw new Error("Pendle aggregator paths are disabled by policy; use direct convert only");
114
- }
115
- const selected = resolveAutoSlippage({
116
- liquidityUsd: q.liquidityUsd,
117
- priceChange5m: q.priceChange5m,
118
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
119
- });
120
- if (!selected.executable) {
121
- throw new Error(`Pendle: route requires ${selected.requiredBps} bps above cap ${selected.capBps}`);
122
- }
123
- const body = {
124
- receiver,
125
- slippage: selected.selectedBps / 10_000,
126
- enableAggregator: false,
127
- useLimitOrder: false,
128
- inputs,
129
- outputs,
130
- ...(q.redeemRewards != null ? { redeemRewards: Boolean(q.redeemRewards) } : {}),
131
- ...(q.needScale != null ? { needScale: Boolean(q.needScale) } : {}),
132
- ...(q.additionalData ? { additionalData: String(q.additionalData) } : {}),
133
- };
134
- const raw = await httpJson(`${base(opts)}/v3/sdk/${chainId}/convert`, {
135
- method: "POST",
136
- body,
137
- fetchImpl: opts.fetchImpl,
138
- timeoutMs: opts.timeoutMs ?? 25_000,
139
- });
140
- const route = raw?.routes?.[0];
141
- const tx = route?.tx;
142
- if (!tx?.to || !tx?.data) throw new Error("Pendle convert returned no executable tx");
143
- if (normal(tx.to, "pendle tx target") !== normal(router, "pendle router")) {
144
- throw new Error("Pendle convert returned unexpected router target");
145
- }
146
- if (tx.from && normal(tx.from, "pendle tx sender") !== normal(from, "pendle sender")) {
147
- throw new Error("Pendle convert transaction sender mismatch");
148
- }
149
- const amountOut = firstOutputAmount(raw);
150
- const quote = attachAutoSlippage(raw, {
151
- chainId,
152
- venue: tx.to,
153
- amountOut,
154
- liquidityUsd: q.liquidityUsd,
155
- priceChange5m: q.priceChange5m,
156
- requestedCapBps: q.maxSlippageBps ?? q.slippageBps,
157
- });
158
- return stampPrepared({
159
- provider: "pendle",
160
- calldataReady: true,
161
- // NOT executable authority. The bytes are assembled but nothing is signed:
162
- // the user's wallet is still the only thing that can authorize this. The
163
- // previous `executionReady: true` read as "cleared to execute" and trained
164
- // agents to treat a quote as permission.
165
- requiresUserSignature: true,
166
- signingReady: false,
167
- broadcastReady: false,
168
- chainId,
169
- action: raw.action || null,
170
- quote,
171
- autoSlippage: quote.autoSlippage,
172
- requiresApproval: normalizeRequiredApprovals(raw.requiredApprovals, tx.to),
173
- transaction: {
174
- chainId,
175
- from: tx.from || from,
176
- to: tx.to,
177
- data: tx.data,
178
- value: tx.value ?? "0x0",
179
- slippageGuard: bindAutoSlippageGuardToCall(quote.autoSlippage, { chainId, venue: tx.to, data: tx.data }),
180
- },
181
- }, { provider: "pendle", kind: "pendle-swap" });
182
- }
183
-
184
- export async function pendleQuote(q = {}, opts = {}) {
185
- const prepared = await pendlePrepare(q, opts);
186
- const { transaction: _transaction, ...quote } = prepared;
187
- return quote;
188
- }