@oracle-agent/oracle 0.11.0 → 0.13.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 (487) hide show
  1. package/LICENSE +115 -201
  2. package/README.md +13 -516
  3. package/bin/oracle.mjs +19 -27
  4. package/package.json +15 -98
  5. package/CONTRIBUTING.md +0 -98
  6. package/SECURITY.md +0 -89
  7. package/SETUP.md +0 -381
  8. package/artifacts/inscription/oracle-was-here-preview.png +0 -0
  9. package/artifacts/inscription/oracle-was-here.svg +0 -1
  10. package/artifacts/specialist-packs/oracle-full-crypto.json +0 -295
  11. package/bin/desk-server.mjs +0 -440
  12. package/bin/oracle-data-mcp.mjs +0 -1019
  13. package/bin/oracle-init.mjs +0 -496
  14. package/bin/oracle-public-server.mjs +0 -36
  15. package/bin/oracle-route.mjs +0 -254
  16. package/bin/oracle-scan.mjs +0 -192
  17. package/bin/oracle-upgrade.mjs +0 -42
  18. package/docs/adding-a-chain.md +0 -229
  19. package/docs/architecture.md +0 -138
  20. package/docs/cli.md +0 -47
  21. package/docs/connectors.md +0 -13
  22. package/docs/oracle-pack-standard.md +0 -29
  23. package/docs/profiles.md +0 -151
  24. package/docs/public-surface.md +0 -133
  25. package/examples/add-a-chain.mjs +0 -65
  26. package/examples/oracle-pack-template.mjs +0 -38
  27. package/examples/research-a-token.mjs +0 -70
  28. package/plugins/oracle-owner-gate/__init__.py +0 -227
  29. package/plugins/oracle-owner-gate/plugin.yaml +0 -9
  30. package/profiles/_template/SOUL.md +0 -54
  31. package/profiles/_template/profile.json +0 -22
  32. package/profiles/bitcoin-agent/SOUL.md +0 -31
  33. package/profiles/bitcoin-agent/profile.json +0 -32
  34. package/profiles/hyperliquid-agent/SOUL.md +0 -34
  35. package/profiles/hyperliquid-agent/profile.json +0 -37
  36. package/profiles/oracle/SOUL.md +0 -107
  37. package/profiles/oracle/profile.json +0 -39
  38. package/profiles/polymarket-agent/SOUL.md +0 -35
  39. package/profiles/polymarket-agent/profile.json +0 -34
  40. package/profiles/profile.schema.json +0 -90
  41. package/profiles/protocol-builder/SOUL.md +0 -57
  42. package/profiles/protocol-builder/profile.json +0 -39
  43. package/profiles/robinhood-agent/SOUL.md +0 -53
  44. package/profiles/robinhood-agent/profile.json +0 -40
  45. package/profiles/solana-agent/SOUL.md +0 -37
  46. package/profiles/solana-agent/profile.json +0 -37
  47. package/profiles/stable-agent/SOUL.md +0 -43
  48. package/profiles/stable-agent/profile.json +0 -37
  49. package/protocols/templates/safe-erc20/SECURITY.md +0 -16
  50. package/protocols/templates/safe-erc20/foundry.toml +0 -12
  51. package/protocols/templates/safe-erc20/remappings.txt +0 -2
  52. package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
  53. package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
  54. package/public/agent-connect/app.js +0 -84
  55. package/public/agent-connect/index.html +0 -83
  56. package/public/agent-connect/styles.css +0 -70
  57. package/public/index.html +0 -12
  58. package/public/oracle-console/app.js +0 -272
  59. package/public/oracle-console/bitcoin-wallets.js +0 -206
  60. package/public/oracle-console/index.html +0 -91
  61. package/public/oracle-console/styles.css +0 -239
  62. package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
  63. package/public/oracle-splash/assets/hero/orb.avif +0 -0
  64. package/public/oracle-splash/assets/hero/orb.webm +0 -0
  65. package/public/oracle-splash/assets/llms/claude.svg +0 -1
  66. package/public/oracle-splash/assets/llms/codex-icon.svg +0 -1
  67. package/public/oracle-splash/assets/llms/codex.svg +0 -1
  68. package/public/oracle-splash/assets/llms/cursor-icon.svg +0 -12
  69. package/public/oracle-splash/assets/llms/cursor.svg +0 -17
  70. package/public/oracle-splash/assets/llms/deepseek.svg +0 -1
  71. package/public/oracle-splash/assets/llms/gemini-icon.svg +0 -1
  72. package/public/oracle-splash/assets/llms/gemini.svg +0 -1
  73. package/public/oracle-splash/assets/llms/grok.svg +0 -8
  74. package/public/oracle-splash/assets/llms/hermes.png +0 -0
  75. package/public/oracle-splash/assets/llms/kimi-icon.svg +0 -1
  76. package/public/oracle-splash/assets/llms/kimi.svg +0 -1
  77. package/public/oracle-splash/assets/llms/manus.svg +0 -18
  78. package/public/oracle-splash/assets/llms/openclaw.svg +0 -22
  79. package/public/oracle-splash/assets/llms/perplexity.svg +0 -1
  80. package/public/oracle-splash/assets/llms/qwen.svg +0 -1
  81. package/public/oracle-splash/assets/llms/windsurf.svg +0 -1
  82. package/public/oracle-splash/assets/protocols/abcdex.png +0 -0
  83. package/public/oracle-splash/assets/protocols/across.png +0 -0
  84. package/public/oracle-splash/assets/protocols/aerodrome.png +0 -0
  85. package/public/oracle-splash/assets/protocols/balancer.png +0 -0
  86. package/public/oracle-splash/assets/protocols/cowswap.png +0 -0
  87. package/public/oracle-splash/assets/protocols/curve.png +0 -0
  88. package/public/oracle-splash/assets/protocols/dreamcash.png +0 -0
  89. package/public/oracle-splash/assets/protocols/felix.png +0 -0
  90. package/public/oracle-splash/assets/protocols/gmx.png +0 -0
  91. package/public/oracle-splash/assets/protocols/hyena.png +0 -0
  92. package/public/oracle-splash/assets/protocols/hyperbeat.png +0 -0
  93. package/public/oracle-splash/assets/protocols/hyperliquid.png +0 -0
  94. package/public/oracle-splash/assets/protocols/hyperswap.png +0 -0
  95. package/public/oracle-splash/assets/protocols/jupiter.png +0 -0
  96. package/public/oracle-splash/assets/protocols/kinetiq.png +0 -0
  97. package/public/oracle-splash/assets/protocols/lfj.png +0 -0
  98. package/public/oracle-splash/assets/protocols/lifi.png +0 -0
  99. package/public/oracle-splash/assets/protocols/magic-eden.png +0 -0
  100. package/public/oracle-splash/assets/protocols/morpho.png +0 -0
  101. package/public/oracle-splash/assets/protocols/odos.png +0 -0
  102. package/public/oracle-splash/assets/protocols/oneinch.png +0 -0
  103. package/public/oracle-splash/assets/protocols/opensea.png +0 -0
  104. package/public/oracle-splash/assets/protocols/pancakeswap.png +0 -0
  105. package/public/oracle-splash/assets/protocols/paragon.png +0 -0
  106. package/public/oracle-splash/assets/protocols/paraswap.png +0 -0
  107. package/public/oracle-splash/assets/protocols/pendle.png +0 -0
  108. package/public/oracle-splash/assets/protocols/polymarket.png +0 -0
  109. package/public/oracle-splash/assets/protocols/quickswap.png +0 -0
  110. package/public/oracle-splash/assets/protocols/relay.png +0 -0
  111. package/public/oracle-splash/assets/protocols/stargate.png +0 -0
  112. package/public/oracle-splash/assets/protocols/tradexyz.png +0 -0
  113. package/public/oracle-splash/assets/protocols/uniswap.png +0 -0
  114. package/public/oracle-splash/assets/protocols/velodrome.png +0 -0
  115. package/public/oracle-splash/assets/protocols/ventuals.png +0 -0
  116. package/public/oracle-splash/assets/wordmarks/across-icon.webp +0 -0
  117. package/public/oracle-splash/assets/wordmarks/across.svg +0 -4
  118. package/public/oracle-splash/assets/wordmarks/aerodrome.svg +0 -23
  119. package/public/oracle-splash/assets/wordmarks/balancer.svg +0 -3
  120. package/public/oracle-splash/assets/wordmarks/cowswap.svg +0 -1
  121. package/public/oracle-splash/assets/wordmarks/curve.png +0 -0
  122. package/public/oracle-splash/assets/wordmarks/gmx.svg +0 -13
  123. package/public/oracle-splash/assets/wordmarks/hop-icon.webp +0 -0
  124. package/public/oracle-splash/assets/wordmarks/hyena.svg +0 -7
  125. package/public/oracle-splash/assets/wordmarks/hyperliquid.svg +0 -21
  126. package/public/oracle-splash/assets/wordmarks/hyperswap.svg +0 -13
  127. package/public/oracle-splash/assets/wordmarks/jupiter.svg +0 -35
  128. package/public/oracle-splash/assets/wordmarks/kinetiq.svg +0 -1
  129. package/public/oracle-splash/assets/wordmarks/lfj.webp +0 -0
  130. package/public/oracle-splash/assets/wordmarks/lifi.png +0 -0
  131. package/public/oracle-splash/assets/wordmarks/magic-eden.svg +0 -1
  132. package/public/oracle-splash/assets/wordmarks/markets.svg +0 -1
  133. package/public/oracle-splash/assets/wordmarks/morpho.svg +0 -1
  134. package/public/oracle-splash/assets/wordmarks/odos.svg +0 -3
  135. package/public/oracle-splash/assets/wordmarks/oneinch-icon.webp +0 -0
  136. package/public/oracle-splash/assets/wordmarks/oneinch.svg +0 -6
  137. package/public/oracle-splash/assets/wordmarks/opensea-icon.svg +0 -17
  138. package/public/oracle-splash/assets/wordmarks/opensea.svg +0 -1
  139. package/public/oracle-splash/assets/wordmarks/outcome.svg +0 -16
  140. package/public/oracle-splash/assets/wordmarks/pancakeswap.svg +0 -18
  141. package/public/oracle-splash/assets/wordmarks/paragon.svg +0 -9
  142. package/public/oracle-splash/assets/wordmarks/paraswap.svg +0 -16
  143. package/public/oracle-splash/assets/wordmarks/pendle.png +0 -0
  144. package/public/oracle-splash/assets/wordmarks/polymarket.png +0 -0
  145. package/public/oracle-splash/assets/wordmarks/quickswap.png +0 -0
  146. package/public/oracle-splash/assets/wordmarks/relay.svg +0 -8
  147. package/public/oracle-splash/assets/wordmarks/satflow-icon.png +0 -0
  148. package/public/oracle-splash/assets/wordmarks/stargate-icon.webp +0 -0
  149. package/public/oracle-splash/assets/wordmarks/stargate.svg +0 -15
  150. package/public/oracle-splash/assets/wordmarks/uniswap.svg +0 -18
  151. package/public/oracle-splash/assets/wordmarks/velodrome.svg +0 -84
  152. package/public/oracle-splash/assets/wordmarks/xyz.svg +0 -12
  153. package/public/oracle-splash/assets/wordmarks/zerox-icon.webp +0 -0
  154. package/public/oracle-splash/brand/aave.webp +0 -0
  155. package/public/oracle-splash/brand/aavev2.webp +0 -0
  156. package/public/oracle-splash/brand/aborean.webp +0 -0
  157. package/public/oracle-splash/brand/across.webp +0 -0
  158. package/public/oracle-splash/brand/aerodrome.webp +0 -0
  159. package/public/oracle-splash/brand/afi.webp +0 -0
  160. package/public/oracle-splash/brand/arcus.webp +0 -0
  161. package/public/oracle-splash/brand/aster.webp +0 -0
  162. package/public/oracle-splash/brand/avant.webp +0 -0
  163. package/public/oracle-splash/brand/balancer.webp +0 -0
  164. package/public/oracle-splash/brand/beefy.webp +0 -0
  165. package/public/oracle-splash/brand/benqi.webp +0 -0
  166. package/public/oracle-splash/brand/bestinslot.ico +0 -0
  167. package/public/oracle-splash/brand/bitfi.webp +0 -0
  168. package/public/oracle-splash/brand/bonkswap.webp +0 -0
  169. package/public/oracle-splash/brand/bouncebit.webp +0 -0
  170. package/public/oracle-splash/brand/camelot.webp +0 -0
  171. package/public/oracle-splash/brand/compound.webp +0 -0
  172. package/public/oracle-splash/brand/concrete.webp +0 -0
  173. package/public/oracle-splash/brand/cow.webp +0 -0
  174. package/public/oracle-splash/brand/curve.webp +0 -0
  175. package/public/oracle-splash/brand/derive.webp +0 -0
  176. package/public/oracle-splash/brand/dolomite.webp +0 -0
  177. package/public/oracle-splash/brand/eigenlayer.webp +0 -0
  178. package/public/oracle-splash/brand/ekubo.webp +0 -0
  179. package/public/oracle-splash/brand/ethena.webp +0 -0
  180. package/public/oracle-splash/brand/etherfi.webp +0 -0
  181. package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
  182. package/public/oracle-splash/brand/felix.webp +0 -0
  183. package/public/oracle-splash/brand/fluid.webp +0 -0
  184. package/public/oracle-splash/brand/fluxbeam.webp +0 -0
  185. package/public/oracle-splash/brand/folks.webp +0 -0
  186. package/public/oracle-splash/brand/fortyacres.webp +0 -0
  187. package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
  188. package/public/oracle-splash/brand/gassss.webp +0 -0
  189. package/public/oracle-splash/brand/gmx.webp +0 -0
  190. package/public/oracle-splash/brand/harmonix.webp +0 -0
  191. package/public/oracle-splash/brand/hlorderbook.webp +0 -0
  192. package/public/oracle-splash/brand/hlp.webp +0 -0
  193. package/public/oracle-splash/brand/hop.webp +0 -0
  194. package/public/oracle-splash/brand/hyperbeat.webp +0 -0
  195. package/public/oracle-splash/brand/hyperlend.webp +0 -0
  196. package/public/oracle-splash/brand/hyperliquid.webp +0 -0
  197. package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
  198. package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
  199. package/public/oracle-splash/brand/hyperswap.webp +0 -0
  200. package/public/oracle-splash/brand/hypha.webp +0 -0
  201. package/public/oracle-splash/brand/joedex.webp +0 -0
  202. package/public/oracle-splash/brand/jupiter.webp +0 -0
  203. package/public/oracle-splash/brand/kelp.webp +0 -0
  204. package/public/oracle-splash/brand/kinetiq.webp +0 -0
  205. package/public/oracle-splash/brand/kmhype.webp +0 -0
  206. package/public/oracle-splash/brand/kona.webp +0 -0
  207. package/public/oracle-splash/brand/konalend.webp +0 -0
  208. package/public/oracle-splash/brand/lfj.webp +0 -0
  209. package/public/oracle-splash/brand/lido.webp +0 -0
  210. package/public/oracle-splash/brand/lifi.webp +0 -0
  211. package/public/oracle-splash/brand/lighter.webp +0 -0
  212. package/public/oracle-splash/brand/lista.webp +0 -0
  213. package/public/oracle-splash/brand/loopedhype.webp +0 -0
  214. package/public/oracle-splash/brand/lorenzo.webp +0 -0
  215. package/public/oracle-splash/brand/magic-eden.webp +0 -0
  216. package/public/oracle-splash/brand/magiceden.webp +0 -0
  217. package/public/oracle-splash/brand/mempool.png +0 -0
  218. package/public/oracle-splash/brand/meteora.webp +0 -0
  219. package/public/oracle-splash/brand/morpho.webp +0 -0
  220. package/public/oracle-splash/brand/myriad.webp +0 -0
  221. package/public/oracle-splash/brand/noxa.webp +0 -0
  222. package/public/oracle-splash/brand/odos.webp +0 -0
  223. package/public/oracle-splash/brand/oneinch.webp +0 -0
  224. package/public/oracle-splash/brand/openbook.webp +0 -0
  225. package/public/oracle-splash/brand/opensea.webp +0 -0
  226. package/public/oracle-splash/brand/orca.webp +0 -0
  227. package/public/oracle-splash/brand/ordinals.png +0 -0
  228. package/public/oracle-splash/brand/ostium.webp +0 -0
  229. package/public/oracle-splash/brand/pancakeswap.webp +0 -0
  230. package/public/oracle-splash/brand/pendle.webp +0 -0
  231. package/public/oracle-splash/brand/perena.webp +0 -0
  232. package/public/oracle-splash/brand/pharaoh.webp +0 -0
  233. package/public/oracle-splash/brand/phoenix.webp +0 -0
  234. package/public/oracle-splash/brand/polymarket.webp +0 -0
  235. package/public/oracle-splash/brand/polynomial.webp +0 -0
  236. package/public/oracle-splash/brand/projectx.webp +0 -0
  237. package/public/oracle-splash/brand/pumpfun.webp +0 -0
  238. package/public/oracle-splash/brand/quickswap.webp +0 -0
  239. package/public/oracle-splash/brand/rain.webp +0 -0
  240. package/public/oracle-splash/brand/raydium.webp +0 -0
  241. package/public/oracle-splash/brand/relay.webp +0 -0
  242. package/public/oracle-splash/brand/rocketpool.webp +0 -0
  243. package/public/oracle-splash/brand/saber.webp +0 -0
  244. package/public/oracle-splash/brand/sakuraswap.webp +0 -0
  245. package/public/oracle-splash/brand/sanctum.webp +0 -0
  246. package/public/oracle-splash/brand/satflow.png +0 -0
  247. package/public/oracle-splash/brand/sierra.webp +0 -0
  248. package/public/oracle-splash/brand/sky.webp +0 -0
  249. package/public/oracle-splash/brand/solv.webp +0 -0
  250. package/public/oracle-splash/brand/spark.webp +0 -0
  251. package/public/oracle-splash/brand/sparksavings.webp +0 -0
  252. package/public/oracle-splash/brand/sphere.webp +0 -0
  253. package/public/oracle-splash/brand/ssv.webp +0 -0
  254. package/public/oracle-splash/brand/stabble.webp +0 -0
  255. package/public/oracle-splash/brand/stableswap.webp +0 -0
  256. package/public/oracle-splash/brand/stakewise.webp +0 -0
  257. package/public/oracle-splash/brand/stargate.webp +0 -0
  258. package/public/oracle-splash/brand/sthype.webp +0 -0
  259. package/public/oracle-splash/brand/sushiswap.webp +0 -0
  260. package/public/oracle-splash/brand/unisat.png +0 -0
  261. package/public/oracle-splash/brand/uniswap.webp +0 -0
  262. package/public/oracle-splash/brand/uniswapv2.webp +0 -0
  263. package/public/oracle-splash/brand/uniswapv4.webp +0 -0
  264. package/public/oracle-splash/brand/unit.webp +0 -0
  265. package/public/oracle-splash/brand/velodrome.webp +0 -0
  266. package/public/oracle-splash/brand/velora.webp +0 -0
  267. package/public/oracle-splash/brand/venus.webp +0 -0
  268. package/public/oracle-splash/brand/wbeth.webp +0 -0
  269. package/public/oracle-splash/brand/xsy.webp +0 -0
  270. package/public/oracle-splash/brand/yieldyak.webp +0 -0
  271. package/public/oracle-splash/brand/zerobase.webp +0 -0
  272. package/public/oracle-splash/brand/zerox.webp +0 -0
  273. package/public/oracle-splash/favicon.ico +0 -0
  274. package/public/oracle-splash/favicon.svg +0 -6
  275. package/public/oracle-splash/index.html +0 -1558
  276. package/public/oracle-splash/mesh-graph.png +0 -0
  277. package/public/oracle-splash/mesh-graph.svg +0 -216
  278. package/scripts/adversarial-bench.mjs +0 -114
  279. package/scripts/build-inscription.py +0 -230
  280. package/scripts/check-doc-drift.mjs +0 -123
  281. package/scripts/check-test-count.mjs +0 -105
  282. package/scripts/e2e-hl-markets.mjs +0 -21
  283. package/scripts/e2e-hl-perps.mjs +0 -48
  284. package/scripts/e2e-hypercore-staking.mjs +0 -128
  285. package/scripts/e2e-solana-bitcoin.mjs +0 -183
  286. package/scripts/protocol-template-gate.mjs +0 -15
  287. package/scripts/public-api-scan.mjs +0 -23
  288. package/scripts/secret-scan.mjs +0 -181
  289. package/scripts/verify-v3-venues.mjs +0 -192
  290. package/skills/balance/SKILL.md +0 -176
  291. package/skills/oracle-action-semantics/SKILL.md +0 -40
  292. package/skills/oracle-best-execution/SKILL.md +0 -127
  293. package/skills/oracle-bitcoin/SKILL.md +0 -53
  294. package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
  295. package/skills/oracle-chat/SKILL.md +0 -61
  296. package/skills/oracle-chat/chain.SKILL.md +0 -31
  297. package/skills/oracle-chat/setup.SKILL.md +0 -37
  298. package/skills/oracle-circuit-breaker/SKILL.md +0 -51
  299. package/skills/oracle-contract-research/SKILL.md +0 -55
  300. package/skills/oracle-desk/SKILL.md +0 -58
  301. package/skills/oracle-dex-launch/SKILL.md +0 -38
  302. package/skills/oracle-grants/SKILL.md +0 -69
  303. package/skills/oracle-hypercore-staking/SKILL.md +0 -57
  304. package/skills/oracle-hyperliquid/SKILL.md +0 -56
  305. package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
  306. package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
  307. package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
  308. package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
  309. package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
  310. package/skills/oracle-polymarket/SKILL.md +0 -60
  311. package/skills/oracle-protocol-builder/SKILL.md +0 -59
  312. package/skills/oracle-protocol-security/SKILL.md +0 -60
  313. package/skills/oracle-public-product/SKILL.md +0 -44
  314. package/skills/oracle-receipts/SKILL.md +0 -52
  315. package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
  316. package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
  317. package/skills/oracle-solana/SKILL.md +0 -65
  318. package/skills/oracle-solana-nft/SKILL.md +0 -54
  319. package/skills/oracle-token-research/SKILL.md +0 -67
  320. package/skins/oracle.yaml +0 -56
  321. package/src/action-receipts.mjs +0 -265
  322. package/src/action-semantics.mjs +0 -62
  323. package/src/address-book.mjs +0 -208
  324. package/src/agent-auth.mjs +0 -206
  325. package/src/approval-guard.mjs +0 -282
  326. package/src/attestation-secret.mjs +0 -88
  327. package/src/audit-log.mjs +0 -196
  328. package/src/auth/oauth.mjs +0 -672
  329. package/src/auto-slippage.mjs +0 -378
  330. package/src/capability-posture.mjs +0 -125
  331. package/src/chains.mjs +0 -62
  332. package/src/cli/chain-catalog.mjs +0 -215
  333. package/src/cli/chain-state.mjs +0 -74
  334. package/src/cli/commands/auth.mjs +0 -193
  335. package/src/cli/commands/bootstrap.mjs +0 -87
  336. package/src/cli/commands/chain.mjs +0 -143
  337. package/src/cli/commands/chat.mjs +0 -434
  338. package/src/cli/commands/credential.mjs +0 -9
  339. package/src/cli/commands/data-mcp.mjs +0 -18
  340. package/src/cli/commands/data.mjs +0 -75
  341. package/src/cli/commands/doctor.mjs +0 -136
  342. package/src/cli/commands/help.mjs +0 -7
  343. package/src/cli/commands/init.mjs +0 -27
  344. package/src/cli/commands/mcp.mjs +0 -142
  345. package/src/cli/commands/model.mjs +0 -99
  346. package/src/cli/commands/prepare.mjs +0 -12
  347. package/src/cli/commands/public.mjs +0 -20
  348. package/src/cli/commands/route.mjs +0 -12
  349. package/src/cli/commands/runner.mjs +0 -9
  350. package/src/cli/commands/scan.mjs +0 -12
  351. package/src/cli/commands/setup.mjs +0 -275
  352. package/src/cli/commands/sign.mjs +0 -21
  353. package/src/cli/commands/signer.mjs +0 -9
  354. package/src/cli/commands/upgrade.mjs +0 -12
  355. package/src/cli/commands/vault.mjs +0 -9
  356. package/src/cli/commands/version.mjs +0 -22
  357. package/src/cli/first-run.mjs +0 -23
  358. package/src/cli/kernel.mjs +0 -239
  359. package/src/cli/mcp-targets/chatgpt.mjs +0 -51
  360. package/src/cli/mcp-targets/claude-code.mjs +0 -39
  361. package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
  362. package/src/cli/mcp-targets/codex.mjs +0 -41
  363. package/src/cli/mcp-targets/shared.mjs +0 -61
  364. package/src/cli/messaging-platforms.mjs +0 -209
  365. package/src/cli/model-config.mjs +0 -70
  366. package/src/cli/operator-dispatch.mjs +0 -258
  367. package/src/cli/oracle-harness.py +0 -415
  368. package/src/cli/paths.mjs +0 -83
  369. package/src/cli/runtime.mjs +0 -351
  370. package/src/cli/setup-state.mjs +0 -168
  371. package/src/cli/spawn-child.mjs +0 -43
  372. package/src/data/catalog.mjs +0 -585
  373. package/src/data/desk-data.mjs +0 -695
  374. package/src/data/http.mjs +0 -253
  375. package/src/data/provider-endpoint.mjs +0 -94
  376. package/src/data/providers/aerodrome.mjs +0 -245
  377. package/src/data/providers/balancer.mjs +0 -209
  378. package/src/data/providers/bitcoin-esplora.mjs +0 -216
  379. package/src/data/providers/bitcoin-meta.mjs +0 -378
  380. package/src/data/providers/blockscout.mjs +0 -14
  381. package/src/data/providers/bridges.mjs +0 -242
  382. package/src/data/providers/cowswap.mjs +0 -415
  383. package/src/data/providers/curve.mjs +0 -201
  384. package/src/data/providers/defillama.mjs +0 -88
  385. package/src/data/providers/dexscreener.mjs +0 -43
  386. package/src/data/providers/evm-rpc.mjs +0 -225
  387. package/src/data/providers/geckoterminal.mjs +0 -34
  388. package/src/data/providers/gmx.mjs +0 -496
  389. package/src/data/providers/hl-assets.mjs +0 -165
  390. package/src/data/providers/hl-info.mjs +0 -108
  391. package/src/data/providers/hl-markets.mjs +0 -210
  392. package/src/data/providers/hl-outcome.mjs +0 -61
  393. package/src/data/providers/hl-perps.mjs +0 -387
  394. package/src/data/providers/hl-staking.mjs +0 -353
  395. package/src/data/providers/hl-ws.mjs +0 -119
  396. package/src/data/providers/hyperevm-dex.mjs +0 -49
  397. package/src/data/providers/jupiter-venues.mjs +0 -119
  398. package/src/data/providers/jupiter.mjs +0 -315
  399. package/src/data/providers/lifi.mjs +0 -151
  400. package/src/data/providers/magiceden-sol.mjs +0 -406
  401. package/src/data/providers/morpho.mjs +0 -177
  402. package/src/data/providers/nft-gallery.mjs +0 -163
  403. package/src/data/providers/nft-portfolio.mjs +0 -494
  404. package/src/data/providers/odos.mjs +0 -156
  405. package/src/data/providers/oneinch.mjs +0 -174
  406. package/src/data/providers/opensea-multichain.mjs +0 -136
  407. package/src/data/providers/opensea-nft.mjs +0 -371
  408. package/src/data/providers/paraswap.mjs +0 -118
  409. package/src/data/providers/pendle.mjs +0 -188
  410. package/src/data/providers/poly-clob.mjs +0 -283
  411. package/src/data/providers/poly-public.mjs +0 -96
  412. package/src/data/providers/poly-ws.mjs +0 -103
  413. package/src/data/providers/portfolio-history.mjs +0 -394
  414. package/src/data/providers/portfolio.mjs +0 -594
  415. package/src/data/providers/rfq.mjs +0 -15
  416. package/src/data/providers/rh-agent.mjs +0 -59
  417. package/src/data/providers/satflow.mjs +0 -341
  418. package/src/data/providers/signed-material-guard.mjs +0 -108
  419. package/src/data/providers/solana-rpc.mjs +0 -197
  420. package/src/data/providers/uniswap-v3.mjs +0 -349
  421. package/src/data/providers/uniswap-v4.mjs +0 -414
  422. package/src/data/providers/zerox.mjs +0 -167
  423. package/src/data/public-api-scan.mjs +0 -61
  424. package/src/data/quote-placeholder.mjs +0 -31
  425. package/src/exact-integer.mjs +0 -72
  426. package/src/exec-policy.mjs +0 -455
  427. package/src/flags.mjs +0 -15
  428. package/src/fresh-window.mjs +0 -76
  429. package/src/gmx-attestation.mjs +0 -176
  430. package/src/index.mjs +0 -100
  431. package/src/nft-gas-war-guard.mjs +0 -139
  432. package/src/onboarding/agent-keys.mjs +0 -161
  433. package/src/onboarding/harness-configs.mjs +0 -102
  434. package/src/onboarding/index.mjs +0 -18
  435. package/src/onboarding/tiers.mjs +0 -139
  436. package/src/oracle-env.mjs +0 -47
  437. package/src/portfolio-risk.mjs +0 -170
  438. package/src/prepare-envelope.mjs +0 -204
  439. package/src/profile-upgrade.mjs +0 -277
  440. package/src/protocol-execution.mjs +0 -84
  441. package/src/protocol-templates/gate.mjs +0 -179
  442. package/src/protocol-templates/prepare-deploy.mjs +0 -81
  443. package/src/public-api/buzz-integration.mjs +0 -256
  444. package/src/public-api/connect-agent.mjs +0 -416
  445. package/src/public-api/grants.mjs +0 -142
  446. package/src/public-api/http.mjs +0 -389
  447. package/src/public-control/aa-adapter.mjs +0 -402
  448. package/src/public-control/build-registry.mjs +0 -227
  449. package/src/public-control/bundler-client.mjs +0 -357
  450. package/src/public-control/grant-indexer.mjs +0 -296
  451. package/src/public-control/policy-render.mjs +0 -69
  452. package/src/public-control/policy-schema.mjs +0 -318
  453. package/src/public-control/runtime-config.mjs +0 -275
  454. package/src/public-control/session-key-model.mjs +0 -374
  455. package/src/public-control/session-orchestrator.mjs +0 -412
  456. package/src/rfq/intent.mjs +0 -180
  457. package/src/rfq/sources.mjs +0 -181
  458. package/src/route-attestation.mjs +0 -132
  459. package/src/router/best-execution.mjs +0 -326
  460. package/src/router/index.mjs +0 -226
  461. package/src/router/prepare-bridge.mjs +0 -289
  462. package/src/router/prepare-route.mjs +0 -398
  463. package/src/router/proposal.mjs +0 -311
  464. package/src/router/risk-classifier.mjs +0 -119
  465. package/src/router/route-sources.mjs +0 -364
  466. package/src/scanner/chains.config.mjs +0 -430
  467. package/src/scanner/contract.mjs +0 -270
  468. package/src/scanner/evm-scanner.mjs +0 -394
  469. package/src/scanner/index.mjs +0 -9
  470. package/src/scanner/v2-venue.mjs +0 -335
  471. package/src/scanner/v3-venue.mjs +0 -290
  472. package/src/scopes.mjs +0 -44
  473. package/src/sell-simulation.mjs +0 -167
  474. package/src/signals/engine.mjs +0 -146
  475. package/src/signals/index.mjs +0 -1
  476. package/src/token-transfer-guard.mjs +0 -188
  477. package/src/tui/app.mjs +0 -438
  478. package/src/tui/backend.mjs +0 -145
  479. package/src/tui/format.mjs +0 -272
  480. package/src/tui/gateway-client.mjs +0 -177
  481. package/src/tui/input.mjs +0 -501
  482. package/src/tui/renderer.mjs +0 -443
  483. package/src/tui/standalone-client.mjs +0 -666
  484. package/src/tui/theme.mjs +0 -81
  485. package/src/vault-attestation.mjs +0 -146
  486. package/src/venues.mjs +0 -206
  487. package/src/watch-preferences.mjs +0 -85
