@echoclaw/echo-0g 1.0.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 (371) hide show
  1. package/README.md +1175 -0
  2. package/dist/0g-compute/account.d.ts +36 -0
  3. package/dist/0g-compute/account.d.ts.map +1 -0
  4. package/dist/0g-compute/account.js +85 -0
  5. package/dist/0g-compute/account.js.map +1 -0
  6. package/dist/0g-compute/bridge.d.ts +16 -0
  7. package/dist/0g-compute/bridge.d.ts.map +1 -0
  8. package/dist/0g-compute/bridge.js +40 -0
  9. package/dist/0g-compute/bridge.js.map +1 -0
  10. package/dist/0g-compute/broker-factory.d.ts +19 -0
  11. package/dist/0g-compute/broker-factory.d.ts.map +1 -0
  12. package/dist/0g-compute/broker-factory.js +65 -0
  13. package/dist/0g-compute/broker-factory.js.map +1 -0
  14. package/dist/0g-compute/constants.d.ts +10 -0
  15. package/dist/0g-compute/constants.d.ts.map +1 -0
  16. package/dist/0g-compute/constants.js +12 -0
  17. package/dist/0g-compute/constants.js.map +1 -0
  18. package/dist/0g-compute/monitor.d.ts +43 -0
  19. package/dist/0g-compute/monitor.d.ts.map +1 -0
  20. package/dist/0g-compute/monitor.js +302 -0
  21. package/dist/0g-compute/monitor.js.map +1 -0
  22. package/dist/0g-compute/pricing.d.ts +43 -0
  23. package/dist/0g-compute/pricing.d.ts.map +1 -0
  24. package/dist/0g-compute/pricing.js +53 -0
  25. package/dist/0g-compute/pricing.js.map +1 -0
  26. package/dist/0g-compute/sdk-bridge.cjs +17 -0
  27. package/dist/0g-compute/sdk-bridge.cjs.map +1 -0
  28. package/dist/0g-compute/sdk-bridge.d.cts +9 -0
  29. package/dist/0g-compute/sdk-bridge.d.cts.map +1 -0
  30. package/dist/0g-compute/smoke-test.d.ts +11 -0
  31. package/dist/0g-compute/smoke-test.d.ts.map +1 -0
  32. package/dist/0g-compute/smoke-test.js +172 -0
  33. package/dist/0g-compute/smoke-test.js.map +1 -0
  34. package/dist/bot/daemon.d.ts +34 -0
  35. package/dist/bot/daemon.d.ts.map +1 -0
  36. package/dist/bot/daemon.js +386 -0
  37. package/dist/bot/daemon.js.map +1 -0
  38. package/dist/bot/executor.d.ts +14238 -0
  39. package/dist/bot/executor.d.ts.map +1 -0
  40. package/dist/bot/executor.js +183 -0
  41. package/dist/bot/executor.js.map +1 -0
  42. package/dist/bot/nonce-queue.d.ts +20 -0
  43. package/dist/bot/nonce-queue.d.ts.map +1 -0
  44. package/dist/bot/nonce-queue.js +41 -0
  45. package/dist/bot/nonce-queue.js.map +1 -0
  46. package/dist/bot/notify.d.ts +15 -0
  47. package/dist/bot/notify.d.ts.map +1 -0
  48. package/dist/bot/notify.js +98 -0
  49. package/dist/bot/notify.js.map +1 -0
  50. package/dist/bot/orders.d.ts +30 -0
  51. package/dist/bot/orders.d.ts.map +1 -0
  52. package/dist/bot/orders.js +172 -0
  53. package/dist/bot/orders.js.map +1 -0
  54. package/dist/bot/state.d.ts +14 -0
  55. package/dist/bot/state.d.ts.map +1 -0
  56. package/dist/bot/state.js +109 -0
  57. package/dist/bot/state.js.map +1 -0
  58. package/dist/bot/stream.d.ts +28 -0
  59. package/dist/bot/stream.d.ts.map +1 -0
  60. package/dist/bot/stream.js +96 -0
  61. package/dist/bot/stream.js.map +1 -0
  62. package/dist/bot/triggers.d.ts +17 -0
  63. package/dist/bot/triggers.d.ts.map +1 -0
  64. package/dist/bot/triggers.js +95 -0
  65. package/dist/bot/triggers.js.map +1 -0
  66. package/dist/bot/types.d.ts +199 -0
  67. package/dist/bot/types.d.ts.map +1 -0
  68. package/dist/bot/types.js +12 -0
  69. package/dist/bot/types.js.map +1 -0
  70. package/dist/chainscan/client.d.ts +28 -0
  71. package/dist/chainscan/client.d.ts.map +1 -0
  72. package/dist/chainscan/client.js +361 -0
  73. package/dist/chainscan/client.js.map +1 -0
  74. package/dist/chainscan/constants.d.ts +15 -0
  75. package/dist/chainscan/constants.d.ts.map +1 -0
  76. package/dist/chainscan/constants.js +15 -0
  77. package/dist/chainscan/constants.js.map +1 -0
  78. package/dist/chainscan/types.d.ts +148 -0
  79. package/dist/chainscan/types.d.ts.map +1 -0
  80. package/dist/chainscan/types.js +2 -0
  81. package/dist/chainscan/types.js.map +1 -0
  82. package/dist/chainscan/validation.d.ts +35 -0
  83. package/dist/chainscan/validation.d.ts.map +1 -0
  84. package/dist/chainscan/validation.js +97 -0
  85. package/dist/chainscan/validation.js.map +1 -0
  86. package/dist/cli.d.ts +7 -0
  87. package/dist/cli.d.ts.map +1 -0
  88. package/dist/cli.js +328 -0
  89. package/dist/cli.js.map +1 -0
  90. package/dist/commands/0g-compute.d.ts +21 -0
  91. package/dist/commands/0g-compute.d.ts.map +1 -0
  92. package/dist/commands/0g-compute.js +850 -0
  93. package/dist/commands/0g-compute.js.map +1 -0
  94. package/dist/commands/chainscan.d.ts +17 -0
  95. package/dist/commands/chainscan.d.ts.map +1 -0
  96. package/dist/commands/chainscan.js +605 -0
  97. package/dist/commands/chainscan.js.map +1 -0
  98. package/dist/commands/config.d.ts +3 -0
  99. package/dist/commands/config.d.ts.map +1 -0
  100. package/dist/commands/config.js +251 -0
  101. package/dist/commands/config.js.map +1 -0
  102. package/dist/commands/echobook.d.ts +17 -0
  103. package/dist/commands/echobook.d.ts.map +1 -0
  104. package/dist/commands/echobook.js +905 -0
  105. package/dist/commands/echobook.js.map +1 -0
  106. package/dist/commands/jaine-subgraph.d.ts +3 -0
  107. package/dist/commands/jaine-subgraph.d.ts.map +1 -0
  108. package/dist/commands/jaine-subgraph.js +565 -0
  109. package/dist/commands/jaine-subgraph.js.map +1 -0
  110. package/dist/commands/jaine.d.ts +3 -0
  111. package/dist/commands/jaine.d.ts.map +1 -0
  112. package/dist/commands/jaine.js +1415 -0
  113. package/dist/commands/jaine.js.map +1 -0
  114. package/dist/commands/marketmaker.d.ts +6 -0
  115. package/dist/commands/marketmaker.d.ts.map +1 -0
  116. package/dist/commands/marketmaker.js +451 -0
  117. package/dist/commands/marketmaker.js.map +1 -0
  118. package/dist/commands/send.d.ts +3 -0
  119. package/dist/commands/send.d.ts.map +1 -0
  120. package/dist/commands/send.js +229 -0
  121. package/dist/commands/send.js.map +1 -0
  122. package/dist/commands/setup.d.ts +3 -0
  123. package/dist/commands/setup.d.ts.map +1 -0
  124. package/dist/commands/setup.js +263 -0
  125. package/dist/commands/setup.js.map +1 -0
  126. package/dist/commands/slop-app.d.ts +9 -0
  127. package/dist/commands/slop-app.d.ts.map +1 -0
  128. package/dist/commands/slop-app.js +708 -0
  129. package/dist/commands/slop-app.js.map +1 -0
  130. package/dist/commands/slop-stream.d.ts +9 -0
  131. package/dist/commands/slop-stream.d.ts.map +1 -0
  132. package/dist/commands/slop-stream.js +99 -0
  133. package/dist/commands/slop-stream.js.map +1 -0
  134. package/dist/commands/slop.d.ts +3 -0
  135. package/dist/commands/slop.d.ts.map +1 -0
  136. package/dist/commands/slop.js +1053 -0
  137. package/dist/commands/slop.js.map +1 -0
  138. package/dist/commands/wallet.d.ts +13 -0
  139. package/dist/commands/wallet.d.ts.map +1 -0
  140. package/dist/commands/wallet.js +748 -0
  141. package/dist/commands/wallet.js.map +1 -0
  142. package/dist/config/paths.d.ts +13 -0
  143. package/dist/config/paths.d.ts.map +1 -0
  144. package/dist/config/paths.js +33 -0
  145. package/dist/config/paths.js.map +1 -0
  146. package/dist/config/store.d.ts +48 -0
  147. package/dist/config/store.d.ts.map +1 -0
  148. package/dist/config/store.js +113 -0
  149. package/dist/config/store.js.map +1 -0
  150. package/dist/constants/chain.d.ts +57 -0
  151. package/dist/constants/chain.d.ts.map +1 -0
  152. package/dist/constants/chain.js +51 -0
  153. package/dist/constants/chain.js.map +1 -0
  154. package/dist/echobook/api.d.ts +38 -0
  155. package/dist/echobook/api.d.ts.map +1 -0
  156. package/dist/echobook/api.js +86 -0
  157. package/dist/echobook/api.js.map +1 -0
  158. package/dist/echobook/auth.d.ts +31 -0
  159. package/dist/echobook/auth.d.ts.map +1 -0
  160. package/dist/echobook/auth.js +93 -0
  161. package/dist/echobook/auth.js.map +1 -0
  162. package/dist/echobook/comments.d.ts +26 -0
  163. package/dist/echobook/comments.d.ts.map +1 -0
  164. package/dist/echobook/comments.js +20 -0
  165. package/dist/echobook/comments.js.map +1 -0
  166. package/dist/echobook/follows.d.ts +19 -0
  167. package/dist/echobook/follows.d.ts.map +1 -0
  168. package/dist/echobook/follows.js +21 -0
  169. package/dist/echobook/follows.js.map +1 -0
  170. package/dist/echobook/jwtCache.d.ts +15 -0
  171. package/dist/echobook/jwtCache.d.ts.map +1 -0
  172. package/dist/echobook/jwtCache.js +63 -0
  173. package/dist/echobook/jwtCache.js.map +1 -0
  174. package/dist/echobook/notifications.d.ts +30 -0
  175. package/dist/echobook/notifications.d.ts.map +1 -0
  176. package/dist/echobook/notifications.js +26 -0
  177. package/dist/echobook/notifications.js.map +1 -0
  178. package/dist/echobook/points.d.ts +35 -0
  179. package/dist/echobook/points.d.ts.map +1 -0
  180. package/dist/echobook/points.js +20 -0
  181. package/dist/echobook/points.js.map +1 -0
  182. package/dist/echobook/posts.d.ts +46 -0
  183. package/dist/echobook/posts.d.ts.map +1 -0
  184. package/dist/echobook/posts.js +43 -0
  185. package/dist/echobook/posts.js.map +1 -0
  186. package/dist/echobook/profile.d.ts +29 -0
  187. package/dist/echobook/profile.d.ts.map +1 -0
  188. package/dist/echobook/profile.js +14 -0
  189. package/dist/echobook/profile.js.map +1 -0
  190. package/dist/echobook/submolts.d.ts +22 -0
  191. package/dist/echobook/submolts.d.ts.map +1 -0
  192. package/dist/echobook/submolts.js +24 -0
  193. package/dist/echobook/submolts.js.map +1 -0
  194. package/dist/echobook/tradeProof.d.ts +21 -0
  195. package/dist/echobook/tradeProof.d.ts.map +1 -0
  196. package/dist/echobook/tradeProof.js +14 -0
  197. package/dist/echobook/tradeProof.js.map +1 -0
  198. package/dist/echobook/votes.d.ts +17 -0
  199. package/dist/echobook/votes.d.ts.map +1 -0
  200. package/dist/echobook/votes.js +20 -0
  201. package/dist/echobook/votes.js.map +1 -0
  202. package/dist/errors.d.ts +125 -0
  203. package/dist/errors.d.ts.map +1 -0
  204. package/dist/errors.js +147 -0
  205. package/dist/errors.js.map +1 -0
  206. package/dist/intents/store.d.ts +22 -0
  207. package/dist/intents/store.d.ts.map +1 -0
  208. package/dist/intents/store.js +76 -0
  209. package/dist/intents/store.js.map +1 -0
  210. package/dist/intents/types.d.ts +21 -0
  211. package/dist/intents/types.d.ts.map +1 -0
  212. package/dist/intents/types.js +2 -0
  213. package/dist/intents/types.js.map +1 -0
  214. package/dist/jaine/abi/erc20.d.ts +90 -0
  215. package/dist/jaine/abi/erc20.d.ts.map +1 -0
  216. package/dist/jaine/abi/erc20.js +65 -0
  217. package/dist/jaine/abi/erc20.js.map +1 -0
  218. package/dist/jaine/abi/factory.d.ts +38 -0
  219. package/dist/jaine/abi/factory.d.ts.map +1 -0
  220. package/dist/jaine/abi/factory.js +26 -0
  221. package/dist/jaine/abi/factory.js.map +1 -0
  222. package/dist/jaine/abi/index.d.ts +11 -0
  223. package/dist/jaine/abi/index.d.ts.map +1 -0
  224. package/dist/jaine/abi/index.js +11 -0
  225. package/dist/jaine/abi/index.js.map +1 -0
  226. package/dist/jaine/abi/nftManager.d.ts +282 -0
  227. package/dist/jaine/abi/nftManager.d.ts.map +1 -0
  228. package/dist/jaine/abi/nftManager.js +182 -0
  229. package/dist/jaine/abi/nftManager.js.map +1 -0
  230. package/dist/jaine/abi/pool.d.ts +77 -0
  231. package/dist/jaine/abi/pool.d.ts.map +1 -0
  232. package/dist/jaine/abi/pool.js +56 -0
  233. package/dist/jaine/abi/pool.js.map +1 -0
  234. package/dist/jaine/abi/quoter.d.ts +84 -0
  235. package/dist/jaine/abi/quoter.d.ts.map +1 -0
  236. package/dist/jaine/abi/quoter.js +53 -0
  237. package/dist/jaine/abi/quoter.js.map +1 -0
  238. package/dist/jaine/abi/router.d.ts +135 -0
  239. package/dist/jaine/abi/router.d.ts.map +1 -0
  240. package/dist/jaine/abi/router.js +88 -0
  241. package/dist/jaine/abi/router.js.map +1 -0
  242. package/dist/jaine/abi/w0g.d.ts +41 -0
  243. package/dist/jaine/abi/w0g.d.ts.map +1 -0
  244. package/dist/jaine/abi/w0g.js +34 -0
  245. package/dist/jaine/abi/w0g.js.map +1 -0
  246. package/dist/jaine/allowance.d.ts +48 -0
  247. package/dist/jaine/allowance.d.ts.map +1 -0
  248. package/dist/jaine/allowance.js +192 -0
  249. package/dist/jaine/allowance.js.map +1 -0
  250. package/dist/jaine/coreTokens.d.ts +32 -0
  251. package/dist/jaine/coreTokens.d.ts.map +1 -0
  252. package/dist/jaine/coreTokens.js +91 -0
  253. package/dist/jaine/coreTokens.js.map +1 -0
  254. package/dist/jaine/pathEncoding.d.ts +39 -0
  255. package/dist/jaine/pathEncoding.d.ts.map +1 -0
  256. package/dist/jaine/pathEncoding.js +98 -0
  257. package/dist/jaine/pathEncoding.js.map +1 -0
  258. package/dist/jaine/paths.d.ts +11 -0
  259. package/dist/jaine/paths.d.ts.map +1 -0
  260. package/dist/jaine/paths.js +20 -0
  261. package/dist/jaine/paths.js.map +1 -0
  262. package/dist/jaine/poolCache.d.ts +47 -0
  263. package/dist/jaine/poolCache.d.ts.map +1 -0
  264. package/dist/jaine/poolCache.js +195 -0
  265. package/dist/jaine/poolCache.js.map +1 -0
  266. package/dist/jaine/routing.d.ts +41 -0
  267. package/dist/jaine/routing.d.ts.map +1 -0
  268. package/dist/jaine/routing.js +247 -0
  269. package/dist/jaine/routing.js.map +1 -0
  270. package/dist/jaine/subgraph/client.d.ts +26 -0
  271. package/dist/jaine/subgraph/client.d.ts.map +1 -0
  272. package/dist/jaine/subgraph/client.js +201 -0
  273. package/dist/jaine/subgraph/client.js.map +1 -0
  274. package/dist/jaine/subgraph/constants.d.ts +9 -0
  275. package/dist/jaine/subgraph/constants.d.ts.map +1 -0
  276. package/dist/jaine/subgraph/constants.js +9 -0
  277. package/dist/jaine/subgraph/constants.js.map +1 -0
  278. package/dist/jaine/subgraph/queries.d.ts +21 -0
  279. package/dist/jaine/subgraph/queries.d.ts.map +1 -0
  280. package/dist/jaine/subgraph/queries.js +304 -0
  281. package/dist/jaine/subgraph/queries.js.map +1 -0
  282. package/dist/jaine/subgraph/types.d.ts +209 -0
  283. package/dist/jaine/subgraph/types.d.ts.map +1 -0
  284. package/dist/jaine/subgraph/types.js +7 -0
  285. package/dist/jaine/subgraph/types.js.map +1 -0
  286. package/dist/jaine/userTokens.d.ts +27 -0
  287. package/dist/jaine/userTokens.d.ts.map +1 -0
  288. package/dist/jaine/userTokens.js +89 -0
  289. package/dist/jaine/userTokens.js.map +1 -0
  290. package/dist/openclaw/config.d.ts +43 -0
  291. package/dist/openclaw/config.d.ts.map +1 -0
  292. package/dist/openclaw/config.js +231 -0
  293. package/dist/openclaw/config.js.map +1 -0
  294. package/dist/openclaw/hooks-client.d.ts +24 -0
  295. package/dist/openclaw/hooks-client.d.ts.map +1 -0
  296. package/dist/openclaw/hooks-client.js +119 -0
  297. package/dist/openclaw/hooks-client.js.map +1 -0
  298. package/dist/slop/abi/factory.d.ts +128 -0
  299. package/dist/slop/abi/factory.d.ts.map +1 -0
  300. package/dist/slop/abi/factory.js +70 -0
  301. package/dist/slop/abi/factory.js.map +1 -0
  302. package/dist/slop/abi/feeCollector.d.ts +95 -0
  303. package/dist/slop/abi/feeCollector.d.ts.map +1 -0
  304. package/dist/slop/abi/feeCollector.js +71 -0
  305. package/dist/slop/abi/feeCollector.js.map +1 -0
  306. package/dist/slop/abi/index.d.ts +5 -0
  307. package/dist/slop/abi/index.d.ts.map +1 -0
  308. package/dist/slop/abi/index.js +5 -0
  309. package/dist/slop/abi/index.js.map +1 -0
  310. package/dist/slop/abi/registry.d.ts +135 -0
  311. package/dist/slop/abi/registry.d.ts.map +1 -0
  312. package/dist/slop/abi/registry.js +90 -0
  313. package/dist/slop/abi/registry.js.map +1 -0
  314. package/dist/slop/abi/token.d.ts +320 -0
  315. package/dist/slop/abi/token.d.ts.map +1 -0
  316. package/dist/slop/abi/token.js +251 -0
  317. package/dist/slop/abi/token.js.map +1 -0
  318. package/dist/slop/auth.d.ts +19 -0
  319. package/dist/slop/auth.d.ts.map +1 -0
  320. package/dist/slop/auth.js +92 -0
  321. package/dist/slop/auth.js.map +1 -0
  322. package/dist/slop/jwtCache.d.ts +27 -0
  323. package/dist/slop/jwtCache.d.ts.map +1 -0
  324. package/dist/slop/jwtCache.js +91 -0
  325. package/dist/slop/jwtCache.js.map +1 -0
  326. package/dist/slop/quote.d.ts +80 -0
  327. package/dist/slop/quote.d.ts.map +1 -0
  328. package/dist/slop/quote.js +174 -0
  329. package/dist/slop/quote.js.map +1 -0
  330. package/dist/utils/canonicalJson.d.ts +8 -0
  331. package/dist/utils/canonicalJson.d.ts.map +1 -0
  332. package/dist/utils/canonicalJson.js +20 -0
  333. package/dist/utils/canonicalJson.js.map +1 -0
  334. package/dist/utils/env.d.ts +11 -0
  335. package/dist/utils/env.d.ts.map +1 -0
  336. package/dist/utils/env.js +20 -0
  337. package/dist/utils/env.js.map +1 -0
  338. package/dist/utils/http.d.ts +19 -0
  339. package/dist/utils/http.d.ts.map +1 -0
  340. package/dist/utils/http.js +61 -0
  341. package/dist/utils/http.js.map +1 -0
  342. package/dist/utils/logger.d.ts +4 -0
  343. package/dist/utils/logger.d.ts.map +1 -0
  344. package/dist/utils/logger.js +21 -0
  345. package/dist/utils/logger.js.map +1 -0
  346. package/dist/utils/output.d.ts +29 -0
  347. package/dist/utils/output.d.ts.map +1 -0
  348. package/dist/utils/output.js +51 -0
  349. package/dist/utils/output.js.map +1 -0
  350. package/dist/utils/rateLimit.d.ts +22 -0
  351. package/dist/utils/rateLimit.d.ts.map +1 -0
  352. package/dist/utils/rateLimit.js +58 -0
  353. package/dist/utils/rateLimit.js.map +1 -0
  354. package/dist/utils/respond.d.ts +19 -0
  355. package/dist/utils/respond.d.ts.map +1 -0
  356. package/dist/utils/respond.js +25 -0
  357. package/dist/utils/respond.js.map +1 -0
  358. package/dist/utils/ui.d.ts +38 -0
  359. package/dist/utils/ui.d.ts.map +1 -0
  360. package/dist/utils/ui.js +126 -0
  361. package/dist/utils/ui.js.map +1 -0
  362. package/dist/wallet/client.d.ts +4 -0
  363. package/dist/wallet/client.d.ts.map +1 -0
  364. package/dist/wallet/client.js +53 -0
  365. package/dist/wallet/client.js.map +1 -0
  366. package/dist/wallet/keystore.d.ts +22 -0
  367. package/dist/wallet/keystore.d.ts.map +1 -0
  368. package/dist/wallet/keystore.js +111 -0
  369. package/dist/wallet/keystore.js.map +1 -0
  370. package/package.json +63 -0
  371. package/skills/echo/SKILL.md +1121 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Slop.money JWT authentication for CLI.
