@cubee_ee/sdk 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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +110 -0
  3. package/dist/clients/AdminClient.d.ts +61 -0
  4. package/dist/clients/AdminClient.d.ts.map +1 -0
  5. package/dist/clients/AdminClient.js +196 -0
  6. package/dist/clients/AdminClient.js.map +1 -0
  7. package/dist/clients/CubeBackendClient.d.ts +67 -0
  8. package/dist/clients/CubeBackendClient.d.ts.map +1 -0
  9. package/dist/clients/CubeBackendClient.js +126 -0
  10. package/dist/clients/CubeBackendClient.js.map +1 -0
  11. package/dist/clients/CubicPoolClient.d.ts +73 -0
  12. package/dist/clients/CubicPoolClient.d.ts.map +1 -0
  13. package/dist/clients/CubicPoolClient.js +425 -0
  14. package/dist/clients/CubicPoolClient.js.map +1 -0
  15. package/dist/clients/PoolFactoryClient.d.ts +45 -0
  16. package/dist/clients/PoolFactoryClient.d.ts.map +1 -0
  17. package/dist/clients/PoolFactoryClient.js +83 -0
  18. package/dist/clients/PoolFactoryClient.js.map +1 -0
  19. package/dist/clients/RpcClient.d.ts +28 -0
  20. package/dist/clients/RpcClient.d.ts.map +1 -0
  21. package/dist/clients/RpcClient.js +58 -0
  22. package/dist/clients/RpcClient.js.map +1 -0
  23. package/dist/clients/SingleTokenDepositClient.d.ts +45 -0
  24. package/dist/clients/SingleTokenDepositClient.d.ts.map +1 -0
  25. package/dist/clients/SingleTokenDepositClient.js +63 -0
  26. package/dist/clients/SingleTokenDepositClient.js.map +1 -0
  27. package/dist/clients/index.d.ts +8 -0
  28. package/dist/clients/index.d.ts.map +1 -0
  29. package/dist/clients/index.js +24 -0
  30. package/dist/clients/index.js.map +1 -0
  31. package/dist/clients/tx-builders.d.ts +32 -0
  32. package/dist/clients/tx-builders.d.ts.map +1 -0
  33. package/dist/clients/tx-builders.js +398 -0
  34. package/dist/clients/tx-builders.js.map +1 -0
  35. package/dist/config/index.d.ts +60 -0
  36. package/dist/config/index.d.ts.map +1 -0
  37. package/dist/config/index.js +59 -0
  38. package/dist/config/index.js.map +1 -0
  39. package/dist/config/networks.d.ts +10 -0
  40. package/dist/config/networks.d.ts.map +1 -0
  41. package/dist/config/networks.js +31 -0
  42. package/dist/config/networks.js.map +1 -0
  43. package/dist/config/tokens.d.ts +19 -0
  44. package/dist/config/tokens.d.ts.map +1 -0
  45. package/dist/config/tokens.js +43 -0
  46. package/dist/config/tokens.js.map +1 -0
  47. package/dist/idl/cubic_pool.json +2497 -0
  48. package/dist/idl/index.d.ts +975 -0
  49. package/dist/idl/index.d.ts.map +1 -0
  50. package/dist/idl/index.js +18 -0
  51. package/dist/idl/index.js.map +1 -0
  52. package/dist/idl/protocol_admin.json +1816 -0
  53. package/dist/idl/single_token_liquidity.json +745 -0
  54. package/dist/index.d.ts +48 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +136 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/math/cubicMath.d.ts +40 -0
  59. package/dist/math/cubicMath.d.ts.map +1 -0
  60. package/dist/math/cubicMath.js +75 -0
  61. package/dist/math/cubicMath.js.map +1 -0
  62. package/dist/math/fixedPoint.d.ts +14 -0
  63. package/dist/math/fixedPoint.d.ts.map +1 -0
  64. package/dist/math/fixedPoint.js +46 -0
  65. package/dist/math/fixedPoint.js.map +1 -0
  66. package/dist/math/index.d.ts +7 -0
  67. package/dist/math/index.d.ts.map +1 -0
  68. package/dist/math/index.js +23 -0
  69. package/dist/math/index.js.map +1 -0
  70. package/dist/math/logExp.d.ts +15 -0
  71. package/dist/math/logExp.d.ts.map +1 -0
  72. package/dist/math/logExp.js +91 -0
  73. package/dist/math/logExp.js.map +1 -0
  74. package/dist/math/singleToken.d.ts +53 -0
  75. package/dist/math/singleToken.d.ts.map +1 -0
  76. package/dist/math/singleToken.js +185 -0
  77. package/dist/math/singleToken.js.map +1 -0
  78. package/dist/math/slippage.d.ts +24 -0
  79. package/dist/math/slippage.d.ts.map +1 -0
  80. package/dist/math/slippage.js +54 -0
  81. package/dist/math/slippage.js.map +1 -0
  82. package/dist/math/weightedMath.d.ts +18 -0
  83. package/dist/math/weightedMath.d.ts.map +1 -0
  84. package/dist/math/weightedMath.js +45 -0
  85. package/dist/math/weightedMath.js.map +1 -0
  86. package/dist/parsers/borsh.d.ts +24 -0
  87. package/dist/parsers/borsh.d.ts.map +1 -0
  88. package/dist/parsers/borsh.js +80 -0
  89. package/dist/parsers/borsh.js.map +1 -0
  90. package/dist/parsers/events.d.ts +3 -0
  91. package/dist/parsers/events.d.ts.map +1 -0
  92. package/dist/parsers/events.js +172 -0
  93. package/dist/parsers/events.js.map +1 -0
  94. package/dist/parsers/index.d.ts +5 -0
  95. package/dist/parsers/index.d.ts.map +1 -0
  96. package/dist/parsers/index.js +21 -0
  97. package/dist/parsers/index.js.map +1 -0
  98. package/dist/parsers/mintAccount.d.ts +22 -0
  99. package/dist/parsers/mintAccount.d.ts.map +1 -0
  100. package/dist/parsers/mintAccount.js +22 -0
  101. package/dist/parsers/mintAccount.js.map +1 -0
  102. package/dist/parsers/poolAccount.d.ts +32 -0
  103. package/dist/parsers/poolAccount.d.ts.map +1 -0
  104. package/dist/parsers/poolAccount.js +88 -0
  105. package/dist/parsers/poolAccount.js.map +1 -0
  106. package/dist/types/events.d.ts +82 -0
  107. package/dist/types/events.d.ts.map +1 -0
  108. package/dist/types/events.js +3 -0
  109. package/dist/types/events.js.map +1 -0
  110. package/dist/types/index.d.ts +5 -0
  111. package/dist/types/index.d.ts.map +1 -0
  112. package/dist/types/index.js +21 -0
  113. package/dist/types/index.js.map +1 -0
  114. package/dist/types/pool.d.ts +66 -0
  115. package/dist/types/pool.d.ts.map +1 -0
  116. package/dist/types/pool.js +3 -0
  117. package/dist/types/pool.js.map +1 -0
  118. package/dist/types/result.d.ts +23 -0
  119. package/dist/types/result.d.ts.map +1 -0
  120. package/dist/types/result.js +11 -0
  121. package/dist/types/result.js.map +1 -0
  122. package/dist/types/tx.d.ts +80 -0
  123. package/dist/types/tx.d.ts.map +1 -0
  124. package/dist/types/tx.js +3 -0
  125. package/dist/types/tx.js.map +1 -0
  126. package/dist/utils/errors.d.ts +8 -0
  127. package/dist/utils/errors.d.ts.map +1 -0
  128. package/dist/utils/errors.js +83 -0
  129. package/dist/utils/errors.js.map +1 -0
  130. package/dist/utils/index.d.ts +4 -0
  131. package/dist/utils/index.d.ts.map +1 -0
  132. package/dist/utils/index.js +20 -0
  133. package/dist/utils/index.js.map +1 -0
  134. package/dist/utils/pda.d.ts +8 -0
  135. package/dist/utils/pda.d.ts.map +1 -0
  136. package/dist/utils/pda.js +27 -0
  137. package/dist/utils/pda.js.map +1 -0
  138. package/dist/utils/retry.d.ts +22 -0
  139. package/dist/utils/retry.d.ts.map +1 -0
  140. package/dist/utils/retry.js +62 -0
  141. package/dist/utils/retry.js.map +1 -0
  142. package/package.json +54 -0
  143. package/src/clients/AdminClient.ts +254 -0
  144. package/src/clients/CubeBackendClient.ts +193 -0
  145. package/src/clients/CubicPoolClient.ts +492 -0
  146. package/src/clients/PoolFactoryClient.ts +102 -0
  147. package/src/clients/RpcClient.ts +78 -0
  148. package/src/clients/SingleTokenDepositClient.ts +91 -0
  149. package/src/clients/index.ts +7 -0
  150. package/src/clients/tx-builders.ts +538 -0
  151. package/src/config/index.ts +82 -0
  152. package/src/config/networks.ts +49 -0
  153. package/src/config/tokens.ts +52 -0
  154. package/src/idl/cubic_pool.json +2497 -0
  155. package/src/idl/index.ts +13 -0
  156. package/src/idl/protocol_admin.json +1816 -0
  157. package/src/idl/single_token_liquidity.json +745 -0
  158. package/src/index.ts +154 -0
  159. package/src/math/cubicMath.ts +89 -0
  160. package/src/math/fixedPoint.ts +39 -0
  161. package/src/math/index.ts +6 -0
  162. package/src/math/logExp.ts +82 -0
  163. package/src/math/singleToken.ts +250 -0
  164. package/src/math/slippage.ts +49 -0
  165. package/src/math/weightedMath.ts +48 -0
  166. package/src/parsers/borsh.ts +80 -0
  167. package/src/parsers/events.ts +172 -0
  168. package/src/parsers/index.ts +4 -0
  169. package/src/parsers/mintAccount.ts +37 -0
  170. package/src/parsers/poolAccount.ts +113 -0
  171. package/src/types/events.ts +100 -0
  172. package/src/types/index.ts +4 -0
  173. package/src/types/pool.ts +64 -0
  174. package/src/types/result.ts +45 -0
  175. package/src/types/tx.ts +87 -0
  176. package/src/utils/errors.ts +78 -0
  177. package/src/utils/index.ts +3 -0
  178. package/src/utils/pda.ts +58 -0
  179. package/src/utils/retry.ts +85 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Endgame AMM DEX Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # @cube/sdk