@@ -1,406 +0,0 @@
1
- // Magic Eden Solana NFT lane. Read + prepare only.
2
- //
3
- // Reads (collection stats, listings, activities) are keyless on the public
4
- // mainnet API. The instruction builders (buy_now, list, mint) require a Magic
5
- // Eden API key and return an UNSIGNED transaction the user's wallet signs.
6
- // Nothing here signs or broadcasts.
7
-
8
- import { httpJson } from "../http.mjs";
9
- import { solanaPubkey } from "./solana-rpc.mjs";
10
- import { resolveProviderEndpoint, credentialedHeaders } from "../provider-endpoint.mjs";
11
- import { stampPrepared } from "../../prepare-envelope.mjs";
12
- import { assertNoSignedMaterial } from "./signed-material-guard.mjs";
13
-
14
- export const MAGICEDEN_SOL_API = "https://api-mainnet.magiceden.dev/v2";
15
- export const LAMPORTS_PER_SOL = 1_000_000_000;
16
-
17
- function endpoint(opts = {}) {
18
- return resolveProviderEndpoint({
19
- provider: "magiceden",
20
- defaultUrl: MAGICEDEN_SOL_API,
21
- hosts: ["api-mainnet.magiceden.dev", "api-devnet.magiceden.dev"],
22
- url: opts.baseUrl || process.env.MAGICEDEN_API_URL,
23
- });
24
- }
25
-
26
- function base(opts = {}) {
27
- return endpoint(opts).baseUrl;
28
- }
29
-
30
- function apiKey(opts = {}) {
31
- return opts.apiKey || process.env.MAGICEDEN_API_KEY || "";
32
- }
33
-
34
- function headers(opts = {}) {
35
- // Bearer token goes only to a pinned Magic Eden host.
36
- const key = apiKey(opts);
37
- return credentialedHeaders(
38
- { accept: "application/json" },
39
- { Authorization: key ? `Bearer ${key}` : "" },
40
- endpoint(opts).trusted
41
- );
42
- }
43
-
44
- function symbolArg(value) {
45
- const symbol = String(value || "").trim();
46
- if (!/^[a-z0-9_]{1,64}$/i.test(symbol)) throw new Error("magiceden: symbol must be a collection slug");
47
- return symbol;
48
- }
49
-
50
- /**
51
- * Number() accepts "1e2", "0x10", " 12 " and Infinity. A price that parses
52
- * differently from how it reads is a spend-control bug: the UI shows one value
53
- * and the wallet is asked for another. Require a plain decimal.
54
- */
55
- function positiveNumber(value, label) {
56
- if (typeof value === "number") {
57
- if (!Number.isFinite(value) || value <= 0) throw new Error(`magiceden: ${label} must be a positive number`);
58
- return value;
59
- }
60
- const text = String(value ?? "").trim();
61
- if (!/^\d+(\.\d+)?$/.test(text)) {
62
- throw new Error(`magiceden: ${label} must be a plain decimal number (no hex, exponent, or sign)`);
63
- }
64
- const n = Number(text);
65
- if (!Number.isFinite(n) || n <= 0) throw new Error(`magiceden: ${label} must be a positive number`);
66
- return n;
67
- }
68
-
69
- /** Pull the launchpad's quoted mint price (SOL) out of an API response. */
70
- function mintPriceSol(raw) {
71
- const candidates = [
72
- raw?.price,
73
- raw?.mintPrice,
74
- raw?.priceSol,
75
- raw?.v0?.price,
76
- raw?.launchStageInfo?.price,
77
- raw?.stage?.price,
78
- ];
79
- for (const c of candidates) {
80
- if (c == null) continue;
81
- const n = Number(c);
82
- if (Number.isFinite(n) && n >= 0) return n;
83
- }
84
- // A free mint legitimately quotes zero.
85
- if (raw?.isFree === true) return 0;
86
- return null;
87
- }
88
-
89
- function lamports(sol) {
90
- return Math.round(positiveNumber(sol, "priceSol") * LAMPORTS_PER_SOL);
91
- }
92
-
93
- function listingExpiry(value) {
94
- if (value == null || value === "") throw new Error("magiceden: listing expiry is required and must be in the future");
95
- const expiry = Number(value);
96
- if (!Number.isSafeInteger(expiry) || expiry <= 0) {
97
- throw new Error("magiceden: expiry must be a future Unix timestamp in seconds");
98
- }
99
- if (expiry <= Math.floor(Date.now() / 1000)) {
100
- throw new Error("magiceden: expiry must be in the future");
101
- }
102
- return expiry;
103
- }
104
-
105
- function listConfirmation({ tokenMint, priceSol, expiry }) {
106
- return `list ${tokenMint} on magiceden-sol for ${priceSol} SOL until ${expiry}`;
107
- }
108
-
109
- function requireListingConfirmation(args, fields) {
110
- if (args.userConfirmed !== true) {
111
- throw new Error("magiceden: listing requires userConfirmed=true after reviewing tokenMint, priceSol, and expiry");
112
- }
113
- const expected = listConfirmation(fields);
114
- const actual = String(args.confirmation || args.confirmationPhrase || "").trim();
115
- if (actual !== expected) {
116
- throw new Error(`magiceden: confirmation must equal ${JSON.stringify(expected)}`);
117
- }
118
- return expected;
119
- }
120
-
121
- export async function magicEdenSolHealth(opts = {}) {
122
- try {
123
- const stats = await magicEdenSolStats({ symbol: "mad_lads" }, opts);
124
- return {
125
- ok: true,
126
- provider: "magiceden-sol",
127
- keyed: Boolean(apiKey(opts)),
128
- readTier: "keyless",
129
- prepareTier: apiKey(opts) ? "keyed" : "requires MAGICEDEN_API_KEY",
130
- floorPriceSol: stats.floorPriceSol,
131
- exec: false,
132
- };
133
- } catch (error) {
134
- return {
135
- ok: false,
136
- provider: "magiceden-sol",
137
- keyed: Boolean(apiKey(opts)),
138
- error: String(error?.message || error).slice(0, 160),
139
- exec: false,
140
- };
141
- }
142
- }
143
-
144
- export async function magicEdenSolStats(args = {}, opts = {}) {
145
- const symbol = symbolArg(args.symbol || args.collection);
146
- const raw = await httpJson(`${base(opts)}/collections/${encodeURIComponent(symbol)}/stats`, {
147
- headers: headers(opts),
148
- fetchImpl: opts.fetchImpl,
149
- timeoutMs: opts.timeoutMs ?? 12_000,
150
- });
151
- const floorLamports = Number(raw?.floorPrice ?? 0);
152
- return {
153
- provider: "magiceden-sol",
154
- chain: "solana-mainnet-beta",
155
- symbol,
156
- floorPriceLamports: floorLamports || null,
157
- floorPriceSol: floorLamports ? floorLamports / LAMPORTS_PER_SOL : null,
158
- listedCount: raw?.listedCount ?? null,
159
- volume24hrSol: raw?.volume24hr != null ? Number(raw.volume24hr) / LAMPORTS_PER_SOL : null,
160
- avgPrice24hrSol: raw?.avgPrice24hr != null ? Number(raw.avgPrice24hr) / LAMPORTS_PER_SOL : null,
161
- exec: false,
162
- raw,
163
- };
164
- }
165
-
166
- function normalizeListing(item = {}) {
167
- const priceSol = Number(item.price ?? 0);
168
- return {
169
- tokenMint: item.tokenMint ?? null,
170
- tokenATA: item.tokenAddress ?? null,
171
- seller: item.seller ?? null,
172
- sellerReferral: item.sellerReferral ?? null,
173
- auctionHouse: item.auctionHouse ?? null,
174
- pdaAddress: item.pdaAddress ?? null,
175
- priceSol: priceSol || null,
176
- priceLamports: priceSol ? Math.round(priceSol * LAMPORTS_PER_SOL) : null,
177
- tokenSize: item.tokenSize ?? 1,
178
- };
179
- }
180
-
181
- export async function magicEdenSolListings(args = {}, opts = {}) {
182
- const symbol = symbolArg(args.symbol || args.collection);
183
- const limit = Math.min(Math.max(Number(args.limit ?? 20) || 20, 1), 100);
184
- const offset = Math.max(Number(args.offset ?? 0) || 0, 0);
185
- const url = new URL(`${base(opts)}/collections/${encodeURIComponent(symbol)}/listings`);
186
- url.searchParams.set("offset", String(offset));
187
- url.searchParams.set("limit", String(limit));
188
- if (args.sort) url.searchParams.set("sort", String(args.sort));
189
- const raw = await httpJson(url.toString(), {
190
- headers: headers(opts),
191
- fetchImpl: opts.fetchImpl,
192
- timeoutMs: opts.timeoutMs ?? 12_000,
193
- });
194
- const listings = (Array.isArray(raw) ? raw : []).map(normalizeListing);
195
- return {
196
- provider: "magiceden-sol",
197
- chain: "solana-mainnet-beta",
198
- symbol,
199
- count: listings.length,
200
- listings,
201
- exec: false,
202
- };
203
- }
204
-
205
- export async function magicEdenSolTokenListing(args = {}, opts = {}) {
206
- const mint = solanaPubkey(args.tokenMint || args.mint, "tokenMint");
207
- const raw = await httpJson(`${base(opts)}/tokens/${encodeURIComponent(mint)}/listings`, {
208
- headers: headers(opts),
209
- fetchImpl: opts.fetchImpl,
210
- timeoutMs: opts.timeoutMs ?? 12_000,
211
- });
212
- const listings = (Array.isArray(raw) ? raw : []).map(normalizeListing);
213
- return { provider: "magiceden-sol", chain: "solana-mainnet-beta", tokenMint: mint, listings, exec: false };
214
- }
215
-
216
- /**
217
- * Build an UNSIGNED buy_now transaction for a listed Solana NFT.
218
- * Requires MAGICEDEN_API_KEY. Returns base64 tx for the user's wallet.
219
- */
220
- export async function magicEdenSolPrepareBuy(args = {}, opts = {}) {
221
- if (!apiKey(opts)) throw new Error("magiceden: MAGICEDEN_API_KEY required to build a buy instruction");
222
- const buyer = solanaPubkey(args.buyer || args.userPublicKey, "buyer");
223
- const seller = solanaPubkey(args.seller, "seller");
224
- const tokenMint = solanaPubkey(args.tokenMint, "tokenMint");
225
- const tokenATA = solanaPubkey(args.tokenATA || args.tokenAddress, "tokenATA");
226
- const auctionHouse = solanaPubkey(args.auctionHouse, "auctionHouse");
227
- const priceSol = positiveNumber(args.priceSol ?? args.price, "priceSol");
228
- const maxPriceSol = args.maxPriceSol == null ? priceSol : positiveNumber(args.maxPriceSol, "maxPriceSol");
229
- if (priceSol > maxPriceSol) {
230
- throw new Error(`magiceden: listing price ${priceSol} SOL exceeds maxPriceSol cap ${maxPriceSol} SOL`);
231
- }
232
- const url = new URL(`${base(opts)}/instructions/buy_now`);
233
- url.searchParams.set("buyer", buyer);
234
- url.searchParams.set("seller", seller);
235
- url.searchParams.set("auctionHouseAddress", auctionHouse);
236
- url.searchParams.set("tokenMint", tokenMint);
237
- url.searchParams.set("tokenATA", tokenATA);
238
- url.searchParams.set("price", String(priceSol));
239
- if (args.sellerReferral) url.searchParams.set("sellerReferral", String(args.sellerReferral));
240
- if (args.buyerReferral) url.searchParams.set("buyerReferral", String(args.buyerReferral));
241
- const raw = await httpJson(url.toString(), {
242
- headers: headers(opts),
243
- fetchImpl: opts.fetchImpl,
244
- timeoutMs: opts.timeoutMs ?? 15_000,
245
- });
246
- // Refuse pre-signed material by PRESENCE, before selecting unsigned bytes.
247
- // A mixed payload (valid unsigned bytes plus a signed sibling) previously
248
- // skipped this check entirely and bound the signed field into the envelope.
249
- assertNoSignedMaterial("magiceden", raw);
250
- const data = raw?.v0?.tx?.data ?? raw?.tx?.data ?? null;
251
- // Accept ONLY the documented unsigned instruction field. A pre-signed payload
252
- // (txSigned) from a compromised or impersonated API must never be laundered
253
- // into a "prepare" result — the user would be signing bytes Oracle never
254
- // validated against the price cap.
255
- if (!Array.isArray(data)) {
256
- if (raw?.txSigned) throw new Error("magiceden: refused a pre-signed transaction payload from the API");
257
- throw new Error("magiceden: buy_now returned no unsigned transaction payload");
258
- }
259
- const transaction = Buffer.from(data).toString("base64");
260
- return stampPrepared({
261
- provider: "magiceden-sol",
262
- chain: "solana-mainnet-beta",
263
- kind: "nft-buy",
264
- prepareReady: true,
265
- executionReady: false,
266
- signingReady: false,
267
- broadcastReady: false,
268
- requiresUserSignature: true,
269
- buyer,
270
- seller,
271
- tokenMint,
272
- priceSol,
273
- maxPriceSol,
274
- lamports: lamports(priceSol),
275
- transaction,
276
- transactionEncoding: "base64",
277
- raw,
278
- });
279
- }
280
-
281
- /**
282
- * Build an UNSIGNED list instruction so a holder can list their own NFT.
283
- * Requires MAGICEDEN_API_KEY. User wallet signs; Oracle never broadcasts.
284
- */
285
- export async function magicEdenSolPrepareList(args = {}, opts = {}) {
286
- if (!apiKey(opts)) throw new Error("magiceden: MAGICEDEN_API_KEY required to build a list instruction");
287
- const seller = solanaPubkey(args.seller || args.userPublicKey, "seller");
288
- const tokenMint = solanaPubkey(args.tokenMint, "tokenMint");
289
- const tokenATA = solanaPubkey(args.tokenATA || args.tokenAddress, "tokenATA");
290
- const auctionHouse = solanaPubkey(args.auctionHouse, "auctionHouse");
291
- const priceSol = positiveNumber(args.priceSol ?? args.price, "priceSol");
292
- const expiry = listingExpiry(args.expiry);
293
- const confirmation = requireListingConfirmation(args, { tokenMint, priceSol, expiry });
294
- const url = new URL(`${base(opts)}/instructions/sell`);
295
- url.searchParams.set("seller", seller);
296
- url.searchParams.set("auctionHouseAddress", auctionHouse);
297
- url.searchParams.set("tokenMint", tokenMint);
298
- url.searchParams.set("tokenAccount", tokenATA);
299
- url.searchParams.set("price", String(priceSol));
300
- if (args.sellerReferral) url.searchParams.set("sellerReferral", solanaPubkey(args.sellerReferral, "sellerReferral"));
301
- if (expiry != null) url.searchParams.set("expiry", String(expiry));
302
- const raw = await httpJson(url.toString(), {
303
- headers: headers(opts),
304
- fetchImpl: opts.fetchImpl,
305
- timeoutMs: opts.timeoutMs ?? 15_000,
306
- });
307
- // Refuse pre-signed material by PRESENCE, before selecting unsigned bytes.
308
- // A mixed payload (valid unsigned bytes plus a signed sibling) previously
309
- // skipped this check entirely and bound the signed field into the envelope.
310
- assertNoSignedMaterial("magiceden", raw);
311
- const data = raw?.v0?.tx?.data ?? raw?.tx?.data ?? null;
312
- if (!Array.isArray(data)) {
313
- if (raw?.txSigned) throw new Error("magiceden: refused a pre-signed transaction payload from the API");
314
- throw new Error("magiceden: sell returned no unsigned transaction payload");
315
- }
316
- const transaction = Buffer.from(data).toString("base64");
317
- return stampPrepared({
318
- provider: "magiceden-sol",
319
- chain: "solana-mainnet-beta",
320
- kind: "nft-list",
321
- prepareReady: true,
322
- executionReady: false,
323
- signingReady: false,
324
- broadcastReady: false,
325
- requiresUserSignature: true,
326
- seller,
327
- tokenMint,
328
- priceSol,
329
- expiry,
330
- confirmation,
331
- transaction,
332
- transactionEncoding: "base64",
333
- raw,
334
- });
335
- }
336
-
337
- /**
338
- * Launchpad mint instruction. Requires MAGICEDEN_API_KEY. Unsigned only.
339
- */
340
- export async function magicEdenSolPrepareMint(args = {}, opts = {}) {
341
- if (!apiKey(opts)) throw new Error("magiceden: MAGICEDEN_API_KEY required to build a mint instruction");
342
- const buyer = solanaPubkey(args.buyer || args.userPublicKey, "buyer");
343
- const symbol = symbolArg(args.symbol || args.collection);
344
- // A mint debits the buyer, so the cap is mandatory. Recording it without
345
- // enforcing it is worse than having none: the caller believes a ceiling held.
346
- if (args.maxPriceSol == null) {
347
- throw new Error("magiceden: maxPriceSol is required to prepare a mint — an uncapped mint has no spend ceiling");
348
- }
349
- const maxPriceSol = positiveNumber(args.maxPriceSol, "maxPriceSol");
350
- const nftAmount = args.nftAmount == null ? 1 : positiveNumber(args.nftAmount, "nftAmount");
351
- if (!Number.isInteger(nftAmount)) throw new Error("magiceden: nftAmount must be a whole number");
352
-
353
- const url = new URL(`${base(opts)}/instructions/mint`);
354
- url.searchParams.set("symbol", symbol);
355
- url.searchParams.set("wallet", buyer);
356
- url.searchParams.set("nftAmount", String(nftAmount));
357
- const raw = await httpJson(url.toString(), {
358
- headers: headers(opts),
359
- fetchImpl: opts.fetchImpl,
360
- timeoutMs: opts.timeoutMs ?? 15_000,
361
- });
362
-
363
- // Enforce the cap against the price the launchpad actually quotes. If the
364
- // price cannot be determined, fail closed rather than return an unbounded
365
- // mint the caller thinks is capped.
366
- const quoted = mintPriceSol(raw);
367
- if (quoted == null) {
368
- throw new Error("magiceden: mint price not present in the API response — refusing to prepare an unverifiable spend");
369
- }
370
- const totalSol = quoted * nftAmount;
371
- if (totalSol > maxPriceSol) {
372
- throw new Error(
373
- `magiceden: mint cost ${totalSol} SOL exceeds maxPriceSol cap ${maxPriceSol} SOL`
374
- );
375
- }
376
-
377
- // Refuse pre-signed material by PRESENCE, before selecting unsigned bytes.
378
- // A mixed payload (valid unsigned bytes plus a signed sibling) previously
379
- // skipped this check entirely and bound the signed field into the envelope.
380
- assertNoSignedMaterial("magiceden", raw);
381
- const data = raw?.v0?.tx?.data ?? raw?.tx?.data ?? null;
382
- if (!Array.isArray(data)) {
383
- if (raw?.txSigned) throw new Error("magiceden: refused a pre-signed transaction payload from the API");
384
- throw new Error("magiceden: mint returned no unsigned transaction payload");
385
- }
386
- const transaction = Buffer.from(data).toString("base64");
387
- return stampPrepared({
388
- provider: "magiceden-sol",
389
- chain: "solana-mainnet-beta",
390
- kind: "nft-mint",
391
- prepareReady: true,
392
- executionReady: false,
393
- signingReady: false,
394
- broadcastReady: false,
395
- requiresUserSignature: true,
396
- buyer,
397
- symbol,
398
- nftAmount,
399
- priceSol: quoted,
400
- totalSol,
401
- maxPriceSol,
402
- transaction,
403
- transactionEncoding: "base64",
404
- raw,
405
- });
406
- }
@@ -1,177 +0,0 @@
1
- // Morpho public GraphQL API — markets/vaults, no key. ERC-4626 vault
2
- // prepare returns a guarded intent only; dynamic vault tx signing/submission is a
3
- // later, separately gated execution step.
4
-
5
- import { Interface, getAddress, isAddress, keccak256, toUtf8Bytes } from "ethers";
6
- import { httpJson } from "../http.mjs";
7
- import { rpcCall as defaultRpcCall } from "./evm-rpc.mjs";
8
- import { stampPrepared } from "../../prepare-envelope.mjs";
9
-
10
- export const MORPHO_API = "https://api.morpho.org/graphql";
11
-
12
- const ERC4626 = new Interface([
13
- "function asset() view returns (address)",
14
- "function maxDeposit(address owner) view returns (uint256)",
15
- "function previewDeposit(uint256 assets) view returns (uint256)",
16
- "function deposit(uint256 assets,address receiver) returns (uint256)",
17
- "function maxWithdraw(address owner) view returns (uint256)",
18
- "function previewWithdraw(uint256 assets) view returns (uint256)",
19
- "function withdraw(uint256 assets,address receiver,address owner) returns (uint256)",
20
- ]);
21
-
22
- const endpoint = (o = {}) => o.baseUrl || process.env.MORPHO_API_URL || MORPHO_API;
23
-
24
- async function gql(query, variables, opts = {}) {
25
- return httpJson(endpoint(opts), {
26
- method: "POST",
27
- body: { query, variables },
28
- fetchImpl: opts.fetchImpl,
29
- timeoutMs: opts.timeoutMs ?? 20_000,
30
- });
31
- }
32
-
33
- const MARKET_QUERY = `query Markets($first: Int, $where: MarketFilters) { markets(first: $first, where: $where) { items { marketId lltv listed loanAsset { address symbol decimals } collateralAsset { address symbol decimals } state { supplyAssetsUsd borrowAssetsUsd } } } }`;
34
- const VAULT_QUERY = `query Vaults($first: Int, $where: VaultFilters) { vaults(first: $first, where: $where) { items { address name symbol listed asset { address symbol decimals } state { totalAssets totalAssetsUsd apy } } } }`;
35
-
36
- function normalAddress(value, label) {
37
- const text = String(value || "").trim();
38
- if (!isAddress(text)) throw new Error(`morpho: ${label} must be an address`);
39
- return getAddress(text).toLowerCase();
40
- }
41
-
42
- function amountString(value, label = "amount") {
43
- try {
44
- const n = BigInt(String(value));
45
- if (n <= 0n) throw new Error("nonpositive");
46
- return n.toString();
47
- } catch {
48
- throw new Error(`morpho: ${label} must be a positive integer string`);
49
- }
50
- }
51
-
52
- function canonicalJson(value) {
53
- if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
54
- if (value && typeof value === "object") {
55
- return `{${Object.keys(value).sort().map((k) => `${JSON.stringify(k)}:${canonicalJson(value[k])}`).join(",")}}`;
56
- }
57
- return JSON.stringify(value);
58
- }
59
-
60
- async function callVault(chainId, vault, fn, args, opts = {}) {
61
- const data = ERC4626.encodeFunctionData(fn, args);
62
- const call = opts.rpcCall || defaultRpcCall;
63
- const result = await call(Number(chainId), "eth_call", [{ to: vault, data }, "latest"], opts);
64
- return ERC4626.decodeFunctionResult(fn, result);
65
- }
66
-
67
- function listedVault(items, vault) {
68
- const target = vault.toLowerCase();
69
- return (items || []).find((item) => String(item?.address || "").toLowerCase() === target) || null;
70
- }
71
-
72
- export async function morphoMarkets(args = {}, opts = {}) {
73
- const first = Math.min(100, Math.max(1, Number(args.first || 20)));
74
- const chainIds = (args.chainIds || [args.chainId || 1]).map(Number);
75
- return gql(MARKET_QUERY, { first, chainIds, where: { chainId_in: chainIds } }, opts);
76
- }
77
-
78
- export async function morphoVaults(args = {}, opts = {}) {
79
- const first = Math.min(100, Math.max(1, Number(args.first || 20)));
80
- const chainIds = (args.chainIds || [args.chainId || 1]).map(Number);
81
- return gql(VAULT_QUERY, { first, chainIds, where: { chainId_in: chainIds } }, opts);
82
- }
83
-
84
- export async function morphoHealth(opts = {}) {
85
- const data = await gql("query { __typename }", {}, opts);
86
- return { ok: data?.data?.__typename === "Query" };
87
- }
88
-
89
- export async function morphoPrepareVault(args = {}, opts = {}) {
90
- const chainId = Number(args.chainId ?? 8453);
91
- const action = String(args.action || "deposit").toLowerCase();
92
- if (!["deposit", "withdraw"].includes(action)) throw new Error("morpho: action must be deposit or withdraw");
93
- const vault = normalAddress(args.vault || args.vaultAddress, "vault");
94
- const owner = normalAddress(args.owner || args.from || args.sender, "owner");
95
- const receiver = normalAddress(args.receiver || owner, "receiver");
96
- const amount = amountString(args.amount || args.assets, "amount");
97
- const minTotalAssetsUsd = Number(args.minTotalAssetsUsd ?? 100_000);
98
-
99
- const vaults = await morphoVaults({ chainId, first: 100 }, opts);
100
- const info = listedVault(vaults?.data?.vaults?.items, vault);
101
- if (!info) throw new Error("morpho: vault not found in public Morpho vault registry");
102
- if (info.listed === false) throw new Error("morpho: vault is not listed");
103
- const totalAssetsUsd = Number(info?.state?.totalAssetsUsd ?? 0);
104
- if (Number.isFinite(minTotalAssetsUsd) && totalAssetsUsd < minTotalAssetsUsd) {
105
- throw new Error(`morpho: vault totalAssetsUsd ${totalAssetsUsd} below minimum ${minTotalAssetsUsd}`);
106
- }
107
-
108
- const [assetOnchain] = await callVault(chainId, vault, "asset", [], opts);
109
- const asset = normalAddress(assetOnchain, "vault asset");
110
- const apiAsset = info?.asset?.address ? normalAddress(info.asset.address, "api vault asset") : asset;
111
- if (apiAsset !== asset) throw new Error("morpho: API asset and on-chain asset mismatch");
112
-
113
- let data;
114
- let floor;
115
- if (action === "deposit") {
116
- const [maxDeposit] = await callVault(chainId, vault, "maxDeposit", [owner], opts);
117
- if (BigInt(amount) > BigInt(maxDeposit.toString())) throw new Error("morpho: amount exceeds maxDeposit");
118
- const [sharesOut] = await callVault(chainId, vault, "previewDeposit", [amount], opts);
119
- if (BigInt(sharesOut.toString()) <= 0n) throw new Error("morpho: previewDeposit returned zero shares");
120
- floor = { minSharesOut: sharesOut.toString() };
121
- data = ERC4626.encodeFunctionData("deposit", [amount, receiver]);
122
- } else {
123
- const [maxWithdraw] = await callVault(chainId, vault, "maxWithdraw", [owner], opts);
124
- if (BigInt(amount) > BigInt(maxWithdraw.toString())) throw new Error("morpho: amount exceeds maxWithdraw");
125
- const [sharesIn] = await callVault(chainId, vault, "previewWithdraw", [amount], opts);
126
- if (BigInt(sharesIn.toString()) <= 0n) throw new Error("morpho: previewWithdraw returned zero shares");
127
- floor = { maxSharesIn: sharesIn.toString() };
128
- data = ERC4626.encodeFunctionData("withdraw", [amount, receiver, owner]);
129
- }
130
-
131
- const vaultGuard = {
132
- mode: "erc4626-vault",
133
- version: 1,
134
- provider: "morpho",
135
- chainId,
136
- action,
137
- vault,
138
- asset,
139
- owner,
140
- receiver,
141
- amount,
142
- totalAssetsUsd,
143
- ...floor,
144
- calldataHash: keccak256(toUtf8Bytes(data)),
145
- issuedAtMs: Date.now(),
146
- expiresAtMs: Date.now() + 20_000,
147
- };
148
- vaultGuard.guardHash = keccak256(toUtf8Bytes(canonicalJson(vaultGuard)));
149
-
150
- return stampPrepared({
151
- provider: "morpho",
152
- protocol: "erc4626-vault",
153
- vaultReady: true,
154
- executionReady: false,
155
- signingReady: false,
156
- broadcastReady: false,
157
- requiresUserSignature: true,
158
- chainId,
159
- action,
160
- vault,
161
- asset,
162
- owner,
163
- receiver,
164
- amount,
165
- vaultInfo: info,
166
- vaultGuard,
167
- requiresApproval: action === "deposit" ? { token: asset, spender: vault, amount } : null,
168
- transaction: {
169
- chainId,
170
- from: owner,
171
- to: vault,
172
- data,
173
- value: "0x0",
174
- madVault: vaultGuard,
175
- },
176
- }, { provider: "morpho", kind: "erc4626-vault" });
177
- }