@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
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toSdkError = toSdkError;
4
+ const CONTRACT_ERROR_MAP = {
5
+ // cubic-pool error codes (see programs/cubic-pool/src/errors.rs)
6
+ 6000: { code: "invalid_input", message: "Invalid token count" },
7
+ 6001: { code: "invalid_input", message: "Invalid token index" },
8
+ 6002: { code: "invalid_input", message: "Invalid weights — must sum to 10000" },
9
+ 6003: { code: "invalid_input", message: "Invalid virtual balances" },
10
+ 6004: { code: "insufficient_funds", message: "Insufficient pool liquidity" },
11
+ 6005: { code: "slippage_exceeded", message: "Slippage tolerance exceeded" },
12
+ 6006: { code: "invalid_input", message: "Invalid token amounts" },
13
+ 6007: { code: "slippage_exceeded", message: "BPT received is below the minimum requested" },
14
+ 6009: { code: "invalid_input", message: "Swap fee rate exceeds the allowed maximum" },
15
+ 6011: { code: "math_overflow", message: "Math overflow" },
16
+ 6012: { code: "math_overflow", message: "Math underflow" },
17
+ 6022: { code: "pool_disabled", message: "Pool is disabled" },
18
+ 6023: { code: "swaps_disabled", message: "Swaps are disabled on this pool" },
19
+ 6025: { code: "invalid_input", message: "Zero amount" },
20
+ };
21
+ /**
22
+ * Convert a raw error (possibly from Anchor, web3.js, or fetch) into a
23
+ * cleanly-typed SdkError. Used by safeCall wrappers so callers always
24
+ * get structured errors, never exceptions.
25
+ */
26
+ function toSdkError(cause) {
27
+ // Anchor-encoded program errors
28
+ const msg = extractMessage(cause);
29
+ const code = extractErrorCode(msg);
30
+ if (code !== null && CONTRACT_ERROR_MAP[code]) {
31
+ return {
32
+ code: CONTRACT_ERROR_MAP[code].code,
33
+ humanMessage: CONTRACT_ERROR_MAP[code].message,
34
+ cause,
35
+ };
36
+ }
37
+ // Common network strings
38
+ if (/timed? ?out|ETIMEDOUT/i.test(msg)) {
39
+ return { code: "rpc_timeout", humanMessage: "RPC timed out", cause };
40
+ }
41
+ if (/429|rate limit/i.test(msg)) {
42
+ return { code: "rpc_rate_limited", humanMessage: "RPC rate-limited — slow down", cause };
43
+ }
44
+ if (/fetch failed|ECONNREFUSED|ENOTFOUND/i.test(msg)) {
45
+ return { code: "rpc_unavailable", humanMessage: "RPC endpoint unreachable", cause };
46
+ }
47
+ if (/Account does not exist|account not found/i.test(msg)) {
48
+ return { code: "account_not_found", humanMessage: "Account does not exist on-chain", cause };
49
+ }
50
+ if (/insufficient funds/i.test(msg)) {
51
+ return { code: "insufficient_funds", humanMessage: "Insufficient funds for this operation", cause };
52
+ }
53
+ return { code: "unknown", humanMessage: msg || "Unknown error", cause };
54
+ }
55
+ function extractMessage(e) {
56
+ if (!e)
57
+ return "";
58
+ if (typeof e === "string")
59
+ return e;
60
+ if (e instanceof Error)
61
+ return e.message;
62
+ if (typeof e === "object" && e !== null && "message" in e) {
63
+ return String(e.message ?? "");
64
+ }
65
+ try {
66
+ return JSON.stringify(e);
67
+ }
68
+ catch {
69
+ return String(e);
70
+ }
71
+ }
72
+ function extractErrorCode(msg) {
73
+ // Anchor error format: "custom program error: 0x1774"
74
+ const hex = msg.match(/custom program error: 0x([0-9a-fA-F]+)/);
75
+ if (hex)
76
+ return parseInt(hex[1], 16);
77
+ // Anchor SDK format: "Error Number: 6007"
78
+ const dec = msg.match(/Error Number:\s*(\d+)/);
79
+ if (dec)
80
+ return parseInt(dec[1], 10);
81
+ return null;
82
+ }
83
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./errors";
2
+ export * from "./retry";
3
+ export * from "./pda";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./errors"), exports);
18
+ __exportStar(require("./retry"), exports);
19
+ __exportStar(require("./pda"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,0CAAwB;AACxB,wCAAsB"}
@@ -0,0 +1,8 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import BN from "bn.js";
3
+ export declare function derivePoolPda(programId: PublicKey, config: PublicKey, poolId: BN): [PublicKey, number];
4
+ export declare function deriveBptMint(cubicPoolProgramId: PublicKey, pool: PublicKey): [PublicKey, number];
5
+ export declare function deriveHelperPda(stldProgramId: PublicKey, pool: PublicKey): [PublicKey, number];
6
+ export declare function deriveTreasuryPda(protocolFeesProgramId: PublicKey): [PublicKey, number];
7
+ export declare function deriveAta(owner: PublicKey, mint: PublicKey, tokenProgram: PublicKey): PublicKey;
8
+ //# sourceMappingURL=pda.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pda.d.ts","sourceRoot":"","sources":["../../src/utils/pda.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,OAAO,CAAC;AASvB,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,EAAE,GACT,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wBAAgB,aAAa,CAC3B,kBAAkB,EAAE,SAAS,EAC7B,IAAI,EAAE,SAAS,GACd,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wBAAgB,eAAe,CAC7B,aAAa,EAAE,SAAS,EACxB,IAAI,EAAE,SAAS,GACd,CAAC,SAAS,EAAE,MAAM,CAAC,CAKrB;AAED,wBAAgB,iBAAiB,CAC/B,qBAAqB,EAAE,SAAS,GAC/B,CAAC,SAAS,EAAE,MAAM,CAAC,CAErB;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,SAAS,GACtB,SAAS,CAMX"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.derivePoolPda = derivePoolPda;
4
+ exports.deriveBptMint = deriveBptMint;
5
+ exports.deriveHelperPda = deriveHelperPda;
6
+ exports.deriveTreasuryPda = deriveTreasuryPda;
7
+ exports.deriveAta = deriveAta;
8
+ const web3_js_1 = require("@solana/web3.js");
9
+ const spl_token_1 = require("@solana/spl-token");
10
+ const config_1 = require("../config");
11
+ function derivePoolPda(programId, config, poolId) {
12
+ return web3_js_1.PublicKey.findProgramAddressSync([config_1.CUBIC_POOL_SEED, config.toBuffer(), poolId.toArrayLike(Buffer, "le", 8)], programId);
13
+ }
14
+ function deriveBptMint(cubicPoolProgramId, pool) {
15
+ return web3_js_1.PublicKey.findProgramAddressSync([config_1.BPT_MINT_SEED, pool.toBuffer()], cubicPoolProgramId);
16
+ }
17
+ function deriveHelperPda(stldProgramId, pool) {
18
+ return web3_js_1.PublicKey.findProgramAddressSync([config_1.STLD_HELPER_SEED, pool.toBuffer()], stldProgramId);
19
+ }
20
+ function deriveTreasuryPda(protocolFeesProgramId) {
21
+ return web3_js_1.PublicKey.findProgramAddressSync([config_1.TREASURY_SEED], protocolFeesProgramId);
22
+ }
23
+ function deriveAta(owner, mint, tokenProgram) {
24
+ const [ata] = web3_js_1.PublicKey.findProgramAddressSync([owner.toBuffer(), tokenProgram.toBuffer(), mint.toBuffer()], spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID);
25
+ return ata;
26
+ }
27
+ //# sourceMappingURL=pda.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pda.js","sourceRoot":"","sources":["../../src/utils/pda.ts"],"names":[],"mappings":";;AAUA,sCASC;AAED,sCAQC;AAED,0CAQC;AAED,8CAIC;AAED,8BAUC;AAzDD,6CAA4C;AAE5C,iDAAgE;AAChE,sCAKmB;AAEnB,SAAgB,aAAa,CAC3B,SAAoB,EACpB,MAAiB,EACjB,MAAU;IAEV,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,wBAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EACzE,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAC3B,kBAA6B,EAC7B,IAAe;IAEf,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,sBAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAChC,kBAAkB,CACnB,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAC7B,aAAwB,EACxB,IAAe;IAEf,OAAO,mBAAS,CAAC,sBAAsB,CACrC,CAAC,yBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EACnC,aAAa,CACd,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAC/B,qBAAgC;IAEhC,OAAO,mBAAS,CAAC,sBAAsB,CAAC,CAAC,sBAAa,CAAC,EAAE,qBAAqB,CAAC,CAAC;AAClF,CAAC;AAED,SAAgB,SAAS,CACvB,KAAgB,EAChB,IAAe,EACf,YAAuB;IAEvB,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAS,CAAC,sBAAsB,CAC5C,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAC5D,uCAA2B,CAC5B,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { SdkResult } from "../types/result";
2
+ export interface RetryOptions {
3
+ /** Number of attempts total (1 = no retry). */
4
+ attempts?: number;
5
+ /** Per-attempt timeout (ms). */
6
+ timeoutMs?: number;
7
+ /** Backoff schedule (ms) between attempts. */
8
+ backoffMs?: number[];
9
+ /** Additional predicate: return `false` to stop retrying early. */
10
+ shouldRetry?: (error: unknown) => boolean;
11
+ }
12
+ /**
13
+ * Retry-wrapped helper. Returns a SdkResult<T>. Never throws. Use for any
14
+ * I/O: RPC calls, backend fetches, CPI simulations.
15
+ *
16
+ * ```ts
17
+ * const res = await safeCall(() => connection.getAccountInfo(pk), { attempts: 3 });
18
+ * if (!res.ok) showToast(res.error.humanMessage);
19
+ * ```
20
+ */
21
+ export declare function safeCall<T>(operation: () => Promise<T>, opts?: RetryOptions): Promise<SdkResult<T>>;
22
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAW,MAAM,iBAAiB,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAID;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAyBvB"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeCall = safeCall;
4
+ const result_1 = require("../types/result");
5
+ const errors_1 = require("./errors");
6
+ const DEFAULT_BACKOFF_MS = [200, 500, 1500];
7
+ /**
8
+ * Retry-wrapped helper. Returns a SdkResult<T>. Never throws. Use for any
9
+ * I/O: RPC calls, backend fetches, CPI simulations.
10
+ *
11
+ * ```ts
12
+ * const res = await safeCall(() => connection.getAccountInfo(pk), { attempts: 3 });
13
+ * if (!res.ok) showToast(res.error.humanMessage);
14
+ * ```
15
+ */
16
+ async function safeCall(operation, opts = {}) {
17
+ const attempts = opts.attempts ?? 3;
18
+ const backoff = opts.backoffMs ?? DEFAULT_BACKOFF_MS;
19
+ const timeoutMs = opts.timeoutMs ?? 15000;
20
+ const shouldRetry = opts.shouldRetry ?? defaultShouldRetry;
21
+ let lastError;
22
+ for (let attempt = 0; attempt < attempts; attempt++) {
23
+ try {
24
+ const raced = await withTimeout(operation(), timeoutMs);
25
+ return (0, result_1.ok)(raced);
26
+ }
27
+ catch (e) {
28
+ lastError = e;
29
+ if (!shouldRetry(e))
30
+ break;
31
+ if (attempt < attempts - 1) {
32
+ const delayIdx = Math.min(attempt, backoff.length - 1);
33
+ await sleep(backoff[delayIdx]);
34
+ }
35
+ }
36
+ }
37
+ return (0, result_1.err)((0, errors_1.toSdkError)(lastError).code, (0, errors_1.toSdkError)(lastError).humanMessage, lastError);
38
+ }
39
+ function defaultShouldRetry(e) {
40
+ const err = (0, errors_1.toSdkError)(e);
41
+ // Retry on transient network / rate-limit errors, stop on structural ones.
42
+ return (err.code === "rpc_timeout" ||
43
+ err.code === "rpc_unavailable" ||
44
+ err.code === "rpc_rate_limited" ||
45
+ err.code === "backend_unavailable");
46
+ }
47
+ function sleep(ms) {
48
+ return new Promise((r) => setTimeout(r, ms));
49
+ }
50
+ function withTimeout(p, ms) {
51
+ return new Promise((resolve, reject) => {
52
+ const h = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);
53
+ p.then((v) => {
54
+ clearTimeout(h);
55
+ resolve(v);
56
+ }, (e) => {
57
+ clearTimeout(h);
58
+ reject(e);
59
+ });
60
+ });
61
+ }
62
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":";;AAyBA,4BA4BC;AArDD,4CAAqD;AACrD,qCAAsC;AAatC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAE5C;;;;;;;;GAQG;AACI,KAAK,UAAU,QAAQ,CAC5B,SAA2B,EAC3B,OAAqB,EAAE;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAM,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAE3D,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;YACxD,OAAO,IAAA,WAAE,EAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,SAAS,GAAG,CAAC,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAAE,MAAM;YAC3B,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAA,YAAG,EACR,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC,IAAI,EAC1B,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC,YAAY,EAClC,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAU;IACpC,MAAM,GAAG,GAAG,IAAA,mBAAU,EAAC,CAAC,CAAC,CAAC;IAC1B,2EAA2E;IAC3E,OAAO,CACL,GAAG,CAAC,IAAI,KAAK,aAAa;QAC1B,GAAG,CAAC,IAAI,KAAK,iBAAiB;QAC9B,GAAG,CAAC,IAAI,KAAK,kBAAkB;QAC/B,GAAG,CAAC,IAAI,KAAK,qBAAqB,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAI,CAAa,EAAE,EAAU;IAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,IAAI,CACJ,CAAC,CAAC,EAAE,EAAE;YACJ,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;YACJ,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@cubee_ee/sdk",
3
+ "version": "0.1.0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "Cube DEX SDK — client library for interacting with the Cubic Pool AMM on Solana",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": [
11
+ "dist",
12
+ "src"
13
+ ],
14
+ "scripts": {
15
+ "env:mainnet": "cp .env.mainnet .env && echo 'Active env: MAINNET'",
16
+ "env:testnet": "cp .env.testnet .env && echo 'Active env: TESTNET'",
17
+ "env:show": "grep -E '^NETWORK=' .env || echo 'no .env'",
18
+ "build": "tsc --declaration",
19
+ "build:mainnet": "npm run env:mainnet && npm run build",
20
+ "build:testnet": "npm run env:testnet && npm run build",
21
+ "test": "jest",
22
+ "lint": "tsc --noEmit"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": ""
27
+ },
28
+ "keywords": [
29
+ "solana",
30
+ "dex",
31
+ "amm",
32
+ "cube",
33
+ "sdk"
34
+ ],
35
+ "license": "MIT",
36
+ "peerDependencies": {
37
+ "@solana/web3.js": "^1.95.0"
38
+ },
39
+ "dependencies": {
40
+ "@coral-xyz/anchor": "^0.32.1",
41
+ "@solana/spl-token": "^0.4.8",
42
+ "@solana/web3.js": "^1.95.0",
43
+ "bn.js": "^5.2.1"
44
+ },
45
+ "devDependencies": {
46
+ "@types/bn.js": "^5.1.5",
47
+ "@types/jest": "^29.5.12",
48
+ "@types/node": "^20.10.4",
49
+ "jest": "^29.7.0",
50
+ "ts-jest": "^29.2.4",
51
+ "ts-node": "^10.9.1",
52
+ "typescript": "^5.3.3"
53
+ }
54
+ }
@@ -0,0 +1,254 @@
1
+ import * as anchor from "@coral-xyz/anchor";
2
+ import { Program } from "@coral-xyz/anchor";
3
+ import {
4
+ AccountMeta,
5
+ Connection,
6
+ PublicKey,
7
+ SystemProgram,
8
+ } from "@solana/web3.js";
9
+ import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
10
+ import BN from "bn.js";
11
+ import { CubeConfig } from "../config";
12
+ import { PROTOCOL_ADMIN_IDL } from "../idl";
13
+ import { deriveTreasuryPda } from "../utils/pda";
14
+
15
+ /**
16
+ * AdminClient — wraps `protocol_admin` with treasury-routed admin
17
+ * operations.
18
+ *
19
+ * The cubic_pool program enforces that every admin instruction must be
20
+ * signed by the Treasury PDA (`seeds = [b"treasury"]`, owned by
21
+ * protocol_admin). This client builds the canonical flow:
22
+ *
23
+ * admin wallet
24
+ * → protocol_admin.<wrapper> (treasury.admin == signer)
25
+ * → CPI cubic_pool.<admin_ix> (signer == TREASURY_PDA)
26
+ *
27
+ * Direct calls into cubic_pool admin instructions will fail on-chain.
28
+ *
29
+ * Note: every method returns a `TransactionInstruction`. Compose into a tx
30
+ * with `@solana/web3.js` and sign with the admin wallet.
31
+ */
32
+ export class AdminClient {
33
+ readonly program: Program;
34
+ readonly cubicPoolProgramId: PublicKey;
35
+ readonly treasuryPda: PublicKey;
36
+
37
+ constructor(opts: { config: CubeConfig; provider: anchor.AnchorProvider }) {
38
+ const { config, provider } = opts;
39
+ const idl = JSON.parse(JSON.stringify(PROTOCOL_ADMIN_IDL)) as any;
40
+ idl.address = config.programs.protocolAdmin.toString();
41
+ this.program = new Program(idl, provider) as any;
42
+ this.cubicPoolProgramId = config.programs.cubicPool;
43
+ [this.treasuryPda] = deriveTreasuryPda(config.programs.protocolAdmin);
44
+ }
45
+
46
+ /**
47
+ * Idempotent treasury init. Returns true if a new treasury was created.
48
+ * Caller becomes the initial `treasury.admin`.
49
+ */
50
+ async initializeTreasuryIfMissing(connection: Connection, admin: PublicKey): Promise<boolean> {
51
+ const info = await connection.getAccountInfo(this.treasuryPda);
52
+ if (info) return false;
53
+ await (this.program.methods as any)
54
+ .initialize(admin)
55
+ .accounts({
56
+ treasury: this.treasuryPda,
57
+ payer: admin,
58
+ systemProgram: SystemProgram.programId,
59
+ })
60
+ .rpc();
61
+ return true;
62
+ }
63
+
64
+ // ── Admin lifecycle ──────────────────────────────────────────────────────
65
+
66
+ initiateAdminTransferIx(admin: PublicKey, newAdmin: PublicKey) {
67
+ return (this.program.methods as any)
68
+ .initiateAdminTransfer(newAdmin)
69
+ .accounts({ treasury: this.treasuryPda, admin })
70
+ .instruction();
71
+ }
72
+
73
+ acceptAdminTransferIx(newAdmin: PublicKey) {
74
+ return (this.program.methods as any)
75
+ .acceptAdminTransfer()
76
+ .accounts({ treasury: this.treasuryPda, newAdmin })
77
+ .instruction();
78
+ }
79
+
80
+ cancelAdminTransferIx(admin: PublicKey) {
81
+ return (this.program.methods as any)
82
+ .cancelAdminTransfer()
83
+ .accounts({ treasury: this.treasuryPda, admin })
84
+ .instruction();
85
+ }
86
+
87
+ // ── Treasury vault management ────────────────────────────────────────────
88
+
89
+ registerTokenIx(admin: PublicKey, mint: PublicKey, tokenProgram = TOKEN_PROGRAM_ID) {
90
+ const [vault] = PublicKey.findProgramAddressSync(
91
+ [Buffer.from("vault"), mint.toBuffer()],
92
+ this.program.programId,
93
+ );
94
+ return (this.program.methods as any)
95
+ .registerToken()
96
+ .accounts({
97
+ treasury: this.treasuryPda,
98
+ mint,
99
+ vault,
100
+ admin,
101
+ tokenProgram,
102
+ systemProgram: SystemProgram.programId,
103
+ })
104
+ .instruction();
105
+ }
106
+
107
+ withdrawIx(
108
+ admin: PublicKey,
109
+ mint: PublicKey,
110
+ recipient: PublicKey,
111
+ amount: BN,
112
+ tokenProgram = TOKEN_PROGRAM_ID,
113
+ ) {
114
+ const [vault] = PublicKey.findProgramAddressSync(
115
+ [Buffer.from("vault"), mint.toBuffer()],
116
+ this.program.programId,
117
+ );
118
+ return (this.program.methods as any)
119
+ .withdraw(amount)
120
+ .accounts({
121
+ treasury: this.treasuryPda,
122
+ vault,
123
+ recipient,
124
+ admin,
125
+ tokenProgram,
126
+ })
127
+ .instruction();
128
+ }
129
+
130
+ // ── Pool config / pool admin (treasury-routed) ───────────────────────────
131
+
132
+ poolInitializeConfigIx(admin: PublicKey, config: PublicKey, defaultProtocolFeeRate: number) {
133
+ return (this.program.methods as any)
134
+ .poolInitializeConfig(defaultProtocolFeeRate)
135
+ .accounts({
136
+ treasury: this.treasuryPda,
137
+ admin,
138
+ config,
139
+ cubicPoolProgram: this.cubicPoolProgramId,
140
+ systemProgram: SystemProgram.programId,
141
+ })
142
+ .instruction();
143
+ }
144
+
145
+ // setSwapFeeRate has been removed from the protocol-admin wrapper —
146
+ // it's a level-1 (pool-admin) instruction, signed directly by the
147
+ // wallet stored in `pool.pool_admin`. Use `CubicPoolClient` for that
148
+ // call instead.
149
+
150
+ setProtocolFeeRateIx(admin: PublicKey, config: PublicKey, pool: PublicKey, protocolFeeRate: number) {
151
+ return (this.program.methods as any)
152
+ .poolSetProtocolFeeRate(protocolFeeRate)
153
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
154
+ .instruction();
155
+ }
156
+
157
+ setPoolEnabledIx(admin: PublicKey, config: PublicKey, pool: PublicKey, enabled: boolean) {
158
+ return (this.program.methods as any)
159
+ .poolSetPoolEnabled(enabled)
160
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
161
+ .instruction();
162
+ }
163
+
164
+ setSwapsEnabledIx(admin: PublicKey, config: PublicKey, pool: PublicKey, enabled: boolean) {
165
+ return (this.program.methods as any)
166
+ .poolSetSwapsEnabled(enabled)
167
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
168
+ .instruction();
169
+ }
170
+
171
+ setBannedExtensionsIx(admin: PublicKey, config: PublicKey, banned: BN) {
172
+ return (this.program.methods as any)
173
+ .poolSetBannedExtensions(banned)
174
+ .accounts({
175
+ treasury: this.treasuryPda,
176
+ admin,
177
+ config,
178
+ cubicPoolProgram: this.cubicPoolProgramId,
179
+ })
180
+ .instruction();
181
+ }
182
+
183
+ /**
184
+ * Collects protocol fees from a pool to the supplied recipient ATAs.
185
+ *
186
+ * `vaults` / `recipients` / `tokenPrograms` must be aligned with
187
+ * `pool.token_mints` (one entry per token in pool order).
188
+ */
189
+ collectProtocolFeesIx(
190
+ admin: PublicKey,
191
+ config: PublicKey,
192
+ pool: PublicKey,
193
+ vaults: PublicKey[],
194
+ recipients: PublicKey[],
195
+ tokenPrograms: PublicKey[] = vaults.map(() => TOKEN_PROGRAM_ID),
196
+ ) {
197
+ const remaining: AccountMeta[] = this.tripleRemaining(vaults, recipients, tokenPrograms);
198
+ return (this.program.methods as any)
199
+ .poolCollectProtocolFees()
200
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
201
+ .remainingAccounts(remaining)
202
+ .instruction();
203
+ }
204
+
205
+ /**
206
+ * Emergency drain. Pool must be paused first. `amounts.length` must equal
207
+ * the pool's token_count; pass 0 to skip a token.
208
+ */
209
+ debugWithdrawLiquidityIx(
210
+ admin: PublicKey,
211
+ config: PublicKey,
212
+ pool: PublicKey,
213
+ amounts: BN[],
214
+ vaults: PublicKey[],
215
+ recipients: PublicKey[],
216
+ tokenPrograms: PublicKey[] = vaults.map(() => TOKEN_PROGRAM_ID),
217
+ ) {
218
+ const remaining: AccountMeta[] = this.tripleRemaining(vaults, recipients, tokenPrograms);
219
+ return (this.program.methods as any)
220
+ .poolDebugWithdrawLiquidity(amounts)
221
+ .accounts({ ...this.poolAdminAccounts(admin, config, pool) })
222
+ .remainingAccounts(remaining)
223
+ .instruction();
224
+ }
225
+
226
+ // ── Internals ────────────────────────────────────────────────────────────
227
+
228
+ private poolAdminAccounts(admin: PublicKey, config: PublicKey, pool: PublicKey) {
229
+ return {
230
+ treasury: this.treasuryPda,
231
+ admin,
232
+ config,
233
+ pool,
234
+ cubicPoolProgram: this.cubicPoolProgramId,
235
+ };
236
+ }
237
+
238
+ private tripleRemaining(
239
+ vaults: PublicKey[],
240
+ recipients: PublicKey[],
241
+ tokenPrograms: PublicKey[],
242
+ ): AccountMeta[] {
243
+ if (vaults.length !== recipients.length || vaults.length !== tokenPrograms.length) {
244
+ throw new Error("AdminClient: vaults/recipients/tokenPrograms must be the same length");
245
+ }
246
+ const acc: AccountMeta[] = [];
247
+ for (let i = 0; i < vaults.length; i++) {
248
+ acc.push({ pubkey: vaults[i], isSigner: false, isWritable: true });
249
+ acc.push({ pubkey: recipients[i], isSigner: false, isWritable: true });
250
+ acc.push({ pubkey: tokenPrograms[i], isSigner: false, isWritable: false });
251
+ }
252
+ return acc;
253
+ }
254
+ }