2
+
3
+ Client library for the Cubic Pool AMM on Solana. Targeted at both frontend
4
+ and backend consumers; no bundler-specific code.
5
+
6
+ ## Install (workspace-local)
7
+
8
+ ```bash
9
+ cd sdk
10
+ npm install
11
+ npm run build
12
+ ```
13
+
14
+ From sibling packages:
15
+
16
+ ```json
17
+ {
18
+ "dependencies": {
19
+ "@cube/sdk": "file:../sdk"
20
+ }
21
+ }
22
+ ```
23
+
24
+ ## Quick start
25
+
26
+ ```ts
27
+ import { getConfig, CubicPoolClient, CubeBackendClient } from "@cube/sdk";
28
+ import { PublicKey } from "@solana/web3.js";
29
+
30
+ const config = getConfig("mainnet", {
31
+ backendEndpoint: "https://api.cube.fi",
32
+ slippageHundredthsBps: 30_000, // 3 %
33
+ });
34
+
35
+ const pool = new CubicPoolClient({
36
+ config,
37
+ poolAddress: new PublicKey("..."),
38
+ rpc: { endpoint: config.defaults.rpcEndpoint, apiKey: process.env.RPC_API_KEY },
39
+ });
40
+
41
+ const res = await pool.sync();
42
+ if (!res.ok) {
43
+ // res.error.humanMessage is safe to render to users
44
+ console.error(res.error.humanMessage);
45
+ return;
46
+ }
47
+ const info = res.data;
48
+ // info.tokens[i].metadata contains ticker / logo / decimals
49
+ // info.tokens[i].actualBalance is a bn.js BN in native units
50
+ ```
51
+
52
+ ## Architecture
53
+
54
+ ```
55
+ config/ CubeConfig, program IDs per network, token registry
56
+ types/ Result<T> shape, PoolInfo, SwapQuote, SingleTokenDepositQuote,
57
+ CubicPoolEvent
58
+ utils/ Error mapping, retry wrapper (safeCall), PDA helpers
59
+ math/ Pure math — port of cubic-pool + stld Rust math modules
60
+ parsers/ Binary layout decoders for CubicPool / Mint / events
61
+ clients/ RpcClient, CubeBackendClient, CubicPoolClient
62
+ idl/ Anchor IDL exports generated from the current contracts
63
+ examples/ Runnable scripts demonstrating each capability
64
+ ```
65
+
66
+ Every public method returns `SdkResult<T>` — either `{ ok: true, data }`
67
+ or `{ ok: false, error: { code, humanMessage, cause? } }`. The SDK never
68
+ throws for I/O or parse errors.
69
+
70
+ ## What lives in the SDK vs the frontend
71
+
72
+ **In the SDK:**
73
+ - All on-chain account parsing (pool, mint, events)
74
+ - All math (quote, allocations, slippage, price impact)
75
+ - All transaction building (swap, add/remove liquidity, single-token deposit, pool deploy)
76
+ - Current Anchor IDLs for `cubic_pool`, `single_token_liquidity`, and
77
+ `protocol_fees_authority`
78
+ - Retry + fallback for RPC and backend calls
79
+ - Event log decoding
80
+
81
+ **In the frontend:** only UI rendering + state management (zustand / redux) + wallet integration. No raw RPC calls, no borsh, no math.
82
+
83
+ ## Examples
84
+
85
+ See `examples/*.ts`:
86
+
87
+ - `01-init-sdk.ts` — initialisation patterns
88
+ - `02-fetch-pool.ts` — parse pool state
89
+ - `03-quote-swap.ts` — swap quote with slippage
90
+ - `06-single-token-deposit.ts` — single-token deposit quote
91
+ - `08-backend-stats.ts` — statistics via CubeBackendClient
92
+
93
+ Run: `npx ts-node examples/<name>.ts`.
94
+
95
+ ## Error handling pattern
96
+
97
+ ```ts
98
+ const res = await pool.sync();
99
+ if (!res.ok) {
100
+ toast.error(res.error.humanMessage);
101
+ logger.debug(res.error.cause);
102
+ return;
103
+ }
104
+ const pool = res.data;
105
+ ```
106
+
107
+ The SDK's `safeCall` helper retries transient errors (RPC timeouts, rate
108
+ limits, connection refused) up to 3 times with exponential backoff
109
+ (200ms / 500ms / 1500ms). Permanent errors (parse failure, invalid input,
110
+ insufficient funds) short-circuit.
@@ -0,0 +1,61 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { Program } from "@coral-xyz/anchor";
3
+ import { Connection, PublicKey } from "@solana/web3.js";
4
+ import BN from "bn.js";
5
+ import { CubeConfig } from "../config";
6
+ /**
7
+ * AdminClient — wraps `protocol_admin` with treasury-routed admin
8
+ * operations.
9
+ *
10
+ * The cubic_pool program enforces that every admin instruction must be
11
+ * signed by the Treasury PDA (`seeds = [b"treasury"]`, owned by
12
+ * protocol_admin). This client builds the canonical flow:
13
+ *
14
+ * admin wallet
15
+ * → protocol_admin.<wrapper> (treasury.admin == signer)
16
+ * → CPI cubic_pool.<admin_ix> (signer == TREASURY_PDA)
17
+ *
18
+ * Direct calls into cubic_pool admin instructions will fail on-chain.
19
+ *
20
+ * Note: every method returns a `TransactionInstruction`. Compose into a tx
21
+ * with `@solana/web3.js` and sign with the admin wallet.
22
+ */
23
+ export declare class AdminClient {
24
+ readonly program: Program;
25
+ readonly cubicPoolProgramId: PublicKey;
26
+ readonly treasuryPda: PublicKey;
27
+ constructor(opts: {
28
+ config: CubeConfig;
29
+ provider: anchor.AnchorProvider;
30
+ });
31
+ /**
32
+ * Idempotent treasury init. Returns true if a new treasury was created.
33
+ * Caller becomes the initial `treasury.admin`.
34
+ */
35
+ initializeTreasuryIfMissing(connection: Connection, admin: PublicKey): Promise<boolean>;
36
+ initiateAdminTransferIx(admin: PublicKey, newAdmin: PublicKey): any;
37
+ acceptAdminTransferIx(newAdmin: PublicKey): any;
38
+ cancelAdminTransferIx(admin: PublicKey): any;
39
+ registerTokenIx(admin: PublicKey, mint: PublicKey, tokenProgram?: anchor.web3.PublicKey): any;
40
+ withdrawIx(admin: PublicKey, mint: PublicKey, recipient: PublicKey, amount: BN, tokenProgram?: anchor.web3.PublicKey): any;
41
+ poolInitializeConfigIx(admin: PublicKey, config: PublicKey, defaultProtocolFeeRate: number): any;
42
+ setProtocolFeeRateIx(admin: PublicKey, config: PublicKey, pool: PublicKey, protocolFeeRate: number): any;
43
+ setPoolEnabledIx(admin: PublicKey, config: PublicKey, pool: PublicKey, enabled: boolean): any;
44
+ setSwapsEnabledIx(admin: PublicKey, config: PublicKey, pool: PublicKey, enabled: boolean): any;
45
+ setBannedExtensionsIx(admin: PublicKey, config: PublicKey, banned: BN): any;
46
+ /**
47
+ * Collects protocol fees from a pool to the supplied recipient ATAs.
48
+ *
49
+ * `vaults` / `recipients` / `tokenPrograms` must be aligned with
50
+ * `pool.token_mints` (one entry per token in pool order).
51
+ */
52
+ collectProtocolFeesIx(admin: PublicKey, config: PublicKey, pool: PublicKey, vaults: PublicKey[], recipients: PublicKey[], tokenPrograms?: PublicKey[]): any;
53
+ /**
54
+ * Emergency drain. Pool must be paused first. `amounts.length` must equal
55
+ * the pool's token_count; pass 0 to skip a token.
56
+ */
57
+ debugWithdrawLiquidityIx(admin: PublicKey, config: PublicKey, pool: PublicKey, amounts: BN[], vaults: PublicKey[], recipients: PublicKey[], tokenPrograms?: PublicKey[]): any;
58
+ private poolAdminAccounts;
59
+ private tripleRemaining;
60
+ }
61
+ //# sourceMappingURL=AdminClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminClient.d.ts","sourceRoot":"","sources":["../../src/clients/AdminClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAEL,UAAU,EACV,SAAS,EAEV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,OAAO,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAIvC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;gBAEpB,IAAI,EAAE;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAA;KAAE;IASzE;;;OAGG;IACG,2BAA2B,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB7F,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;IAO7D,qBAAqB,CAAC,QAAQ,EAAE,SAAS;IAOzC,qBAAqB,CAAC,KAAK,EAAE,SAAS;IAStC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,wBAAmB;IAkBlF,UAAU,CACR,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,EAAE,EACV,YAAY,wBAAmB;IAoBjC,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM;IAkB1F,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM;IAOlG,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;IAOvF,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;IAOxF,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE;IAYrE;;;;;OAKG;IACH,qBAAqB,CACnB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,SAAS,EAAE,EACnB,UAAU,EAAE,SAAS,EAAE,EACvB,aAAa,GAAE,SAAS,EAAuC;IAUjE;;;OAGG;IACH,wBAAwB,CACtB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,EAAE,EAAE,EACb,MAAM,EAAE,SAAS,EAAE,EACnB,UAAU,EAAE,SAAS,EAAE,EACvB,aAAa,GAAE,SAAS,EAAuC;IAYjE,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,eAAe;CAgBxB"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdminClient = void 0;
4
+ const anchor_1 = require("@coral-xyz/anchor");
5
+ const web3_js_1 = require("@solana/web3.js");
6
+ const spl_token_1 = require("@solana/spl-token");
7
+ const idl_1 = require("../idl");
8
+ const pda_1 = require("../utils/pda");
9
+ /**
10
+ * AdminClient — wraps `protocol_admin` with treasury-routed admin
11
+ * operations.
12
+ *
13
+ * The cubic_pool program enforces that every admin instruction must be
14
+ * signed by the Treasury PDA (`seeds = [b"treasury"]`, owned by
15
+ * protocol_admin). This client builds the canonical flow:
16
+ *
17
+ * admin wallet
18
+ * → protocol_admin.<wrapper> (treasury.admin == signer)
19
+ * → CPI cubic_pool.<admin_ix> (signer == TREASURY_PDA)
20
+ *
21
+ * Direct calls into cubic_pool admin instructions will fail on-chain.
22
+ *
23
+ * Note: every method returns a `TransactionInstruction`. Compose into a tx
24
+ * with `@solana/web3.js` and sign with the admin wallet.
25
+ */
26
+ class AdminClient {
27
+ constructor(opts) {
28
+ const { config, provider } = opts;
29
+ const idl = JSON.parse(JSON.stringify(idl_1.PROTOCOL_ADMIN_IDL));
30
+ idl.address = config.programs.protocolAdmin.toString();
31
+ this.program = new anchor_1.Program(idl, provider);
32
+ this.cubicPoolProgramId = config.programs.cubicPool;
33
+ [this.treasuryPda] = (0, pda_1.deriveTreasuryPda)(config.programs.protocolAdmin);
34
+ }
35
+ /**
36
+ * Idempotent treasury init. Returns true if a new treasury was created.
37
+ * Caller becomes the initial `treasury.admin`.
38
+ */
39
+ async initializeTreasuryIfMissing(connection, admin) {
40
+ const info = await connection.getAccountInfo(this.treasuryPda);
41
+ if (info)
42
+ return false;
43
+ await this.program.methods
44
+ .initialize(admin)
45
+ .accounts({
46
+ treasury: this.treasuryPda,
47
+ payer: admin,
48
+ systemProgram: web3_js_1.SystemProgram.programId,
49
+ })
50
+ .rpc();
51
+ return true;
52
+ }
53
+ // ── Admin lifecycle ──────────────────────────────────────────────────────
54
+ initiateAdminTransferIx(admin, newAdmin) {
55
+ return this.program.methods
56
+ .initiateAdminTransfer(newAdmin)
57
+ .accounts({ treasury: this.treasuryPda, admin })
58
+ .instruction();
59
+ }
60
+ acceptAdminTransferIx(newAdmin) {
61
+ return this.program.methods
62
+ .acceptAdminTransfer()
63
+ .accounts({ treasury: this.treasuryPda, newAdmin })
64
+ .instruction();
65
+ }
66
+ cancelAdminTransferIx(admin) {
67
+ return this.program.methods
68
+ .cancelAdminTransfer()
69
+ .accounts({ treasury: this.treasuryPda, admin })
70
+ .instruction();
71
+ }
72
+ // ── Treasury vault management ────────────────────────────────────────────
73
+ registerTokenIx(admin, mint, tokenProgram = spl_token_1.TOKEN_PROGRAM_ID) {
74
+ const [vault] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("vault"), mint.toBuffer()], this.program.programId);
75
+ return this.program.methods
76
+ .registerToken()
77
+ .accounts({
78
+ treasury: this.treasuryPda,
79
+ mint,
80
+ vault,
81
+ admin,
82
+ tokenProgram,
83
+ systemProgram: web3_js_1.SystemProgram.programId,
84
+ })
85
+ .instruction();
86
+ }
87
+ withdrawIx(admin, mint, recipient, amount, tokenProgram = spl_token_1.TOKEN_PROGRAM_ID) {
88
+ const [vault] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from("vault"), mint.toBuffer()], this.program.programId);
89
+ return this.program.methods
90
+ .withdraw(amount)
91
+ .accounts({
92
+ treasury: this.treasuryPda,
93
+ vault,
94
+ recipient,
95
+ admin,
96
+ tokenProgram,
97
+ })
98
+ .instruction();
99
+ }
100
+ // ── Pool config / pool admin (treasury-routed) ───────────────────────────
101
+ poolInitializeConfigIx(admin, config, defaultProtocolFeeRate) {
102
+ return this.program.methods
103
+ .poolInitializeConfig(defaultProtocolFeeRate)
104
+ .accounts({
105
+ treasury: this.treasuryPda,
106
+ admin,
107
+ config,
108
+ cubicPoolProgram: this.cubicPoolProgramId,
109
+ systemProgram: web3_js_1.SystemProgram.programId,
110
+ })
111
+ .instruction();
112
+ }
113
+ // setSwapFeeRate has been removed from the protocol-admin wrapper —
114
+ // it's a level-1 (pool-admin) instruction, signed directly by the
115
+ // wallet stored in `pool.pool_admin`. Use `CubicPoolClient` for that
116
+ // call instead.
117
+ setProtocolFeeRateIx(admin, config, pool, protocolFeeRate) {
118
+ return this.program.methods
119
+ .poolSetProtocolFeeRate(protocolFeeRate)
120
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
121
+ .instruction();
122
+ }
123
+ setPoolEnabledIx(admin, config, pool, enabled) {
124
+ return this.program.methods
125
+ .poolSetPoolEnabled(enabled)
126
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
127
+ .instruction();
128
+ }
129
+ setSwapsEnabledIx(admin, config, pool, enabled) {
130
+ return this.program.methods
131
+ .poolSetSwapsEnabled(enabled)
132
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
133
+ .instruction();
134
+ }
135
+ setBannedExtensionsIx(admin, config, banned) {
136
+ return this.program.methods
137
+ .poolSetBannedExtensions(banned)
138
+ .accounts({
139
+ treasury: this.treasuryPda,
140
+ admin,
141
+ config,
142
+ cubicPoolProgram: this.cubicPoolProgramId,
143
+ })
144
+ .instruction();
145
+ }
146
+ /**
147
+ * Collects protocol fees from a pool to the supplied recipient ATAs.
148
+ *
149
+ * `vaults` / `recipients` / `tokenPrograms` must be aligned with
150
+ * `pool.token_mints` (one entry per token in pool order).
151
+ */
152
+ collectProtocolFeesIx(admin, config, pool, vaults, recipients, tokenPrograms = vaults.map(() => spl_token_1.TOKEN_PROGRAM_ID)) {
153
+ const remaining = this.tripleRemaining(vaults, recipients, tokenPrograms);
154
+ return this.program.methods
155
+ .poolCollectProtocolFees()
156
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
157
+ .remainingAccounts(remaining)
158
+ .instruction();
159
+ }
160
+ /**
161
+ * Emergency drain. Pool must be paused first. `amounts.length` must equal
162
+ * the pool's token_count; pass 0 to skip a token.
163
+ */
164
+ debugWithdrawLiquidityIx(admin, config, pool, amounts, vaults, recipients, tokenPrograms = vaults.map(() => spl_token_1.TOKEN_PROGRAM_ID)) {
165
+ const remaining = this.tripleRemaining(vaults, recipients, tokenPrograms);
166
+ return this.program.methods
167
+ .poolDebugWithdrawLiquidity(amounts)
168
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
169
+ .remainingAccounts(remaining)
170
+ .instruction();
171
+ }
172
+ // ── Internals ────────────────────────────────────────────────────────────
173
+ poolAdminAccounts(admin, config, pool) {
174
+ return {
175
+ treasury: this.treasuryPda,
176
+ admin,
177
+ config,
178
+ pool,
179
+ cubicPoolProgram: this.cubicPoolProgramId,
180
+ };
181
+ }
182
+ tripleRemaining(vaults, recipients, tokenPrograms) {
183
+ if (vaults.length !== recipients.length || vaults.length !== tokenPrograms.length) {
184
+ throw new Error("AdminClient: vaults/recipients/tokenPrograms must be the same length");
185
+ }
186
+ const acc = [];
187
+ for (let i = 0; i < vaults.length; i++) {
188
+ acc.push({ pubkey: vaults[i], isSigner: false, isWritable: true });
189
+ acc.push({ pubkey: recipients[i], isSigner: false, isWritable: true });
190
+ acc.push({ pubkey: tokenPrograms[i], isSigner: false, isWritable: false });
191
+ }
192
+ return acc;
193
+ }
194
+ }
195
+ exports.AdminClient = AdminClient;
196
+ //# sourceMappingURL=AdminClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminClient.js","sourceRoot":"","sources":["../../src/clients/AdminClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { SdkResult } from "../types/result";
2
+ import { PoolSummary } from "../types/pool";
3
+ export interface CubeBackendClientParams {
4
+ apiEndpoint: string;
5
+ apiKey?: string;
6
+ defaultHeaders?: Record<string, string>;
7
+ }
8
+ export type StatsKind = "tvl" | "volume" | "swap_count" | "avg_swap" | "median_swap" | "fees_lp" | "fees_protocol" | "users_total" | "dau" | "mau" | "deposits" | "removals";
9
+ export type StatsWindow = "1d" | "7d" | "30d" | "all";
10
+ export interface StatsSeriesPoint {
11
+ t: number;
12
+ v: number;
13
+ }
14
+ export interface StatsSeries {
15
+ points: StatsSeriesPoint[];
16
+ }
17
+ export interface PriceMap {
18
+ [mint: string]: number;
19
+ }
20
+ /**
21
+ * REST wrapper around the Cube backend. Every method is a SdkResult; no
22
+ * exceptions escape. If a request fails, the result carries a
23
+ * human-readable error plus the original cause.
24
+ */
25
+ export declare class CubeBackendClient {
26
+ private readonly endpoint;
27
+ private readonly headers;
28
+ constructor(params: CubeBackendClientParams);
29
+ listPools(): Promise<SdkResult<PoolSummary[]>>;
30
+ getPool(addr: string): Promise<SdkResult<PoolSummary>>;
31
+ /**
32
+ * Raw pool-list response in the same envelope the backend returns
33
+ * (`{ data, hasMore, totalCount }`). Kept so the frontend's React
34
+ * Query hooks can map directly.
35
+ */
36
+ listPoolsRaw(limit: number, offset: number): Promise<SdkResult<{
37
+ data: unknown[];
38
+ hasMore: boolean;
39
+ totalCount: number;
40
+ }>>;
41
+ getPoolRaw(addr: string): Promise<SdkResult<unknown>>;
42
+ createPool<T>(body: unknown): Promise<SdkResult<T>>;
43
+ getPoolsByTokenPair<T>(tokenA: string, tokenB: string): Promise<SdkResult<T>>;
44
+ getPlatformStats<T>(): Promise<SdkResult<T>>;
45
+ getPortfolio<T>(owner: string): Promise<SdkResult<T>>;
46
+ getAllTokens<T>(): Promise<SdkResult<T>>;
47
+ getTopTokens<T>(limit?: number): Promise<SdkResult<T>>;
48
+ getPoolTxStats<T>(addr: string): Promise<SdkResult<T>>;
49
+ getTransactions<T>(addr: string, limit?: number, offset?: number): Promise<SdkResult<T>>;
50
+ getSwapRoute<T>(tokenIn: string, tokenOut: string, amountIn: string): Promise<SdkResult<T>>;
51
+ getTokenPrices(mints: string[]): Promise<SdkResult<PriceMap>>;
52
+ getStats(kind: StatsKind, window?: StatsWindow, poolAddr?: string, unit?: "usd" | "token"): Promise<SdkResult<StatsSeries>>;
53
+ /** Generic GET with retry. Callers that need it for other endpoints. */
54
+ get<T>(path: string): Promise<SdkResult<T>>;
55
+ post<T>(path: string, body: unknown): Promise<SdkResult<T>>;
56
+ private request;
57
+ /**
58
+ * Fetch a response envelope of the form `{ data: T, ... }` and unwrap
59
+ * the `.data` field. The existing Cube backend wraps most endpoints
60
+ * this way.
61
+ */
62
+ private getDataField;
63
+ private postDataField;
64
+ /** Fetch the full envelope (for endpoints that return meta alongside data). */
65
+ private getEnvelope;
66
+ }
67
+ //# sourceMappingURL=CubeBackendClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CubeBackendClient.d.ts","sourceRoot":"","sources":["../../src/clients/CubeBackendClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CubeBackendClient = void 0;
4
+ const result_1 = require("../types/result");
5
+ const retry_1 = require("../utils/retry");
6
+ /**
7
+ * REST wrapper around the Cube backend. Every method is a SdkResult; no
8
+ * exceptions escape. If a request fails, the result carries a
9
+ * human-readable error plus the original cause.
10
+ */
11
+ class CubeBackendClient {
12
+ constructor(params) {
13
+ this.endpoint = params.apiEndpoint.replace(/\/$/, "");
14
+ this.headers = {
15
+ "Content-Type": "application/json",
16
+ ...(params.apiKey ? { Authorization: `Bearer ${params.apiKey}` } : {}),
17
+ ...(params.defaultHeaders ?? {}),
18
+ };
19
+ }
20
+ listPools() {
21
+ return this.get("/api/pools");
22
+ }
23
+ getPool(addr) {
24
+ return this.get(`/api/pools/${addr}`);
25
+ }
26
+ /**
27
+ * Raw pool-list response in the same envelope the backend returns
28
+ * (`{ data, hasMore, totalCount }`). Kept so the frontend's React
29
+ * Query hooks can map directly.
30
+ */
31
+ listPoolsRaw(limit, offset) {
32
+ const qs = new URLSearchParams({ limit: String(limit), offset: String(offset) });
33
+ return this.getEnvelope(`/api/pools?${qs.toString()}`);
34
+ }
35
+ getPoolRaw(addr) {
36
+ return this.getDataField(`/api/pools/${addr}`);
37
+ }
38
+ createPool(body) {
39
+ return this.postDataField("/api/pools", body);
40
+ }
41
+ getPoolsByTokenPair(tokenA, tokenB) {
42
+ const qs = new URLSearchParams({ tokenA, tokenB });
43
+ return this.getDataField(`/api/pools/by-pair?${qs.toString()}`);
44
+ }
45
+ getPlatformStats() {
46
+ return this.getDataField("/api/pools/stats");
47
+ }
48
+ getPortfolio(owner) {
49
+ return this.getDataField(`/api/pools/portfolio?owner=${encodeURIComponent(owner)}`);
50
+ }
51
+ getAllTokens() {
52
+ return this.getDataField("/api/pools/tokens");
53
+ }
54
+ getTopTokens(limit = 20) {
55
+ return this.getDataField(`/api/pools/top-tokens?limit=${limit}`);
56
+ }
57
+ getPoolTxStats(addr) {
58
+ return this.getDataField(`/api/pools/${addr}/tx-stats`);
59
+ }
60
+ getTransactions(addr, limit = 20, offset = 0) {
61
+ const qs = new URLSearchParams({ limit: String(limit), offset: String(offset) });
62
+ return this.getDataField(`/api/pools/${addr}/transactions?${qs.toString()}`);
63
+ }
64
+ getSwapRoute(tokenIn, tokenOut, amountIn) {
65
+ const qs = new URLSearchParams({ tokenIn, tokenOut, amountIn });
66
+ return this.getDataField(`/api/swap/route?${qs.toString()}`);
67
+ }
68
+ getTokenPrices(mints) {
69
+ const qs = new URLSearchParams({ mints: mints.join(",") });
70
+ return this.get(`/api/prices?${qs.toString()}`);
71
+ }
72
+ getStats(kind, window = "7d", poolAddr, unit = "usd") {
73
+ const qs = new URLSearchParams({ window, unit });
74
+ if (poolAddr)
75
+ qs.set("pool", poolAddr);
76
+ return this.get(`/api/stats/${kind}?${qs.toString()}`);
77
+ }
78
+ /** Generic GET with retry. Callers that need it for other endpoints. */
79
+ get(path) {
80
+ return this.request("GET", path);
81
+ }
82
+ post(path, body) {
83
+ return this.request("POST", path, body);
84
+ }
85
+ async request(method, path, body) {
86
+ const url = `${this.endpoint}${path}`;
87
+ const fetchOpts = {
88
+ method,
89
+ headers: this.headers,
90
+ body: body === undefined ? undefined : JSON.stringify(body),
91
+ };
92
+ const raw = await (0, retry_1.safeCall)(async () => {
93
+ const res = await fetch(url, fetchOpts);
94
+ if (!res.ok) {
95
+ throw new Error(`${method} ${path} → HTTP ${res.status} ${res.statusText}`);
96
+ }
97
+ return (await res.json());
98
+ });
99
+ if (!raw.ok)
100
+ return raw;
101
+ return (0, result_1.ok)(raw.data);
102
+ }
103
+ /**
104
+ * Fetch a response envelope of the form `{ data: T, ... }` and unwrap
105
+ * the `.data` field. The existing Cube backend wraps most endpoints
106
+ * this way.
107
+ */
108
+ async getDataField(path) {
109
+ const res = await this.get(path);
110
+ if (!res.ok)
111
+ return res;
112
+ return (0, result_1.ok)(res.data?.data);
113
+ }
114
+ async postDataField(path, body) {
115
+ const res = await this.post(path, body);
116
+ if (!res.ok)
117
+ return res;
118
+ return (0, result_1.ok)(res.data?.data);
119
+ }
120
+ /** Fetch the full envelope (for endpoints that return meta alongside data). */
121
+ async getEnvelope(path) {
122
+ return this.get(path);
123
+ }
124
+ }
125
+ exports.CubeBackendClient = CubeBackendClient;
126
+ //# sourceMappingURL=CubeBackendClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CubeBackendClient.js","sourceRoot":"","sources":["../../src/clients/CubeBackendClient.ts"],"names":[],"mappings":"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"}