3
+ * Handles: login (nonce+sign), refresh, and cache management.
4
+ */
5
+ /**
6
+ * Ensure we have a valid slop access token.
7
+ * Flow: cache check → refresh if expired → full login if needed.
8
+ * Returns the access token string.
9
+ */
10
+ export declare function requireSlopAuth(privateKey: string, walletAddress: string, baseUrl: string): Promise<string>;
11
+ /**
12
+ * Full login: POST /auth/nonce → sign → POST /auth/verify → cache tokens.
13
+ */
14
+ export declare function slopLogin(privateKey: string, walletAddress: string, baseUrl: string): Promise<string>;
15
+ /**
16
+ * Refresh tokens: POST /auth/refresh → cache new pair.
17
+ */
18
+ export declare function slopRefresh(refreshToken: string, walletAddress: string, baseUrl: string): Promise<string>;
19
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/slop/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Slop.money JWT authentication for CLI.
3
+ * Handles: login (nonce+sign), refresh, and cache management.
4
+ */
5
+ import { privateKeyToAccount } from "viem/accounts";
6
+ import { fetchJson } from "../utils/http.js";
7
+ import { EchoError, ErrorCodes } from "../errors.js";
8
+ import { loadCachedSlopJwt, saveCachedSlopJwt, clearCachedSlopJwt, isAccessValid, } from "./jwtCache.js";
9
+ import logger from "../utils/logger.js";
10
+ /**
11
+ * Ensure we have a valid slop access token.
12
+ * Flow: cache check → refresh if expired → full login if needed.
13
+ * Returns the access token string.
14
+ */
15
+ export async function requireSlopAuth(privateKey, walletAddress, baseUrl) {
16
+ // 1. Check cache
17
+ const cached = loadCachedSlopJwt();
18
+ // Wallet mismatch → discard cache and do full login
19
+ if (cached && cached.walletAddress !== walletAddress.toLowerCase()) {
20
+ logger.debug("[Slop Auth] Cached wallet mismatch, clearing cache");
21
+ clearCachedSlopJwt();
22
+ return slopLogin(privateKey, walletAddress, baseUrl);
23
+ }
24
+ if (cached && isAccessValid(cached)) {
25
+ return cached.accessToken;
26
+ }
27
+ // 2. Try refresh if we have a refresh token
28
+ if (cached?.refreshToken) {
29
+ try {
30
+ const refreshed = await slopRefresh(cached.refreshToken, walletAddress, baseUrl);
31
+ return refreshed;
32
+ }
33
+ catch (err) {
34
+ logger.debug("[Slop Auth] Refresh failed, doing full login");
35
+ }
36
+ }
37
+ // 3. Full login
38
+ return slopLogin(privateKey, walletAddress, baseUrl);
39
+ }
40
+ /**
41
+ * Full login: POST /auth/nonce → sign → POST /auth/verify → cache tokens.
42
+ */
43
+ export async function slopLogin(privateKey, walletAddress, baseUrl) {
44
+ const wallet = walletAddress.toLowerCase();
45
+ // 1. Get nonce
46
+ const nonceRes = await fetchJson(`${baseUrl}/auth/nonce`, {
47
+ method: "POST",
48
+ headers: { "Content-Type": "application/json" },
49
+ body: JSON.stringify({ walletAddress: wallet }),
50
+ });
51
+ if (!nonceRes.success || !nonceRes.data) {
52
+ throw new EchoError(ErrorCodes.SLOP_AUTH_FAILED, nonceRes.error || "Failed to get nonce", "Check backend availability");
53
+ }
54
+ // 2. Sign message
55
+ const account = privateKeyToAccount(privateKey);
56
+ const signature = await account.signMessage({ message: nonceRes.data.message });
57
+ // 3. Verify
58
+ const verifyRes = await fetchJson(`${baseUrl}/auth/verify`, {
59
+ method: "POST",
60
+ headers: { "Content-Type": "application/json" },
61
+ body: JSON.stringify({
62
+ walletAddress: wallet,
63
+ signature,
64
+ message: nonceRes.data.message,
65
+ }),
66
+ });
67
+ if (!verifyRes.success || !verifyRes.data) {
68
+ throw new EchoError(ErrorCodes.SLOP_AUTH_FAILED, verifyRes.error || "Login verification failed", "Check wallet address and signature");
69
+ }
70
+ // 4. Cache
71
+ saveCachedSlopJwt(verifyRes.data.accessToken, verifyRes.data.refreshToken, wallet);
72
+ logger.debug("[Slop Auth] Login successful");
73
+ return verifyRes.data.accessToken;
74
+ }
75
+ /**
76
+ * Refresh tokens: POST /auth/refresh → cache new pair.
77
+ */
78
+ export async function slopRefresh(refreshToken, walletAddress, baseUrl) {
79
+ const res = await fetchJson(`${baseUrl}/auth/refresh`, {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify({ refreshToken }),
83
+ });
84
+ if (!res.success || !res.data) {
85
+ clearCachedSlopJwt();
86
+ throw new EchoError(ErrorCodes.SLOP_REFRESH_FAILED, res.error || "Token refresh failed", "Re-login required");
87
+ }
88
+ saveCachedSlopJwt(res.data.accessToken, res.data.refreshToken, walletAddress.toLowerCase());
89
+ logger.debug("[Slop Auth] Token refreshed");
90
+ return res.data.accessToken;
91
+ }
92
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/slop/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * JWT caching for slop.money auth.
3
+ * Stores access + refresh tokens in ~/.config/echo/slop-jwt.json
4
+ * Pattern: same as echobook/jwtCache.ts
5
+ */
6
+ export interface CachedSlopJwt {
7
+ accessToken: string;
8
+ refreshToken: string;
9
+ accessExpiresAt: number;
10
+ refreshExpiresAt: number;
11
+ walletAddress: string;
12
+ }
13
+ /**
14
+ * Load cached slop JWT. Returns null if expired or missing.
15
+ * Access token checked with 60s buffer.
16
+ */
17
+ export declare function loadCachedSlopJwt(): CachedSlopJwt | null;
18
+ /**
19
+ * Check if the cached access token is still valid (with 60s buffer).
20
+ */
21
+ export declare function isAccessValid(cached: CachedSlopJwt): boolean;
22
+ /**
23
+ * Save slop JWT tokens to cache.
24
+ */
25
+ export declare function saveCachedSlopJwt(accessToken: string, refreshToken: string, walletAddress: string): void;
26
+ export declare function clearCachedSlopJwt(): void;
27
+ //# sourceMappingURL=jwtCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtCache.d.ts","sourceRoot":"","sources":["../../src/slop/jwtCache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAeD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CA0BxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,IAAI,CAyBN;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAQzC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * JWT caching for slop.money auth.
3
+ * Stores access + refresh tokens in ~/.config/echo/slop-jwt.json
4
+ * Pattern: same as echobook/jwtCache.ts
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from "node:fs";
7
+ import { SLOP_JWT_FILE } from "../config/paths.js";
8
+ import { ensureConfigDir } from "../config/store.js";
9
+ import { EchoError, ErrorCodes } from "../errors.js";
10
+ import logger from "../utils/logger.js";
11
+ /**
12
+ * Decode JWT payload without verification.
13
+ */
14
+ function decodeJwtPayload(token) {
15
+ try {
16
+ const parts = token.split(".");
17
+ if (parts.length !== 3)
18
+ return null;
19
+ return JSON.parse(Buffer.from(parts[1], "base64url").toString("utf-8"));
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * Load cached slop JWT. Returns null if expired or missing.
27
+ * Access token checked with 60s buffer.
28
+ */
29
+ export function loadCachedSlopJwt() {
30
+ if (!existsSync(SLOP_JWT_FILE))
31
+ return null;
32
+ try {
33
+ const raw = readFileSync(SLOP_JWT_FILE, "utf-8");
34
+ const cached = JSON.parse(raw);
35
+ // If access is still valid, return as-is
36
+ if (cached.accessExpiresAt > Date.now() + 60_000) {
37
+ return cached;
38
+ }
39
+ // If refresh is still valid, return (caller will refresh)
40
+ if (cached.refreshExpiresAt > Date.now() + 60_000) {
41
+ return cached;
42
+ }
43
+ // Both expired
44
+ logger.debug("[Slop JWT] Both tokens expired, removing cache");
45
+ clearCachedSlopJwt();
46
+ return null;
47
+ }
48
+ catch {
49
+ logger.debug("[Slop JWT] Failed to read cache, removing");
50
+ clearCachedSlopJwt();
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * Check if the cached access token is still valid (with 60s buffer).
56
+ */
57
+ export function isAccessValid(cached) {
58
+ return cached.accessExpiresAt > Date.now() + 60_000;
59
+ }
60
+ /**
61
+ * Save slop JWT tokens to cache.
62
+ */
63
+ export function saveCachedSlopJwt(accessToken, refreshToken, walletAddress) {
64
+ ensureConfigDir();
65
+ const accessPayload = decodeJwtPayload(accessToken);
66
+ const refreshPayload = decodeJwtPayload(refreshToken);
67
+ // Validate JWT sub matches the wallet we're caching for
68
+ if (accessPayload?.sub && accessPayload.sub.toLowerCase() !== walletAddress.toLowerCase()) {
69
+ throw new EchoError(ErrorCodes.SLOP_AUTH_FAILED, "Token wallet mismatch", "Access token sub does not match wallet address");
70
+ }
71
+ const cached = {
72
+ accessToken,
73
+ refreshToken,
74
+ accessExpiresAt: accessPayload?.exp ? accessPayload.exp * 1000 : Date.now() + 3_600_000,
75
+ refreshExpiresAt: refreshPayload?.exp ? refreshPayload.exp * 1000 : Date.now() + 604800_000,
76
+ walletAddress: walletAddress.toLowerCase(),
77
+ };
78
+ writeFileSync(SLOP_JWT_FILE, JSON.stringify(cached, null, 2), "utf-8");
79
+ logger.debug(`[Slop JWT] Cached, access expires ${new Date(cached.accessExpiresAt).toISOString()}`);
80
+ }
81
+ export function clearCachedSlopJwt() {
82
+ try {
83
+ if (existsSync(SLOP_JWT_FILE)) {
84
+ unlinkSync(SLOP_JWT_FILE);
85
+ }
86
+ }
87
+ catch {
88
+ // Ignore
89
+ }
90
+ }
91
+ //# sourceMappingURL=jwtCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtCache.js","sourceRoot":"","sources":["../../src/slop/jwtCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Slop.money bonding curve quote math.
3
+ * Pure bigint functions matching BondingCurveLib.sol 1:1.
4
+ */
5
+ /** Precision constant (1e18) for price calculations */
6
+ export declare const PRECISION: bigint;
7
+ /** Graduation threshold: 80% of CURVE_SUPPLY sold triggers graduation */
8
+ export declare const GRADUATION_THRESHOLD_BPS = 8000n;
9
+ /**
10
+ * Ceiling division - rounds up instead of down (protocol-favoring).
11
+ * Formula: a == 0 ? 0 : (a - 1) / b + 1
12
+ */
13
+ export declare function ceilDiv(a: bigint, b: bigint): bigint;
14
+ /**
15
+ * Calculate tokens received for a given 0G input.
16
+ * Mirrors BondingCurveLib.calculateTokensOut()
17
+ *
18
+ * Formula: tokensOut = tokenReserves - ceil(k / (ogReserves + ogIn))
19
+ *
20
+ * @param k Constant product invariant
21
+ * @param ogReserves Current 0G reserves
22
+ * @param tokenReserves Current token reserves
23
+ * @param ogIn Amount of 0G to swap (AFTER fee deduction)
24
+ * @returns tokensOut Amount of tokens to receive
25
+ */
26
+ export declare function calculateTokensOut(k: bigint, ogReserves: bigint, tokenReserves: bigint, ogIn: bigint): bigint;
27
+ /**
28
+ * Calculate 0G received for a given token input.
29
+ * Mirrors BondingCurveLib.calculateOgOut()
30
+ *
31
+ * Formula: ogOut = ogReserves - ceil(k / (tokenReserves + tokensIn))
32
+ *
33
+ * @param k Constant product invariant
34
+ * @param ogReserves Current 0G reserves
35
+ * @param tokenReserves Current token reserves
36
+ * @param tokensIn Amount of tokens to swap
37
+ * @returns ogOut Amount of 0G to receive (BEFORE fee deduction)
38
+ */
39
+ export declare function calculateOgOut(k: bigint, ogReserves: bigint, tokenReserves: bigint, tokensIn: bigint): bigint;
40
+ /**
41
+ * Calculate spot price (price per token in 0G with 18 decimals).
42
+ * Mirrors BondingCurveLib.calculateSpotPrice()
43
+ */
44
+ export declare function calculateSpotPrice(ogReserves: bigint, tokenReserves: bigint): bigint;
45
+ /**
46
+ * Calculate partial fill for buy orders hitting the 80% graduation cap.
47
+ *
48
+ * @param ogReserves Current 0G reserves
49
+ * @param tokenReserves Current token reserves
50
+ * @param virtualTokenReserves Virtual token reserves (from token contract)
51
+ * @param curveSupply CURVE_SUPPLY (from token contract)
52
+ * @param ogAmountGross Gross 0G amount (BEFORE fee)
53
+ * @param buyFeeBps Buy fee in basis points
54
+ * @returns Object with tokensOut, ogUsed, feeUsed, refund
55
+ */
56
+ export declare function calculatePartialFill(ogReserves: bigint, tokenReserves: bigint, virtualTokenReserves: bigint, curveSupply: bigint, ogAmountGross: bigint, buyFeeBps: bigint): {
57
+ tokensOut: bigint;
58
+ ogUsed: bigint;
59
+ feeUsed: bigint;
60
+ refund: bigint;
61
+ hitCap: boolean;
62
+ };
63
+ /**
64
+ * Apply slippage tolerance to calculate minimum output.
65
+ *
66
+ * @param amount Expected output amount
67
+ * @param slippageBps Slippage tolerance in basis points (e.g., 50 = 0.5%)
68
+ * @returns Minimum acceptable output
69
+ */
70
+ export declare function applySlippage(amount: bigint, slippageBps: bigint): bigint;
71
+ /**
72
+ * Calculate graduation progress (percentage of CURVE_SUPPLY sold).
73
+ *
74
+ * @param tokenReserves Current token reserves
75
+ * @param virtualTokenReserves Virtual token reserves
76
+ * @param curveSupply CURVE_SUPPLY
77
+ * @returns Progress in basis points (0-10000, where 8000 = graduation), clamped for safety
78
+ */
79
+ export declare function calculateGraduationProgress(tokenReserves: bigint, virtualTokenReserves: bigint, curveSupply: bigint): bigint;
80
+ //# sourceMappingURL=quote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../src/slop/quote.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uDAAuD;AACvD,eAAO,MAAM,SAAS,QAAa,CAAC;AAEpC,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,MAAM,EACT,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,MAAM,CAcR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,EACT,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,oBAAoB,EAAE,MAAM,EAC5B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAwDA;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,MAAM,EACrB,oBAAoB,EAAE,MAAM,EAC5B,WAAW,EAAE,MAAM,GAClB,MAAM,CAcR"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Slop.money bonding curve quote math.
3
+ * Pure bigint functions matching BondingCurveLib.sol 1:1.
4
+ */
5
+ /** Precision constant (1e18) for price calculations */
6
+ export const PRECISION = 10n ** 18n;
7
+ /** Graduation threshold: 80% of CURVE_SUPPLY sold triggers graduation */
8
+ export const GRADUATION_THRESHOLD_BPS = 8000n;
9
+ /**
10
+ * Ceiling division - rounds up instead of down (protocol-favoring).
11
+ * Formula: a == 0 ? 0 : (a - 1) / b + 1
12
+ */
13
+ export function ceilDiv(a, b) {
14
+ if (b === 0n)
15
+ throw new Error("Division by zero");
16
+ return a === 0n ? 0n : (a - 1n) / b + 1n;
17
+ }
18
+ /**
19
+ * Calculate tokens received for a given 0G input.
20
+ * Mirrors BondingCurveLib.calculateTokensOut()
21
+ *
22
+ * Formula: tokensOut = tokenReserves - ceil(k / (ogReserves + ogIn))
23
+ *
24
+ * @param k Constant product invariant
25
+ * @param ogReserves Current 0G reserves
26
+ * @param tokenReserves Current token reserves
27
+ * @param ogIn Amount of 0G to swap (AFTER fee deduction)
28
+ * @returns tokensOut Amount of tokens to receive
29
+ */
30
+ export function calculateTokensOut(k, ogReserves, tokenReserves, ogIn) {
31
+ if (ogIn <= 0n)
32
+ throw new Error("0G amount must be > 0");
33
+ if (k <= 0n)
34
+ throw new Error("K must be > 0");
35
+ if (ogReserves <= 0n || tokenReserves <= 0n)
36
+ throw new Error("Reserves must be > 0");
37
+ const newOgReserves = ogReserves + ogIn;
38
+ // SLO-12: ceilDiv rounds UP newTokenReserves, which rounds DOWN tokensOut
39
+ const newTokenReserves = ceilDiv(k, newOgReserves);
40
+ if (tokenReserves <= newTokenReserves) {
41
+ throw new Error("Insufficient liquidity");
42
+ }
43
+ return tokenReserves - newTokenReserves;
44
+ }
45
+ /**
46
+ * Calculate 0G received for a given token input.
47
+ * Mirrors BondingCurveLib.calculateOgOut()
48
+ *
49
+ * Formula: ogOut = ogReserves - ceil(k / (tokenReserves + tokensIn))
50
+ *
51
+ * @param k Constant product invariant
52
+ * @param ogReserves Current 0G reserves
53
+ * @param tokenReserves Current token reserves
54
+ * @param tokensIn Amount of tokens to swap
55
+ * @returns ogOut Amount of 0G to receive (BEFORE fee deduction)
56
+ */
57
+ export function calculateOgOut(k, ogReserves, tokenReserves, tokensIn) {
58
+ if (tokensIn <= 0n)
59
+ throw new Error("Token amount must be > 0");
60
+ if (k <= 0n)
61
+ throw new Error("K must be > 0");
62
+ if (ogReserves <= 0n || tokenReserves <= 0n)
63
+ throw new Error("Reserves must be > 0");
64
+ const newTokenReserves = tokenReserves + tokensIn;
65
+ // SLO-12: ceilDiv rounds UP newOgReserves, which rounds DOWN ogOut
66
+ const newOgReserves = ceilDiv(k, newTokenReserves);
67
+ if (ogReserves <= newOgReserves) {
68
+ throw new Error("Insufficient liquidity");
69
+ }
70
+ return ogReserves - newOgReserves;
71
+ }
72
+ /**
73
+ * Calculate spot price (price per token in 0G with 18 decimals).
74
+ * Mirrors BondingCurveLib.calculateSpotPrice()
75
+ */
76
+ export function calculateSpotPrice(ogReserves, tokenReserves) {
77
+ if (tokenReserves <= 0n)
78
+ throw new Error("Token reserves must be > 0");
79
+ return (ogReserves * PRECISION) / tokenReserves;
80
+ }
81
+ /**
82
+ * Calculate partial fill for buy orders hitting the 80% graduation cap.
83
+ *
84
+ * @param ogReserves Current 0G reserves
85
+ * @param tokenReserves Current token reserves
86
+ * @param virtualTokenReserves Virtual token reserves (from token contract)
87
+ * @param curveSupply CURVE_SUPPLY (from token contract)
88
+ * @param ogAmountGross Gross 0G amount (BEFORE fee)
89
+ * @param buyFeeBps Buy fee in basis points
90
+ * @returns Object with tokensOut, ogUsed, feeUsed, refund
91
+ */
92
+ export function calculatePartialFill(ogReserves, tokenReserves, virtualTokenReserves, curveSupply, ogAmountGross, buyFeeBps) {
93
+ const k = ogReserves * tokenReserves;
94
+ // Calculate fee and amount after fee
95
+ const fee = (ogAmountGross * buyFeeBps) / 10000n;
96
+ const amountAfterFee = ogAmountGross - fee;
97
+ // Calculate tokens out
98
+ let tokensOut = calculateTokensOut(k, ogReserves, tokenReserves, amountAfterFee);
99
+ // Check graduation threshold
100
+ const tokensSoldBefore = virtualTokenReserves - tokenReserves;
101
+ const graduationThreshold = (curveSupply * GRADUATION_THRESHOLD_BPS) / 10000n;
102
+ const remainingTo80 = tokensSoldBefore >= graduationThreshold ? 0n : graduationThreshold - tokensSoldBefore;
103
+ if (remainingTo80 === 0n) {
104
+ throw new Error("Graduation threshold reached - bonding curve trading disabled");
105
+ }
106
+ // Check if partial fill needed
107
+ if (tokensOut > remainingTo80) {
108
+ // Cap at remaining tokens
109
+ tokensOut = remainingTo80;
110
+ // Exact-out math: ogInUsed = ogReserves * tokensOut / (tokenReserves - tokensOut)
111
+ const newTokenReserves = tokenReserves - tokensOut;
112
+ if (newTokenReserves <= 0n)
113
+ throw new Error("Would drain pool");
114
+ // SLO-21: Use ceiling division (protocol-favoring rounding)
115
+ const ogInUsed = ceilDiv(ogReserves * tokensOut, newTokenReserves);
116
+ // Recalculate fee proportionally
117
+ // ogAmountUsed = ogInUsed * 10000 / (10000 - buyFeeBps)
118
+ const ogAmountUsed = ceilDiv(ogInUsed * 10000n, 10000n - buyFeeBps);
119
+ const feeUsed = ogAmountUsed - ogInUsed;
120
+ const refund = ogAmountGross - ogAmountUsed;
121
+ return {
122
+ tokensOut,
123
+ ogUsed: ogInUsed,
124
+ feeUsed,
125
+ refund,
126
+ hitCap: true,
127
+ };
128
+ }
129
+ // No cap hit - full fill
130
+ return {
131
+ tokensOut,
132
+ ogUsed: amountAfterFee,
133
+ feeUsed: fee,
134
+ refund: 0n,
135
+ hitCap: false,
136
+ };
137
+ }
138
+ /**
139
+ * Apply slippage tolerance to calculate minimum output.
140
+ *
141
+ * @param amount Expected output amount
142
+ * @param slippageBps Slippage tolerance in basis points (e.g., 50 = 0.5%)
143
+ * @returns Minimum acceptable output
144
+ */
145
+ export function applySlippage(amount, slippageBps) {
146
+ if (slippageBps < 0n || slippageBps > 10000n) {
147
+ throw new Error("Invalid slippage (0-10000 bps)");
148
+ }
149
+ return (amount * (10000n - slippageBps)) / 10000n;
150
+ }
151
+ /**
152
+ * Calculate graduation progress (percentage of CURVE_SUPPLY sold).
153
+ *
154
+ * @param tokenReserves Current token reserves
155
+ * @param virtualTokenReserves Virtual token reserves
156
+ * @param curveSupply CURVE_SUPPLY
157
+ * @returns Progress in basis points (0-10000, where 8000 = graduation), clamped for safety
158
+ */
159
+ export function calculateGraduationProgress(tokenReserves, virtualTokenReserves, curveSupply) {
160
+ if (curveSupply === 0n)
161
+ return 0n;
162
+ // Clamp tokensSold to >= 0 for defensive safety
163
+ const tokensSold = virtualTokenReserves > tokenReserves
164
+ ? virtualTokenReserves - tokenReserves
165
+ : 0n;
166
+ const progress = (tokensSold * 10000n) / curveSupply;
167
+ // Clamp to 0..10000 range
168
+ if (progress < 0n)
169
+ return 0n;
170
+ if (progress > 10000n)
171
+ return 10000n;
172
+ return progress;
173
+ }
174
+ //# sourceMappingURL=quote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../src/slop/quote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Canonical JSON: recursive sorting of object keys.
3
+ * MUST be identical in slop-backend and echo-0g!
4
+ *
5
+ * This ensures consistent hash computation for query signing.
6
+ */
7
+ export declare function canonicalJson(obj: unknown): string;
8
+ //# sourceMappingURL=canonicalJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalJson.d.ts","sourceRoot":"","sources":["../../src/utils/canonicalJson.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAelD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Canonical JSON: recursive sorting of object keys.
3
+ * MUST be identical in slop-backend and echo-0g!
4
+ *
5
+ * This ensures consistent hash computation for query signing.
6
+ */
7
+ export function canonicalJson(obj) {
8
+ return JSON.stringify(obj, (_key, value) => {
9
+ if (value && typeof value === "object" && !Array.isArray(value)) {
10
+ return Object.keys(value)
11
+ .sort()
12
+ .reduce((sorted, k) => {
13
+ sorted[k] = value[k];
14
+ return sorted;
15
+ }, {});
16
+ }
17
+ return value;
18
+ });
19
+ }
20
+ //# sourceMappingURL=canonicalJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalJson.js","sourceRoot":"","sources":["../../src/utils/canonicalJson.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACzC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;iBACtB,IAAI,EAAE;iBACN,MAAM,CACL,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACZ,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAC,EACD,EAA6B,CAC9B,CAAC;QACN,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Get keystore password from environment variable.
3
+ * Returns null if not set.
4
+ */
5
+ export declare function getKeystorePassword(): string | null;
6
+ /**
7
+ * Get keystore password from environment, throw if not set.
8
+ * Used in automation flows where password is required.
9
+ */
10
+ export declare function requireKeystorePassword(): string;
11
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAUhD"}
@@ -0,0 +1,20 @@
1
+ import { EchoError, ErrorCodes } from "../errors.js";
2
+ /**
3
+ * Get keystore password from environment variable.
4
+ * Returns null if not set.
5
+ */
6
+ export function getKeystorePassword() {
7
+ return process.env.ECHO_KEYSTORE_PASSWORD ?? null;
8
+ }
9
+ /**
10
+ * Get keystore password from environment, throw if not set.
11
+ * Used in automation flows where password is required.
12
+ */
13
+ export function requireKeystorePassword() {
14
+ const pw = getKeystorePassword();
15
+ if (!pw) {
16
+ throw new EchoError(ErrorCodes.KEYSTORE_PASSWORD_NOT_SET, "ECHO_KEYSTORE_PASSWORD environment variable is required.", "Run: echo setup password --from-env (then restart OpenClaw sessions)");
17
+ }
18
+ return pw;
19
+ }
20
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,SAAS,CACjB,UAAU,CAAC,yBAAyB,EACpC,0DAA0D,EAC1D,uEAAuE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * HTTP utilities with timeout and error handling.
3
+ */
4
+ export interface FetchOptions extends RequestInit {
5
+ timeoutMs?: number;
6
+ }
7
+ /**
8
+ * Fetch with timeout and standardized error handling.
9
+ */
10
+ export declare function fetchWithTimeout(url: string, options?: FetchOptions): Promise<Response>;
11
+ /**
12
+ * Parse JSON response with error handling.
13
+ */
14
+ export declare function parseJsonResponse<T>(response: Response): Promise<T>;
15
+ /**
16
+ * Combined fetch + JSON parse with error handling.
17
+ */
18
+ export declare function fetchJson<T>(url: string, options?: FetchOptions): Promise<T>;
19
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,QAAQ,CAAC,CA4BnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBzE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAGZ"}