@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.
- package/LICENSE +21 -0
- package/README.md +110 -0
- package/dist/clients/AdminClient.d.ts +61 -0
- package/dist/clients/AdminClient.d.ts.map +1 -0
- package/dist/clients/AdminClient.js +196 -0
- package/dist/clients/AdminClient.js.map +1 -0
- package/dist/clients/CubeBackendClient.d.ts +67 -0
- package/dist/clients/CubeBackendClient.d.ts.map +1 -0
- package/dist/clients/CubeBackendClient.js +126 -0
- package/dist/clients/CubeBackendClient.js.map +1 -0
- package/dist/clients/CubicPoolClient.d.ts +73 -0
- package/dist/clients/CubicPoolClient.d.ts.map +1 -0
- package/dist/clients/CubicPoolClient.js +425 -0
- package/dist/clients/CubicPoolClient.js.map +1 -0
- package/dist/clients/PoolFactoryClient.d.ts +45 -0
- package/dist/clients/PoolFactoryClient.d.ts.map +1 -0
- package/dist/clients/PoolFactoryClient.js +83 -0
- package/dist/clients/PoolFactoryClient.js.map +1 -0
- package/dist/clients/RpcClient.d.ts +28 -0
- package/dist/clients/RpcClient.d.ts.map +1 -0
- package/dist/clients/RpcClient.js +58 -0
- package/dist/clients/RpcClient.js.map +1 -0
- package/dist/clients/SingleTokenDepositClient.d.ts +45 -0
- package/dist/clients/SingleTokenDepositClient.d.ts.map +1 -0
- package/dist/clients/SingleTokenDepositClient.js +63 -0
- package/dist/clients/SingleTokenDepositClient.js.map +1 -0
- package/dist/clients/index.d.ts +8 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +24 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/tx-builders.d.ts +32 -0
- package/dist/clients/tx-builders.d.ts.map +1 -0
- package/dist/clients/tx-builders.js +398 -0
- package/dist/clients/tx-builders.js.map +1 -0
- package/dist/config/index.d.ts +60 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +59 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/networks.d.ts +10 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +31 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/config/tokens.d.ts +19 -0
- package/dist/config/tokens.d.ts.map +1 -0
- package/dist/config/tokens.js +43 -0
- package/dist/config/tokens.js.map +1 -0
- package/dist/idl/cubic_pool.json +2497 -0
- package/dist/idl/index.d.ts +975 -0
- package/dist/idl/index.d.ts.map +1 -0
- package/dist/idl/index.js +18 -0
- package/dist/idl/index.js.map +1 -0
- package/dist/idl/protocol_admin.json +1816 -0
- package/dist/idl/single_token_liquidity.json +745 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +136 -0
- package/dist/index.js.map +1 -0
- package/dist/math/cubicMath.d.ts +40 -0
- package/dist/math/cubicMath.d.ts.map +1 -0
- package/dist/math/cubicMath.js +75 -0
- package/dist/math/cubicMath.js.map +1 -0
- package/dist/math/fixedPoint.d.ts +14 -0
- package/dist/math/fixedPoint.d.ts.map +1 -0
- package/dist/math/fixedPoint.js +46 -0
- package/dist/math/fixedPoint.js.map +1 -0
- package/dist/math/index.d.ts +7 -0
- package/dist/math/index.d.ts.map +1 -0
- package/dist/math/index.js +23 -0
- package/dist/math/index.js.map +1 -0
- package/dist/math/logExp.d.ts +15 -0
- package/dist/math/logExp.d.ts.map +1 -0
- package/dist/math/logExp.js +91 -0
- package/dist/math/logExp.js.map +1 -0
- package/dist/math/singleToken.d.ts +53 -0
- package/dist/math/singleToken.d.ts.map +1 -0
- package/dist/math/singleToken.js +185 -0
- package/dist/math/singleToken.js.map +1 -0
- package/dist/math/slippage.d.ts +24 -0
- package/dist/math/slippage.d.ts.map +1 -0
- package/dist/math/slippage.js +54 -0
- package/dist/math/slippage.js.map +1 -0
- package/dist/math/weightedMath.d.ts +18 -0
- package/dist/math/weightedMath.d.ts.map +1 -0
- package/dist/math/weightedMath.js +45 -0
- package/dist/math/weightedMath.js.map +1 -0
- package/dist/parsers/borsh.d.ts +24 -0
- package/dist/parsers/borsh.d.ts.map +1 -0
- package/dist/parsers/borsh.js +80 -0
- package/dist/parsers/borsh.js.map +1 -0
- package/dist/parsers/events.d.ts +3 -0
- package/dist/parsers/events.d.ts.map +1 -0
- package/dist/parsers/events.js +172 -0
- package/dist/parsers/events.js.map +1 -0
- package/dist/parsers/index.d.ts +5 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +21 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/mintAccount.d.ts +22 -0
- package/dist/parsers/mintAccount.d.ts.map +1 -0
- package/dist/parsers/mintAccount.js +22 -0
- package/dist/parsers/mintAccount.js.map +1 -0
- package/dist/parsers/poolAccount.d.ts +32 -0
- package/dist/parsers/poolAccount.d.ts.map +1 -0
- package/dist/parsers/poolAccount.js +88 -0
- package/dist/parsers/poolAccount.js.map +1 -0
- package/dist/types/events.d.ts +82 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +3 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pool.d.ts +66 -0
- package/dist/types/pool.d.ts.map +1 -0
- package/dist/types/pool.js +3 -0
- package/dist/types/pool.js.map +1 -0
- package/dist/types/result.d.ts +23 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +11 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/tx.d.ts +80 -0
- package/dist/types/tx.d.ts.map +1 -0
- package/dist/types/tx.js +3 -0
- package/dist/types/tx.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +83 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pda.d.ts +8 -0
- package/dist/utils/pda.d.ts.map +1 -0
- package/dist/utils/pda.js +27 -0
- package/dist/utils/pda.js.map +1 -0
- package/dist/utils/retry.d.ts +22 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +62 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +54 -0
- package/src/clients/AdminClient.ts +254 -0
- package/src/clients/CubeBackendClient.ts +193 -0
- package/src/clients/CubicPoolClient.ts +492 -0
- package/src/clients/PoolFactoryClient.ts +102 -0
- package/src/clients/RpcClient.ts +78 -0
- package/src/clients/SingleTokenDepositClient.ts +91 -0
- package/src/clients/index.ts +7 -0
- package/src/clients/tx-builders.ts +538 -0
- package/src/config/index.ts +82 -0
- package/src/config/networks.ts +49 -0
- package/src/config/tokens.ts +52 -0
- package/src/idl/cubic_pool.json +2497 -0
- package/src/idl/index.ts +13 -0
- package/src/idl/protocol_admin.json +1816 -0
- package/src/idl/single_token_liquidity.json +745 -0
- package/src/index.ts +154 -0
- package/src/math/cubicMath.ts +89 -0
- package/src/math/fixedPoint.ts +39 -0
- package/src/math/index.ts +6 -0
- package/src/math/logExp.ts +82 -0
- package/src/math/singleToken.ts +250 -0
- package/src/math/slippage.ts +49 -0
- package/src/math/weightedMath.ts +48 -0
- package/src/parsers/borsh.ts +80 -0
- package/src/parsers/events.ts +172 -0
- package/src/parsers/index.ts +4 -0
- package/src/parsers/mintAccount.ts +37 -0
- package/src/parsers/poolAccount.ts +113 -0
- package/src/types/events.ts +100 -0
- package/src/types/index.ts +4 -0
- package/src/types/pool.ts +64 -0
- package/src/types/result.ts +45 -0
- package/src/types/tx.ts +87 -0
- package/src/utils/errors.ts +78 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/pda.ts +58 -0
- 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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"}
|