@raintree-technology/perps 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +175 -0
  4. package/dist/adapters/aevo.d.ts +64 -0
  5. package/dist/adapters/aevo.js +899 -0
  6. package/dist/adapters/certification.d.ts +33 -0
  7. package/dist/adapters/certification.js +99 -0
  8. package/dist/adapters/decibel/order-manager.d.ts +45 -0
  9. package/dist/adapters/decibel/order-manager.js +140 -0
  10. package/dist/adapters/decibel/rest-client.d.ts +176 -0
  11. package/dist/adapters/decibel/rest-client.js +155 -0
  12. package/dist/adapters/decibel/ws-feed.d.ts +28 -0
  13. package/dist/adapters/decibel/ws-feed.js +166 -0
  14. package/dist/adapters/decibel.d.ts +108 -0
  15. package/dist/adapters/decibel.js +1377 -0
  16. package/dist/adapters/hyperliquid.d.ts +63 -0
  17. package/dist/adapters/hyperliquid.js +797 -0
  18. package/dist/adapters/index.d.ts +11 -0
  19. package/dist/adapters/index.js +12 -0
  20. package/dist/adapters/interface.d.ts +310 -0
  21. package/dist/adapters/interface.js +15 -0
  22. package/dist/adapters/orderly.d.ts +70 -0
  23. package/dist/adapters/orderly.js +936 -0
  24. package/dist/adapters/paradex.d.ts +69 -0
  25. package/dist/adapters/paradex.js +862 -0
  26. package/dist/adapters/utils.d.ts +17 -0
  27. package/dist/adapters/utils.js +122 -0
  28. package/dist/cli/command-metadata.d.ts +2 -0
  29. package/dist/cli/command-metadata.js +44 -0
  30. package/dist/cli/context.d.ts +14 -0
  31. package/dist/cli/context.js +59 -0
  32. package/dist/cli/experience.d.ts +48 -0
  33. package/dist/cli/experience.js +243 -0
  34. package/dist/cli/ink/app/AppShell.d.ts +12 -0
  35. package/dist/cli/ink/app/AppShell.js +32 -0
  36. package/dist/cli/ink/app/MetricStrip.d.ts +6 -0
  37. package/dist/cli/ink/app/MetricStrip.js +14 -0
  38. package/dist/cli/ink/app/Panel.d.ts +9 -0
  39. package/dist/cli/ink/app/Panel.js +7 -0
  40. package/dist/cli/ink/app/ascii.d.ts +2 -0
  41. package/dist/cli/ink/app/ascii.js +46 -0
  42. package/dist/cli/ink/app/index.d.ts +5 -0
  43. package/dist/cli/ink/app/index.js +4 -0
  44. package/dist/cli/ink/app/types.d.ts +15 -0
  45. package/dist/cli/ink/app/types.js +1 -0
  46. package/dist/cli/ink/components/PnL.d.ts +12 -0
  47. package/dist/cli/ink/components/PnL.js +23 -0
  48. package/dist/cli/ink/components/Spinner.d.ts +13 -0
  49. package/dist/cli/ink/components/Spinner.js +13 -0
  50. package/dist/cli/ink/components/Table.d.ts +14 -0
  51. package/dist/cli/ink/components/Table.js +42 -0
  52. package/dist/cli/ink/components/WatchHeader.d.ts +10 -0
  53. package/dist/cli/ink/components/WatchHeader.js +18 -0
  54. package/dist/cli/ink/components/index.d.ts +4 -0
  55. package/dist/cli/ink/components/index.js +4 -0
  56. package/dist/cli/ink/index.d.ts +4 -0
  57. package/dist/cli/ink/index.js +4 -0
  58. package/dist/cli/ink/render.d.ts +12 -0
  59. package/dist/cli/ink/render.js +21 -0
  60. package/dist/cli/ink/theme.d.ts +29 -0
  61. package/dist/cli/ink/theme.js +40 -0
  62. package/dist/cli/network-defaults.d.ts +10 -0
  63. package/dist/cli/network-defaults.js +35 -0
  64. package/dist/cli/output.d.ts +11 -0
  65. package/dist/cli/output.js +115 -0
  66. package/dist/cli/program.d.ts +18 -0
  67. package/dist/cli/program.js +164 -0
  68. package/dist/cli/watch.d.ts +19 -0
  69. package/dist/cli/watch.js +35 -0
  70. package/dist/client/index.d.ts +55 -0
  71. package/dist/client/index.js +157 -0
  72. package/dist/commands/account/add.d.ts +2 -0
  73. package/dist/commands/account/add.js +510 -0
  74. package/dist/commands/account/balances-simple.d.ts +5 -0
  75. package/dist/commands/account/balances-simple.js +63 -0
  76. package/dist/commands/account/index.d.ts +2 -0
  77. package/dist/commands/account/index.js +17 -0
  78. package/dist/commands/account/ls.d.ts +2 -0
  79. package/dist/commands/account/ls.js +95 -0
  80. package/dist/commands/account/positions-simple.d.ts +5 -0
  81. package/dist/commands/account/positions-simple.js +77 -0
  82. package/dist/commands/account/remove.d.ts +2 -0
  83. package/dist/commands/account/remove.js +47 -0
  84. package/dist/commands/account/set-default.d.ts +2 -0
  85. package/dist/commands/account/set-default.js +47 -0
  86. package/dist/commands/agent/index.d.ts +2 -0
  87. package/dist/commands/agent/index.js +126 -0
  88. package/dist/commands/arb/alert.d.ts +6 -0
  89. package/dist/commands/arb/alert.js +88 -0
  90. package/dist/commands/arb/basis-execute.d.ts +6 -0
  91. package/dist/commands/arb/basis-execute.js +332 -0
  92. package/dist/commands/arb/basis.d.ts +6 -0
  93. package/dist/commands/arb/basis.js +181 -0
  94. package/dist/commands/arb/compare.d.ts +6 -0
  95. package/dist/commands/arb/compare.js +216 -0
  96. package/dist/commands/arb/execute.d.ts +6 -0
  97. package/dist/commands/arb/execute.js +467 -0
  98. package/dist/commands/arb/funding.d.ts +6 -0
  99. package/dist/commands/arb/funding.js +201 -0
  100. package/dist/commands/arb/history.d.ts +6 -0
  101. package/dist/commands/arb/history.js +153 -0
  102. package/dist/commands/arb/index.d.ts +6 -0
  103. package/dist/commands/arb/index.js +29 -0
  104. package/dist/commands/arb/positions.d.ts +6 -0
  105. package/dist/commands/arb/positions.js +158 -0
  106. package/dist/commands/arb/spread.d.ts +6 -0
  107. package/dist/commands/arb/spread.js +253 -0
  108. package/dist/commands/arb/track.d.ts +6 -0
  109. package/dist/commands/arb/track.js +259 -0
  110. package/dist/commands/asset/book-simple.d.ts +5 -0
  111. package/dist/commands/asset/book-simple.js +77 -0
  112. package/dist/commands/asset/index.d.ts +2 -0
  113. package/dist/commands/asset/index.js +5 -0
  114. package/dist/commands/completion.d.ts +2 -0
  115. package/dist/commands/completion.js +161 -0
  116. package/dist/commands/config/index.d.ts +5 -0
  117. package/dist/commands/config/index.js +109 -0
  118. package/dist/commands/data/index.d.ts +31 -0
  119. package/dist/commands/data/index.js +1466 -0
  120. package/dist/commands/doctor.d.ts +2 -0
  121. package/dist/commands/doctor.js +201 -0
  122. package/dist/commands/exchange/index.d.ts +2 -0
  123. package/dist/commands/exchange/index.js +107 -0
  124. package/dist/commands/index.d.ts +2 -0
  125. package/dist/commands/index.js +48 -0
  126. package/dist/commands/markets/index.d.ts +2 -0
  127. package/dist/commands/markets/index.js +5 -0
  128. package/dist/commands/markets/ls-simple.d.ts +7 -0
  129. package/dist/commands/markets/ls-simple.js +277 -0
  130. package/dist/commands/operator/index.d.ts +2 -0
  131. package/dist/commands/operator/index.js +146 -0
  132. package/dist/commands/order/cancel-simple.d.ts +5 -0
  133. package/dist/commands/order/cancel-simple.js +104 -0
  134. package/dist/commands/order/index.d.ts +2 -0
  135. package/dist/commands/order/index.js +13 -0
  136. package/dist/commands/order/limit-simple.d.ts +5 -0
  137. package/dist/commands/order/limit-simple.js +195 -0
  138. package/dist/commands/order/market-simple.d.ts +5 -0
  139. package/dist/commands/order/market-simple.js +190 -0
  140. package/dist/commands/order/shared.d.ts +17 -0
  141. package/dist/commands/order/shared.js +51 -0
  142. package/dist/commands/order/trigger-simple.d.ts +5 -0
  143. package/dist/commands/order/trigger-simple.js +246 -0
  144. package/dist/commands/referral/index.d.ts +2 -0
  145. package/dist/commands/referral/index.js +7 -0
  146. package/dist/commands/referral/set.d.ts +2 -0
  147. package/dist/commands/referral/set.js +26 -0
  148. package/dist/commands/referral/status.d.ts +2 -0
  149. package/dist/commands/referral/status.js +31 -0
  150. package/dist/commands/replay/index.d.ts +2 -0
  151. package/dist/commands/replay/index.js +152 -0
  152. package/dist/commands/risk/analytics.d.ts +2 -0
  153. package/dist/commands/risk/analytics.js +64 -0
  154. package/dist/commands/risk/audit.d.ts +2 -0
  155. package/dist/commands/risk/audit.js +52 -0
  156. package/dist/commands/risk/index.d.ts +2 -0
  157. package/dist/commands/risk/index.js +9 -0
  158. package/dist/commands/risk/rules.d.ts +2 -0
  159. package/dist/commands/risk/rules.js +102 -0
  160. package/dist/commands/server.d.ts +2 -0
  161. package/dist/commands/server.js +208 -0
  162. package/dist/commands/setup/index.d.ts +2 -0
  163. package/dist/commands/setup/index.js +478 -0
  164. package/dist/commands/signal/index.d.ts +2 -0
  165. package/dist/commands/signal/index.js +129 -0
  166. package/dist/commands/state/index.d.ts +2 -0
  167. package/dist/commands/state/index.js +5 -0
  168. package/dist/commands/state/show.d.ts +2 -0
  169. package/dist/commands/state/show.js +105 -0
  170. package/dist/commands/strategy/index.d.ts +4 -0
  171. package/dist/commands/strategy/index.js +73 -0
  172. package/dist/commands/traces/index.d.ts +2 -0
  173. package/dist/commands/traces/index.js +76 -0
  174. package/dist/commands/ui/demo.d.ts +9 -0
  175. package/dist/commands/ui/demo.js +195 -0
  176. package/dist/commands/ui/index.d.ts +2 -0
  177. package/dist/commands/ui/index.js +7 -0
  178. package/dist/commands/ui/terminal.d.ts +2 -0
  179. package/dist/commands/ui/terminal.js +255 -0
  180. package/dist/commands/upgrade.d.ts +2 -0
  181. package/dist/commands/upgrade.js +98 -0
  182. package/dist/index.d.ts +2 -0
  183. package/dist/index.js +4 -0
  184. package/dist/lib/agent/audit.d.ts +12 -0
  185. package/dist/lib/agent/audit.js +13 -0
  186. package/dist/lib/agent/gateway.d.ts +13 -0
  187. package/dist/lib/agent/gateway.js +598 -0
  188. package/dist/lib/agent/metrics.d.ts +33 -0
  189. package/dist/lib/agent/metrics.js +175 -0
  190. package/dist/lib/agent/signature.d.ts +8 -0
  191. package/dist/lib/agent/signature.js +28 -0
  192. package/dist/lib/agent/tools.d.ts +28 -0
  193. package/dist/lib/agent/tools.js +453 -0
  194. package/dist/lib/agent/x402.d.ts +23 -0
  195. package/dist/lib/agent/x402.js +62 -0
  196. package/dist/lib/api-wallet.d.ts +69 -0
  197. package/dist/lib/api-wallet.js +101 -0
  198. package/dist/lib/balance-watcher.d.ts +25 -0
  199. package/dist/lib/balance-watcher.js +83 -0
  200. package/dist/lib/book-watcher.d.ts +25 -0
  201. package/dist/lib/book-watcher.js +48 -0
  202. package/dist/lib/config.d.ts +88 -0
  203. package/dist/lib/config.js +427 -0
  204. package/dist/lib/constants.d.ts +50 -0
  205. package/dist/lib/constants.js +84 -0
  206. package/dist/lib/contracts.d.ts +7 -0
  207. package/dist/lib/contracts.js +8 -0
  208. package/dist/lib/credential-vault.d.ts +22 -0
  209. package/dist/lib/credential-vault.js +109 -0
  210. package/dist/lib/db/accounts.d.ts +83 -0
  211. package/dist/lib/db/accounts.js +203 -0
  212. package/dist/lib/db/funding-history.d.ts +69 -0
  213. package/dist/lib/db/funding-history.js +183 -0
  214. package/dist/lib/db/index.d.ts +11 -0
  215. package/dist/lib/db/index.js +272 -0
  216. package/dist/lib/events/bus.d.ts +10 -0
  217. package/dist/lib/events/bus.js +17 -0
  218. package/dist/lib/events/types.d.ts +51 -0
  219. package/dist/lib/events/types.js +1 -0
  220. package/dist/lib/exchange.d.ts +30 -0
  221. package/dist/lib/exchange.js +84 -0
  222. package/dist/lib/execution/journal.d.ts +25 -0
  223. package/dist/lib/execution/journal.js +158 -0
  224. package/dist/lib/execution/safety.d.ts +34 -0
  225. package/dist/lib/execution/safety.js +197 -0
  226. package/dist/lib/exit-codes.d.ts +18 -0
  227. package/dist/lib/exit-codes.js +60 -0
  228. package/dist/lib/fetch.d.ts +18 -0
  229. package/dist/lib/fetch.js +66 -0
  230. package/dist/lib/fs-security.d.ts +10 -0
  231. package/dist/lib/fs-security.js +26 -0
  232. package/dist/lib/funding-tracker.d.ts +40 -0
  233. package/dist/lib/funding-tracker.js +118 -0
  234. package/dist/lib/logger.d.ts +27 -0
  235. package/dist/lib/logger.js +82 -0
  236. package/dist/lib/network-model.d.ts +13 -0
  237. package/dist/lib/network-model.js +30 -0
  238. package/dist/lib/onboarding.d.ts +133 -0
  239. package/dist/lib/onboarding.js +1459 -0
  240. package/dist/lib/operator-state.d.ts +25 -0
  241. package/dist/lib/operator-state.js +82 -0
  242. package/dist/lib/orders-watcher.d.ts +24 -0
  243. package/dist/lib/orders-watcher.js +74 -0
  244. package/dist/lib/paths.d.ts +20 -0
  245. package/dist/lib/paths.js +23 -0
  246. package/dist/lib/portfolio-watcher.d.ts +33 -0
  247. package/dist/lib/portfolio-watcher.js +95 -0
  248. package/dist/lib/position-watcher.d.ts +16 -0
  249. package/dist/lib/position-watcher.js +44 -0
  250. package/dist/lib/price-watcher.d.ts +15 -0
  251. package/dist/lib/price-watcher.js +84 -0
  252. package/dist/lib/prompts.d.ts +32 -0
  253. package/dist/lib/prompts.js +105 -0
  254. package/dist/lib/rate-limit.d.ts +32 -0
  255. package/dist/lib/rate-limit.js +88 -0
  256. package/dist/lib/risk/analytics.d.ts +39 -0
  257. package/dist/lib/risk/analytics.js +98 -0
  258. package/dist/lib/risk/drawdown.d.ts +18 -0
  259. package/dist/lib/risk/drawdown.js +49 -0
  260. package/dist/lib/risk/evaluation-log.d.ts +29 -0
  261. package/dist/lib/risk/evaluation-log.js +61 -0
  262. package/dist/lib/risk/index.d.ts +4 -0
  263. package/dist/lib/risk/index.js +4 -0
  264. package/dist/lib/risk/limits.d.ts +23 -0
  265. package/dist/lib/risk/limits.js +27 -0
  266. package/dist/lib/risk/manager.d.ts +32 -0
  267. package/dist/lib/risk/manager.js +85 -0
  268. package/dist/lib/risk/policy-middleware.d.ts +33 -0
  269. package/dist/lib/risk/policy-middleware.js +267 -0
  270. package/dist/lib/risk/position-sizer.d.ts +9 -0
  271. package/dist/lib/risk/position-sizer.js +14 -0
  272. package/dist/lib/risk/rules-store.d.ts +16 -0
  273. package/dist/lib/risk/rules-store.js +47 -0
  274. package/dist/lib/schema.d.ts +254 -0
  275. package/dist/lib/schema.js +199 -0
  276. package/dist/lib/secrets.d.ts +3 -0
  277. package/dist/lib/secrets.js +62 -0
  278. package/dist/lib/settings.d.ts +24 -0
  279. package/dist/lib/settings.js +86 -0
  280. package/dist/lib/signals.d.ts +73 -0
  281. package/dist/lib/signals.js +136 -0
  282. package/dist/lib/stable-stringify.d.ts +6 -0
  283. package/dist/lib/stable-stringify.js +17 -0
  284. package/dist/lib/state-context.d.ts +44 -0
  285. package/dist/lib/state-context.js +133 -0
  286. package/dist/lib/strategy/basis-trade.d.ts +2 -0
  287. package/dist/lib/strategy/basis-trade.js +24 -0
  288. package/dist/lib/strategy/funding-arb.d.ts +2 -0
  289. package/dist/lib/strategy/funding-arb.js +23 -0
  290. package/dist/lib/strategy/interface.d.ts +23 -0
  291. package/dist/lib/strategy/interface.js +1 -0
  292. package/dist/lib/strategy/registry.d.ts +4 -0
  293. package/dist/lib/strategy/registry.js +10 -0
  294. package/dist/lib/telemetry.d.ts +25 -0
  295. package/dist/lib/telemetry.js +101 -0
  296. package/dist/lib/trace-queries.d.ts +20 -0
  297. package/dist/lib/trace-queries.js +133 -0
  298. package/dist/lib/trace.d.ts +1 -0
  299. package/dist/lib/trace.js +4 -0
  300. package/dist/lib/trade-reputation.d.ts +6 -0
  301. package/dist/lib/trade-reputation.js +99 -0
  302. package/dist/lib/ui-tokens.d.ts +21 -0
  303. package/dist/lib/ui-tokens.js +26 -0
  304. package/dist/lib/validate.d.ts +39 -0
  305. package/dist/lib/validate.js +108 -0
  306. package/dist/lib/validation.d.ts +9 -0
  307. package/dist/lib/validation.js +64 -0
  308. package/dist/server/cache.d.ts +38 -0
  309. package/dist/server/cache.js +56 -0
  310. package/dist/server/index.d.ts +2 -0
  311. package/dist/server/index.js +89 -0
  312. package/dist/server/ipc.d.ts +18 -0
  313. package/dist/server/ipc.js +159 -0
  314. package/dist/server/subscriptions.d.ts +18 -0
  315. package/dist/server/subscriptions.js +114 -0
  316. package/package.json +124 -0
@@ -0,0 +1,33 @@
1
+ import { type CapabilityLevel, type PerpDEXAdapter } from "./index.js";
2
+ export declare const ADAPTER_CAPABILITIES_SCHEMA_VERSION = 1;
3
+ type CapabilityCategory = "marketData" | "authenticatedReads" | "orderLifecycle" | "orderCancellation" | "subscriptions" | "advancedTrading";
4
+ interface CapabilityMethodProbe {
5
+ method: string;
6
+ implemented: boolean;
7
+ reason?: string;
8
+ }
9
+ interface CapabilityProbeResult {
10
+ category: CapabilityCategory;
11
+ level: CapabilityLevel;
12
+ implemented: number;
13
+ total: number;
14
+ methods: CapabilityMethodProbe[];
15
+ }
16
+ interface ErrorSemanticsResult {
17
+ ok: boolean;
18
+ issues: string[];
19
+ }
20
+ export interface AdapterCertificationResult {
21
+ id: string;
22
+ name: string;
23
+ capabilities: Record<CapabilityCategory, CapabilityProbeResult>;
24
+ errorSemantics: ErrorSemanticsResult;
25
+ }
26
+ export interface AdapterCapabilityReport {
27
+ schemaVersion: number;
28
+ generatedAt: number;
29
+ exchanges: AdapterCertificationResult[];
30
+ }
31
+ export declare function certifyAdapter(adapter: PerpDEXAdapter): AdapterCertificationResult;
32
+ export declare function generateAdapterCapabilityReport(): AdapterCapabilityReport;
33
+ export {};
@@ -0,0 +1,99 @@
1
+ import { getAdapter, listAdapters } from "./index.js";
2
+ export const ADAPTER_CAPABILITIES_SCHEMA_VERSION = 1;
3
+ const UNIMPLEMENTED_PATTERN = /(not yet implemented|not implemented|not yet integrated|not integrated|todo:\s*implement)/i;
4
+ const CAPABILITY_CATEGORIES = [
5
+ "marketData",
6
+ "authenticatedReads",
7
+ "orderLifecycle",
8
+ "orderCancellation",
9
+ "subscriptions",
10
+ "advancedTrading",
11
+ ];
12
+ const CATEGORY_METHODS = {
13
+ marketData: ["getMarkets", "getTicker", "getOrderBook", "getFundingRate", "getPublicTrades"],
14
+ authenticatedReads: ["getPositions", "getOrders", "getBalances", "getTrades", "getOrderHistory", "getFundingHistory"],
15
+ orderLifecycle: ["placeOrder", "getOrder", "getOrders", "modifyOrder"],
16
+ orderCancellation: ["cancelOrder", "cancelAllOrders", "cancelAllAfter"],
17
+ subscriptions: ["subscribe", "subscribeOrderBook", "subscribeTicker"],
18
+ advancedTrading: ["modifyOrder", "batchPlaceOrders", "batchCancelOrders", "cancelAllAfter", "getOrderHistory", "getFundingHistory", "getPublicTrades", "setMMP", "getMMP", "resetMMP", "placeTWAP", "cancelTWAP", "getTWAPStatus", "updateIsolatedMargin"],
19
+ };
20
+ function methodLooksImplemented(method) {
21
+ if (typeof method !== "function") {
22
+ return { method: "unknown", implemented: false, reason: "method missing" };
23
+ }
24
+ const source = method.toString();
25
+ const unimplementedMatch = source.match(UNIMPLEMENTED_PATTERN);
26
+ if (unimplementedMatch) {
27
+ return {
28
+ method: "unknown",
29
+ implemented: false,
30
+ reason: `explicit "${unimplementedMatch[0]}" marker`,
31
+ };
32
+ }
33
+ return { method: "unknown", implemented: true };
34
+ }
35
+ function getCapabilityLevel(implemented, total) {
36
+ if (implemented <= 0)
37
+ return "none";
38
+ if (implemented >= total)
39
+ return "full";
40
+ return "partial";
41
+ }
42
+ function certifyCategory(adapter, category) {
43
+ const methods = CATEGORY_METHODS[category].map((methodName) => {
44
+ const probe = methodLooksImplemented(adapter[methodName]);
45
+ return {
46
+ method: methodName,
47
+ implemented: probe.implemented,
48
+ reason: probe.reason,
49
+ };
50
+ });
51
+ const implemented = methods.filter((m) => m.implemented).length;
52
+ const total = methods.length;
53
+ return {
54
+ category,
55
+ level: getCapabilityLevel(implemented, total),
56
+ implemented,
57
+ total,
58
+ methods,
59
+ };
60
+ }
61
+ function certifyErrorSemantics(capabilities) {
62
+ const issues = [];
63
+ for (const category of CAPABILITY_CATEGORIES) {
64
+ const probes = capabilities[category].methods;
65
+ for (const probe of probes) {
66
+ if (!probe.implemented && !probe.reason) {
67
+ issues.push(`${probe.method}: missing unimplemented reason`);
68
+ }
69
+ }
70
+ }
71
+ return {
72
+ ok: issues.length === 0,
73
+ issues,
74
+ };
75
+ }
76
+ export function certifyAdapter(adapter) {
77
+ const capabilities = CAPABILITY_CATEGORIES.reduce((acc, category) => {
78
+ acc[category] = certifyCategory(adapter, category);
79
+ return acc;
80
+ }, {});
81
+ return {
82
+ id: adapter.info.id,
83
+ name: adapter.info.name,
84
+ capabilities,
85
+ errorSemantics: certifyErrorSemantics(capabilities),
86
+ };
87
+ }
88
+ export function generateAdapterCapabilityReport() {
89
+ const exchanges = listAdapters()
90
+ .map((exchangeId) => getAdapter(exchangeId))
91
+ .filter((adapter) => adapter !== null)
92
+ .map((adapter) => certifyAdapter(adapter))
93
+ .sort((a, b) => a.id.localeCompare(b.id));
94
+ return {
95
+ schemaVersion: ADAPTER_CAPABILITIES_SCHEMA_VERSION,
96
+ generatedAt: Date.now(),
97
+ exchanges,
98
+ };
99
+ }
@@ -0,0 +1,45 @@
1
+ import type { Hex } from "viem";
2
+ export interface DecibelExecutionMarket {
3
+ marketName: string;
4
+ marketAddr: string;
5
+ pxDecimals: number;
6
+ szDecimals: number;
7
+ tickSize: bigint;
8
+ lotSize: bigint;
9
+ minSize: bigint;
10
+ }
11
+ export interface PlaceDecibelOrderParams {
12
+ market: DecibelExecutionMarket;
13
+ side: "buy" | "sell";
14
+ price: number;
15
+ sizeUnits: number;
16
+ timeInForce?: 0 | 1 | 2;
17
+ reduceOnly?: boolean;
18
+ clientOrderId?: string;
19
+ stopPrice?: number;
20
+ tpTriggerPrice?: number;
21
+ tpLimitPrice?: number;
22
+ slTriggerPrice?: number;
23
+ slLimitPrice?: number;
24
+ builderAddr?: string;
25
+ builderFeeBps?: number;
26
+ }
27
+ export interface DecibelOrderManagerConfig {
28
+ fullnodeUrl: string;
29
+ network: "testnet" | "mainnet";
30
+ packageAddress: string;
31
+ privateKey: Hex;
32
+ subaccountAddress: string;
33
+ }
34
+ export declare class DecibelOrderManager {
35
+ private readonly aptos;
36
+ private readonly account;
37
+ private readonly packageAddress;
38
+ private subaccountAddress;
39
+ constructor(config: DecibelOrderManagerConfig);
40
+ setSubaccount(addr: string): void;
41
+ placeOrder(params: PlaceDecibelOrderParams): Promise<string>;
42
+ cancelOrder(orderId: string, marketAddr: string): Promise<string>;
43
+ cancelAllOrders(marketAddr: string): Promise<string>;
44
+ configureUserSettingsForMarket(marketAddr: string, isCross: boolean, userLeverageBps: number): Promise<string>;
45
+ }
@@ -0,0 +1,140 @@
1
+ import { Aptos, AptosConfig, Ed25519Account, Ed25519PrivateKey, Network, } from "@aptos-labs/ts-sdk";
2
+ import { createLogger } from "../../lib/logger.js";
3
+ const log = createLogger("decibel:orders");
4
+ export class DecibelOrderManager {
5
+ aptos;
6
+ account;
7
+ packageAddress;
8
+ subaccountAddress;
9
+ constructor(config) {
10
+ const aptosConfig = new AptosConfig({
11
+ network: config.network === "mainnet" ? Network.MAINNET : Network.TESTNET,
12
+ fullnode: config.fullnodeUrl,
13
+ });
14
+ this.aptos = new Aptos(aptosConfig);
15
+ this.account = new Ed25519Account({
16
+ privateKey: new Ed25519PrivateKey(config.privateKey),
17
+ });
18
+ this.packageAddress = config.packageAddress;
19
+ this.subaccountAddress = config.subaccountAddress;
20
+ }
21
+ setSubaccount(addr) {
22
+ this.subaccountAddress = addr;
23
+ }
24
+ async placeOrder(params) {
25
+ const { market, side, price, sizeUnits, timeInForce = 0, reduceOnly = false, clientOrderId, stopPrice, tpTriggerPrice, tpLimitPrice, slTriggerPrice, slLimitPrice, builderAddr, builderFeeBps, } = params;
26
+ const chainPrice = formatPrice(price, market);
27
+ const chainSize = formatSize(sizeUnits, market);
28
+ const isBuy = side === "buy";
29
+ const payload = {
30
+ function: `${this.packageAddress}::dex_accounts::place_order_to_subaccount`,
31
+ typeArguments: [],
32
+ functionArguments: [
33
+ this.subaccountAddress,
34
+ market.marketAddr,
35
+ chainPrice.toString(),
36
+ chainSize.toString(),
37
+ isBuy,
38
+ timeInForce,
39
+ reduceOnly,
40
+ clientOrderId ?? null,
41
+ stopPrice != null ? formatPrice(stopPrice, market).toString() : null,
42
+ tpTriggerPrice != null ? formatPrice(tpTriggerPrice, market).toString() : null,
43
+ tpLimitPrice != null ? formatPrice(tpLimitPrice, market).toString() : null,
44
+ slTriggerPrice != null ? formatPrice(slTriggerPrice, market).toString() : null,
45
+ slLimitPrice != null ? formatPrice(slLimitPrice, market).toString() : null,
46
+ builderAddr ?? null,
47
+ builderFeeBps ?? null,
48
+ ],
49
+ };
50
+ const tx = await this.aptos.transaction.build.simple({
51
+ sender: this.account.accountAddress,
52
+ data: payload,
53
+ });
54
+ const pending = await this.aptos.signAndSubmitTransaction({
55
+ signer: this.account,
56
+ transaction: tx,
57
+ });
58
+ log.info("Decibel order submitted", {
59
+ txHash: pending.hash,
60
+ market: market.marketName,
61
+ side,
62
+ price,
63
+ size: sizeUnits,
64
+ tif: timeInForce,
65
+ reduceOnly,
66
+ });
67
+ return pending.hash;
68
+ }
69
+ async cancelOrder(orderId, marketAddr) {
70
+ const payload = {
71
+ function: `${this.packageAddress}::dex_accounts::cancel_order_to_subaccount`,
72
+ typeArguments: [],
73
+ functionArguments: [this.subaccountAddress, orderId, marketAddr],
74
+ };
75
+ const tx = await this.aptos.transaction.build.simple({
76
+ sender: this.account.accountAddress,
77
+ data: payload,
78
+ });
79
+ const pending = await this.aptos.signAndSubmitTransaction({
80
+ signer: this.account,
81
+ transaction: tx,
82
+ });
83
+ log.info("Decibel order cancel submitted", { txHash: pending.hash, orderId });
84
+ return pending.hash;
85
+ }
86
+ async cancelAllOrders(marketAddr) {
87
+ const payload = {
88
+ function: `${this.packageAddress}::dex_accounts::cancel_bulk_order_to_subaccount`,
89
+ typeArguments: [],
90
+ functionArguments: [this.subaccountAddress, marketAddr],
91
+ };
92
+ const tx = await this.aptos.transaction.build.simple({
93
+ sender: this.account.accountAddress,
94
+ data: payload,
95
+ });
96
+ const pending = await this.aptos.signAndSubmitTransaction({
97
+ signer: this.account,
98
+ transaction: tx,
99
+ });
100
+ log.info("Decibel cancel-all submitted", { txHash: pending.hash, marketAddr });
101
+ return pending.hash;
102
+ }
103
+ async configureUserSettingsForMarket(marketAddr, isCross, userLeverageBps) {
104
+ const leverageBps = Math.max(1, Math.round(userLeverageBps));
105
+ const payload = {
106
+ function: `${this.packageAddress}::dex_accounts::configure_user_settings_for_market`,
107
+ typeArguments: [],
108
+ functionArguments: [this.subaccountAddress, marketAddr, isCross, leverageBps],
109
+ };
110
+ const tx = await this.aptos.transaction.build.simple({
111
+ sender: this.account.accountAddress,
112
+ data: payload,
113
+ });
114
+ const pending = await this.aptos.signAndSubmitTransaction({
115
+ signer: this.account,
116
+ transaction: tx,
117
+ });
118
+ log.info("Decibel user settings update submitted", {
119
+ txHash: pending.hash,
120
+ marketAddr,
121
+ isCross,
122
+ userLeverageBps: leverageBps,
123
+ });
124
+ return pending.hash;
125
+ }
126
+ }
127
+ function decimalToChainUnits(amount, decimals) {
128
+ return BigInt(Math.round(amount * 10 ** decimals));
129
+ }
130
+ function formatPrice(price, market) {
131
+ const raw = decimalToChainUnits(price, market.pxDecimals);
132
+ const tick = market.tickSize;
133
+ return (raw / tick) * tick;
134
+ }
135
+ function formatSize(size, market) {
136
+ const raw = decimalToChainUnits(size, market.szDecimals);
137
+ const lot = market.lotSize;
138
+ const rounded = (raw / lot) * lot;
139
+ return rounded < market.minSize ? market.minSize : rounded;
140
+ }
@@ -0,0 +1,176 @@
1
+ export interface DecibelMarketResponse {
2
+ market_name: string;
3
+ market_addr: string;
4
+ max_leverage: number | string;
5
+ px_decimals: number | string;
6
+ sz_decimals: number | string;
7
+ tick_size: string | number;
8
+ lot_size: string | number;
9
+ min_size: string | number;
10
+ market_mode: "Open" | "ReduceOnly" | "CloseOnly" | string;
11
+ }
12
+ export interface DecibelPriceResponse {
13
+ market: string;
14
+ oracle_px: number | string;
15
+ mark_px: number | string;
16
+ mid_px: number | string;
17
+ funding_rate_bps: number | string;
18
+ open_interest: number | string;
19
+ transaction_unix_ms?: number | string;
20
+ }
21
+ export interface DecibelDepthLevel {
22
+ price: number | string;
23
+ size: number | string;
24
+ }
25
+ export interface DecibelDepthResponse {
26
+ market: string;
27
+ bids: DecibelDepthLevel[];
28
+ asks: DecibelDepthLevel[];
29
+ unix_ms?: number | string;
30
+ }
31
+ export interface DecibelAccountOverviewResponse {
32
+ equity?: number | string;
33
+ perp_equity_balance?: number | string;
34
+ total_collateral?: number | string;
35
+ total_margin?: number | string;
36
+ unrealized_pnl?: number | string;
37
+ realized_pnl?: number | string;
38
+ margin_utilization?: number | string;
39
+ cross_margin_ratio?: number | string;
40
+ }
41
+ export interface DecibelAccountPositionResponse {
42
+ market_name?: string;
43
+ market?: string;
44
+ size: number | string;
45
+ entry_price: number | string;
46
+ mark_price?: number | string;
47
+ oracle_price?: number | string;
48
+ unrealized_pnl?: number | string;
49
+ unrealized_funding?: number | string;
50
+ liquidation_price?: number | string;
51
+ estimated_liquidation_price?: number | string;
52
+ leverage?: number | string;
53
+ user_leverage?: number | string;
54
+ }
55
+ export interface DecibelOrderResponse {
56
+ order_id?: string;
57
+ client_order_id?: string;
58
+ market?: string;
59
+ market_name?: string;
60
+ is_buy?: boolean;
61
+ side?: string;
62
+ order_type?: string;
63
+ status?: string;
64
+ orig_size?: number | string;
65
+ remaining_size?: number | string;
66
+ filled_size?: number | string;
67
+ price?: number | string;
68
+ trigger_price?: number | string;
69
+ reduce_only?: boolean;
70
+ is_reduce_only?: boolean;
71
+ post_only?: boolean;
72
+ is_post_only?: boolean;
73
+ unix_ms?: number | string;
74
+ }
75
+ export interface DecibelTradeResponse {
76
+ trade_id?: string;
77
+ fill_id?: string;
78
+ order_id?: string;
79
+ market?: string;
80
+ market_name?: string;
81
+ is_buy?: boolean;
82
+ side?: string;
83
+ price?: number | string;
84
+ size?: number | string;
85
+ fee?: number | string;
86
+ fee_asset?: string;
87
+ unix_ms?: number | string;
88
+ }
89
+ export interface DecibelAssetContextResponse {
90
+ market: string;
91
+ mark_price: number | string;
92
+ mid_price: number | string;
93
+ oracle_price: number | string;
94
+ previous_day_price: number | string;
95
+ price_change_pct_24h: number | string;
96
+ volume_24h: number | string;
97
+ open_interest: number | string;
98
+ }
99
+ export interface DecibelCandlestickResponse {
100
+ t: number;
101
+ T: number;
102
+ o: number;
103
+ h: number;
104
+ l: number;
105
+ c: number;
106
+ v: number;
107
+ i: string;
108
+ }
109
+ export interface DecibelSubaccountResponse {
110
+ subaccount_address: string;
111
+ primary_account_address: string;
112
+ is_primary: boolean;
113
+ is_active: boolean;
114
+ custom_label: string | null;
115
+ }
116
+ export interface DecibelFundingHistoryResponse {
117
+ market: string;
118
+ action: string;
119
+ size: number | string;
120
+ is_funding_positive: boolean;
121
+ realized_funding_amount: number | string;
122
+ is_rebate: boolean;
123
+ fee_amount: number | string;
124
+ transaction_unix_ms: number | string;
125
+ }
126
+ export interface DecibelFundHistoryResponse {
127
+ type: string;
128
+ amount: number | string;
129
+ unix_ms: number | string;
130
+ }
131
+ export interface DecibelPublicTradeResponse {
132
+ account?: string;
133
+ market: string;
134
+ action?: string;
135
+ source?: string;
136
+ trade_id: string;
137
+ size: number | string;
138
+ price: number | string;
139
+ is_profit?: boolean;
140
+ realized_pnl_amount?: number | string;
141
+ is_funding_positive?: boolean;
142
+ realized_funding_amount?: number | string;
143
+ is_rebate?: boolean;
144
+ fee_amount?: number | string;
145
+ order_id?: string;
146
+ client_order_id?: string;
147
+ transaction_unix_ms: number | string;
148
+ transaction_version?: number | string;
149
+ }
150
+ export interface DecibelOrderLookupResponse {
151
+ status: string;
152
+ details?: string;
153
+ order?: DecibelOrderResponse;
154
+ }
155
+ export declare class DecibelRestClient {
156
+ private readonly baseUrl;
157
+ private readonly bearerToken?;
158
+ constructor(baseUrl: string, bearerToken?: string);
159
+ getMarkets(): Promise<DecibelMarketResponse[]>;
160
+ getPrices(marketAddr?: string): Promise<DecibelPriceResponse[]>;
161
+ getDepth(marketAddr: string, limit?: number): Promise<DecibelDepthResponse>;
162
+ getAccountOverview(accountAddr: string): Promise<DecibelAccountOverviewResponse>;
163
+ getAccountPositions(accountAddr: string): Promise<DecibelAccountPositionResponse[]>;
164
+ getOpenOrders(accountAddr: string): Promise<DecibelOrderResponse[]>;
165
+ getOrderHistory(accountAddr: string, limit?: number, offset?: number): Promise<DecibelOrderResponse[]>;
166
+ getTradeHistory(accountAddr: string, marketAddr?: string, limit?: number, offset?: number): Promise<DecibelTradeResponse[]>;
167
+ getAssetContexts(marketAddr?: string): Promise<DecibelAssetContextResponse[]>;
168
+ getCandlesticks(marketAddr: string, interval: string, startTime: number, endTime: number): Promise<DecibelCandlestickResponse[]>;
169
+ getSubaccounts(ownerAddr: string): Promise<DecibelSubaccountResponse[]>;
170
+ getFundingHistory(accountAddr: string, limit?: number, offset?: number): Promise<DecibelFundingHistoryResponse[]>;
171
+ getOrderById(accountAddr: string, marketAddr: string, orderId?: string, clientOrderId?: string): Promise<DecibelOrderLookupResponse>;
172
+ getPublicTrades(marketAddr: string, limit?: number, offset?: number, orderId?: string): Promise<DecibelPublicTradeResponse[]>;
173
+ getFundHistory(accountAddr: string, limit?: number, offset?: number): Promise<DecibelFundHistoryResponse[]>;
174
+ private fetchApi;
175
+ private unwrapRows;
176
+ }
@@ -0,0 +1,155 @@
1
+ import { createLogger } from "../../lib/logger.js";
2
+ import { fetchWithTimeout } from "../../lib/fetch.js";
3
+ import { isRecord } from "../utils.js";
4
+ const log = createLogger("decibel:rest");
5
+ export class DecibelRestClient {
6
+ baseUrl;
7
+ bearerToken;
8
+ constructor(baseUrl, bearerToken) {
9
+ this.baseUrl = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
10
+ this.bearerToken = bearerToken;
11
+ }
12
+ async getMarkets() {
13
+ return this.fetchApi("api/v1/markets");
14
+ }
15
+ async getPrices(marketAddr) {
16
+ const params = {};
17
+ if (marketAddr)
18
+ params.market = marketAddr;
19
+ return this.fetchApi("api/v1/prices", params);
20
+ }
21
+ async getDepth(marketAddr, limit) {
22
+ const params = { market: marketAddr };
23
+ if (limit != null)
24
+ params.limit = limit;
25
+ return this.fetchApi("api/v1/depth", params);
26
+ }
27
+ async getAccountOverview(accountAddr) {
28
+ return this.fetchApi("api/v1/account_overviews", { account: accountAddr }, true);
29
+ }
30
+ async getAccountPositions(accountAddr) {
31
+ const payload = await this.fetchApi("api/v1/account_positions", { account: accountAddr }, true);
32
+ return this.unwrapRows(payload);
33
+ }
34
+ async getOpenOrders(accountAddr) {
35
+ const payload = await this.fetchApi("api/v1/open_orders", { user: accountAddr }, true);
36
+ return this.unwrapRows(payload);
37
+ }
38
+ async getOrderHistory(accountAddr, limit = 200, offset = 0) {
39
+ const payload = await this.fetchApi("api/v1/order_history", { user: accountAddr, limit, offset }, true);
40
+ return this.unwrapRows(payload);
41
+ }
42
+ async getTradeHistory(accountAddr, marketAddr, limit = 200, offset = 0) {
43
+ const params = {
44
+ user: accountAddr,
45
+ limit,
46
+ offset,
47
+ };
48
+ if (marketAddr) {
49
+ params.market = marketAddr;
50
+ }
51
+ const payload = await this.fetchApi("api/v1/trade_history", params, true);
52
+ return this.unwrapRows(payload);
53
+ }
54
+ async getAssetContexts(marketAddr) {
55
+ const params = {};
56
+ if (marketAddr)
57
+ params.market = marketAddr;
58
+ return this.fetchApi("api/v1/asset_contexts", params);
59
+ }
60
+ async getCandlesticks(marketAddr, interval, startTime, endTime) {
61
+ return this.fetchApi("api/v1/candlesticks", {
62
+ market: marketAddr,
63
+ interval,
64
+ startTime,
65
+ endTime,
66
+ });
67
+ }
68
+ async getSubaccounts(ownerAddr) {
69
+ return this.fetchApi("api/v1/subaccounts", {
70
+ owner: ownerAddr,
71
+ });
72
+ }
73
+ async getFundingHistory(accountAddr, limit = 200, offset = 0) {
74
+ const payload = await this.fetchApi("api/v1/funding_rate_history", { account: accountAddr, limit, offset }, true);
75
+ return this.unwrapRows(payload);
76
+ }
77
+ async getOrderById(accountAddr, marketAddr, orderId, clientOrderId) {
78
+ const params = {
79
+ account: accountAddr,
80
+ market: marketAddr,
81
+ };
82
+ if (orderId)
83
+ params.order_id = orderId;
84
+ if (clientOrderId)
85
+ params.client_order_id = clientOrderId;
86
+ return this.fetchApi("api/v1/orders", params, true);
87
+ }
88
+ async getPublicTrades(marketAddr, limit = 200, offset = 0, orderId) {
89
+ const params = {
90
+ market: marketAddr,
91
+ limit,
92
+ offset,
93
+ };
94
+ if (orderId)
95
+ params.order_id = orderId;
96
+ const payload = await this.fetchApi("api/v1/trades", params);
97
+ return this.unwrapRows(payload);
98
+ }
99
+ async getFundHistory(accountAddr, limit = 200, offset = 0) {
100
+ const payload = await this.fetchApi("api/v1/fund_history", { account: accountAddr, limit, offset }, true);
101
+ return this.unwrapRows(payload);
102
+ }
103
+ async fetchApi(path, params, requiresAuth = false) {
104
+ const url = new URL(path, this.baseUrl);
105
+ if (params) {
106
+ for (const [key, value] of Object.entries(params)) {
107
+ url.searchParams.set(key, String(value));
108
+ }
109
+ }
110
+ const headers = {
111
+ Origin: "https://app.decibel.trade",
112
+ };
113
+ if (requiresAuth) {
114
+ if (!this.bearerToken) {
115
+ throw new Error(`Decibel endpoint '${path}' requires DECIBEL_API_BEARER_TOKEN`);
116
+ }
117
+ headers.Authorization = `Bearer ${this.bearerToken}`;
118
+ }
119
+ else if (this.bearerToken) {
120
+ headers.Authorization = `Bearer ${this.bearerToken}`;
121
+ }
122
+ log.debug(`GET ${url.pathname}${url.search}`);
123
+ const json = await fetchWithTimeout(url.toString(), {
124
+ headers,
125
+ });
126
+ if (json && typeof json === "object" && "status" in json) {
127
+ const status = json.status;
128
+ if (status === "failed" || status === "timeout" || status === "notFound") {
129
+ const message = json.message ?? "unknown error";
130
+ throw new Error(`Decibel API ${path} ${status}: ${message}`);
131
+ }
132
+ }
133
+ return json;
134
+ }
135
+ unwrapRows(payload) {
136
+ if (Array.isArray(payload)) {
137
+ return payload;
138
+ }
139
+ if (isRecord(payload)) {
140
+ const candidates = [
141
+ payload.results,
142
+ payload.data,
143
+ isRecord(payload.data) ? payload.data.rows : undefined,
144
+ isRecord(payload.data) ? payload.data.orders : undefined,
145
+ isRecord(payload.data) ? payload.data.trades : undefined,
146
+ ];
147
+ for (const candidate of candidates) {
148
+ if (Array.isArray(candidate)) {
149
+ return candidate;
150
+ }
151
+ }
152
+ }
153
+ return [];
154
+ }
155
+ }
@@ -0,0 +1,28 @@
1
+ import { EventEmitter } from "node:events";
2
+ export interface DecibelWsFeedOptions {
3
+ reconnectDelayMs?: number;
4
+ pingIntervalMs?: number;
5
+ }
6
+ export declare class DecibelWsFeed extends EventEmitter {
7
+ private ws;
8
+ private readonly wsUrl;
9
+ private readonly bearerToken?;
10
+ private readonly subscriptions;
11
+ private readonly reconnectDelay;
12
+ private readonly pingInterval;
13
+ private pingTimer;
14
+ private reconnectTimer;
15
+ private shouldReconnect;
16
+ constructor(wsUrl: string, bearerToken?: string, opts?: DecibelWsFeedOptions);
17
+ connect(): void;
18
+ subscribe(topic: string): void;
19
+ unsubscribe(topic: string): void;
20
+ close(): void;
21
+ isConnected(): boolean;
22
+ private doConnect;
23
+ private sendSubscribe;
24
+ private startPing;
25
+ private stopPing;
26
+ private clearReconnectTimer;
27
+ private handleMessage;
28
+ }