@waterx/sdk 2.1.0 → 2.3.1-dev.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 (231) hide show
  1. package/README.md +75 -169
  2. package/dist/src/client.d.ts +52 -2
  3. package/dist/src/client.js +76 -6
  4. package/dist/src/config.d.ts +57 -3
  5. package/dist/src/config.js +10 -4
  6. package/dist/src/constants.d.ts +6 -0
  7. package/dist/src/constants.js +6 -0
  8. package/dist/src/core/waterx-account.d.ts +31 -0
  9. package/dist/src/core/waterx-account.js +26 -0
  10. package/dist/src/fetch.d.ts +110 -0
  11. package/dist/src/fetch.js +149 -4
  12. package/dist/src/generated/bucket_v2_framework/account.d.ts +5 -5
  13. package/dist/src/generated/bucket_v2_framework/double.d.ts +77 -77
  14. package/dist/src/generated/bucket_v2_framework/float.d.ts +73 -73
  15. package/dist/src/generated/bucket_v2_framework/liability.d.ts +33 -33
  16. package/dist/src/generated/bucket_v2_framework/linked_table.d.ts +5 -5
  17. package/dist/src/generated/bucket_v2_framework/linked_table.js +2 -2
  18. package/dist/src/generated/bucket_v2_framework/sheet.d.ts +57 -57
  19. package/dist/src/generated/bucket_v2_framework/sheet.js +5 -11
  20. package/dist/src/generated/native_custody/custody_vault.d.ts +46 -32
  21. package/dist/src/generated/native_custody/custody_vault.js +19 -10
  22. package/dist/src/generated/native_custody/deps/bucket_v2_framework/sheet.js +1 -3
  23. package/dist/src/generated/native_custody/events.js +1 -2
  24. package/dist/src/generated/pyth_sponsor_rule/pyth_sponsor_rule.d.ts +7 -7
  25. package/dist/src/generated/pyth_sponsor_rule/pyth_sponsor_rule.js +1 -2
  26. package/dist/src/generated/utils/index.d.ts +7 -7
  27. package/dist/src/generated/utils/index.js +9 -6
  28. package/dist/src/generated/waterx_account/account.d.ts +124 -71
  29. package/dist/src/generated/waterx_account/account.js +64 -29
  30. package/dist/src/generated/waterx_account/deps/bucket_v2_framework/sheet.js +1 -3
  31. package/dist/src/generated/waterx_account/direct_rule.d.ts +5 -5
  32. package/dist/src/generated/waterx_account/events.d.ts +10 -0
  33. package/dist/src/generated/waterx_account/events.js +31 -50
  34. package/dist/src/generated/waterx_constant_rule/constant_rule.d.ts +68 -0
  35. package/dist/src/generated/waterx_constant_rule/constant_rule.js +59 -0
  36. package/dist/src/generated/waterx_constant_rule/deps/bucket_v2_framework/float.d.ts +8 -0
  37. package/dist/src/generated/waterx_constant_rule/deps/bucket_v2_framework/float.js +10 -0
  38. package/dist/src/generated/waterx_constant_rule/deps/sui/vec_map.d.ts +36 -0
  39. package/dist/src/generated/waterx_constant_rule/deps/sui/vec_map.js +27 -0
  40. package/dist/src/generated/waterx_credit/credit_registry.d.ts +9 -9
  41. package/dist/src/generated/waterx_credit/credit_registry.js +1 -2
  42. package/dist/src/generated/waterx_credit/limited_supply.d.ts +17 -17
  43. package/dist/src/generated/waterx_oracle/aggregator.js +1 -2
  44. package/dist/src/generated/waterx_oracle/collector.d.ts +17 -17
  45. package/dist/src/generated/waterx_oracle/collector.js +1 -1
  46. package/dist/src/generated/waterx_oracle/oracle.d.ts +5 -5
  47. package/dist/src/generated/waterx_perp/account_data.d.ts +5 -5
  48. package/dist/src/generated/waterx_perp/account_data.js +1 -2
  49. package/dist/src/generated/waterx_perp/deps/bucket_v2_framework/sheet.js +1 -3
  50. package/dist/src/generated/waterx_perp/events.d.ts +181 -181
  51. package/dist/src/generated/waterx_perp/events.js +87 -173
  52. package/dist/src/generated/waterx_perp/global_config.d.ts +3 -3
  53. package/dist/src/generated/waterx_perp/global_config.js +6 -12
  54. package/dist/src/generated/waterx_perp/keyed_big_vector.d.ts +9 -9
  55. package/dist/src/generated/waterx_perp/keyed_big_vector.js +1 -2
  56. package/dist/src/generated/waterx_perp/lp_pool.d.ts +115 -115
  57. package/dist/src/generated/waterx_perp/lp_pool.js +11 -22
  58. package/dist/src/generated/waterx_perp/market_config.d.ts +61 -43
  59. package/dist/src/generated/waterx_perp/market_config.js +29 -22
  60. package/dist/src/generated/waterx_perp/math.d.ts +7 -7
  61. package/dist/src/generated/waterx_perp/order_book.d.ts +47 -47
  62. package/dist/src/generated/waterx_perp/position.d.ts +99 -99
  63. package/dist/src/generated/waterx_perp/position.js +6 -12
  64. package/dist/src/generated/waterx_perp/request.d.ts +67 -67
  65. package/dist/src/generated/waterx_perp/request.js +2 -3
  66. package/dist/src/generated/waterx_perp/response.d.ts +35 -35
  67. package/dist/src/generated/waterx_perp/response.js +1 -2
  68. package/dist/src/generated/waterx_perp/trading.d.ts +303 -179
  69. package/dist/src/generated/waterx_perp/trading.js +99 -14
  70. package/dist/src/generated/waterx_perp_view/view.js +5 -10
  71. package/dist/src/generated/waterx_pyth_rule/pyth_rule.d.ts +5 -5
  72. package/dist/src/generated/waterx_pyth_rule/pyth_rule.js +1 -2
  73. package/dist/src/generated/waterx_referral/referral_table.d.ts +5 -5
  74. package/dist/src/generated/waterx_referral/referral_table.js +1 -2
  75. package/dist/src/generated/waterx_staking/waterx_staking.d.ts +19 -19
  76. package/dist/src/generated/waterx_staking/waterx_staking.js +10 -20
  77. package/dist/src/generated/waterx_supra_rule/deps/sui/vec_map.d.ts +36 -0
  78. package/dist/src/generated/waterx_supra_rule/deps/sui/vec_map.js +27 -0
  79. package/dist/src/generated/waterx_supra_rule/supra_rule.d.ts +158 -0
  80. package/dist/src/generated/waterx_supra_rule/supra_rule.js +148 -0
  81. package/dist/src/generated/withdrawal_queue/deps/bucket_v2_framework/float.d.ts +8 -0
  82. package/dist/src/generated/withdrawal_queue/deps/bucket_v2_framework/float.js +10 -0
  83. package/dist/src/generated/withdrawal_queue/deps/sui/vec_map.d.ts +36 -0
  84. package/dist/src/generated/withdrawal_queue/deps/sui/vec_map.js +27 -0
  85. package/dist/src/generated/withdrawal_queue/withdrawal_queue.d.ts +444 -4
  86. package/dist/src/generated/withdrawal_queue/withdrawal_queue.js +417 -4
  87. package/dist/src/generated/wormhole_bridge/wormhole_bridge.d.ts +214 -74
  88. package/dist/src/generated/wormhole_bridge/wormhole_bridge.js +158 -29
  89. package/dist/src/index.d.ts +4 -3
  90. package/dist/src/index.js +3 -2
  91. package/dist/src/prediction/account.d.ts +96 -0
  92. package/dist/src/prediction/account.js +230 -0
  93. package/dist/src/prediction/admin.d.ts +47 -0
  94. package/dist/src/prediction/admin.js +105 -0
  95. package/dist/src/prediction/bcs.d.ts +22 -0
  96. package/dist/src/prediction/bcs.js +240 -0
  97. package/dist/src/prediction/client.d.ts +75 -0
  98. package/dist/src/prediction/client.js +164 -0
  99. package/dist/src/prediction/config.d.ts +60 -0
  100. package/dist/src/prediction/config.js +75 -0
  101. package/dist/src/prediction/constants.d.ts +44 -0
  102. package/dist/src/prediction/constants.js +46 -0
  103. package/dist/src/prediction/fetch.d.ts +82 -0
  104. package/dist/src/prediction/fetch.js +270 -0
  105. package/dist/src/prediction/generated/bucket_v2_framework/account.d.ts +100 -0
  106. package/dist/src/prediction/generated/bucket_v2_framework/account.js +129 -0
  107. package/dist/src/prediction/generated/bucket_v2_framework/deps/std/type_name.d.ts +6 -0
  108. package/dist/src/prediction/generated/bucket_v2_framework/deps/std/type_name.js +19 -0
  109. package/dist/src/prediction/generated/bucket_v2_framework/deps/sui/balance.d.ts +10 -0
  110. package/dist/src/prediction/generated/bucket_v2_framework/deps/sui/balance.js +14 -0
  111. package/dist/src/prediction/generated/bucket_v2_framework/deps/sui/vec_map.d.ts +36 -0
  112. package/dist/src/prediction/generated/bucket_v2_framework/deps/sui/vec_map.js +27 -0
  113. package/dist/src/prediction/generated/bucket_v2_framework/deps/sui/vec_set.d.ts +16 -0
  114. package/dist/src/prediction/generated/bucket_v2_framework/deps/sui/vec_set.js +19 -0
  115. package/dist/src/prediction/generated/bucket_v2_framework/double.d.ts +382 -0
  116. package/dist/src/prediction/generated/bucket_v2_framework/double.js +466 -0
  117. package/dist/src/prediction/generated/bucket_v2_framework/float.d.ts +362 -0
  118. package/dist/src/prediction/generated/bucket_v2_framework/float.js +440 -0
  119. package/dist/src/prediction/generated/bucket_v2_framework/liability.d.ts +193 -0
  120. package/dist/src/prediction/generated/bucket_v2_framework/liability.js +205 -0
  121. package/dist/src/prediction/generated/bucket_v2_framework/linked_table.d.ts +384 -0
  122. package/dist/src/prediction/generated/bucket_v2_framework/linked_table.js +382 -0
  123. package/dist/src/prediction/generated/bucket_v2_framework/sheet.d.ts +344 -0
  124. package/dist/src/prediction/generated/bucket_v2_framework/sheet.js +338 -0
  125. package/dist/src/prediction/generated/utils/index.d.ts +30 -0
  126. package/dist/src/prediction/generated/utils/index.js +160 -0
  127. package/dist/src/prediction/generated/waterx_account/account.d.ts +1589 -0
  128. package/dist/src/prediction/generated/waterx_account/account.js +1758 -0
  129. package/dist/src/prediction/generated/waterx_account/deps/bucket_v2_framework/liability.d.ts +7 -0
  130. package/dist/src/prediction/generated/waterx_account/deps/bucket_v2_framework/liability.js +13 -0
  131. package/dist/src/prediction/generated/waterx_account/deps/bucket_v2_framework/sheet.d.ts +7 -0
  132. package/dist/src/prediction/generated/waterx_account/deps/bucket_v2_framework/sheet.js +16 -0
  133. package/dist/src/prediction/generated/waterx_account/deps/std/type_name.d.ts +6 -0
  134. package/dist/src/prediction/generated/waterx_account/deps/std/type_name.js +19 -0
  135. package/dist/src/prediction/generated/waterx_account/deps/sui/balance.d.ts +10 -0
  136. package/dist/src/prediction/generated/waterx_account/deps/sui/balance.js +14 -0
  137. package/dist/src/prediction/generated/waterx_account/deps/sui/object_table.d.ts +12 -0
  138. package/dist/src/prediction/generated/waterx_account/deps/sui/object_table.js +19 -0
  139. package/dist/src/prediction/generated/waterx_account/deps/sui/table.d.ts +24 -0
  140. package/dist/src/prediction/generated/waterx_account/deps/sui/table.js +31 -0
  141. package/dist/src/prediction/generated/waterx_account/deps/sui/vec_map.d.ts +36 -0
  142. package/dist/src/prediction/generated/waterx_account/deps/sui/vec_map.js +27 -0
  143. package/dist/src/prediction/generated/waterx_account/deps/sui/vec_set.d.ts +16 -0
  144. package/dist/src/prediction/generated/waterx_account/deps/sui/vec_set.js +19 -0
  145. package/dist/src/prediction/generated/waterx_account/direct_rule.d.ts +75 -0
  146. package/dist/src/prediction/generated/waterx_account/direct_rule.js +78 -0
  147. package/dist/src/prediction/generated/waterx_account/events.d.ts +33 -0
  148. package/dist/src/prediction/generated/waterx_account/events.js +137 -0
  149. package/dist/src/prediction/generated/waterx_account/version.d.ts +10 -0
  150. package/dist/src/prediction/generated/waterx_account/version.js +8 -0
  151. package/dist/src/prediction/generated/waterx_prediction/account_data.d.ts +327 -0
  152. package/dist/src/prediction/generated/waterx_prediction/account_data.js +405 -0
  153. package/dist/src/prediction/generated/waterx_prediction/admin.d.ts +5 -0
  154. package/dist/src/prediction/generated/waterx_prediction/admin.js +9 -0
  155. package/dist/src/prediction/generated/waterx_prediction/bet_sharing.d.ts +60 -0
  156. package/dist/src/prediction/generated/waterx_prediction/bet_sharing.js +83 -0
  157. package/dist/src/prediction/generated/waterx_prediction/deps/bucket_v2_framework/linked_table.d.ts +8 -0
  158. package/dist/src/prediction/generated/waterx_prediction/deps/bucket_v2_framework/linked_table.js +18 -0
  159. package/dist/src/prediction/generated/waterx_prediction/deps/sui/balance.d.ts +10 -0
  160. package/dist/src/prediction/generated/waterx_prediction/deps/sui/balance.js +14 -0
  161. package/dist/src/prediction/generated/waterx_prediction/deps/sui/table.d.ts +24 -0
  162. package/dist/src/prediction/generated/waterx_prediction/deps/sui/table.js +31 -0
  163. package/dist/src/prediction/generated/waterx_prediction/deps/sui/vec_set.d.ts +16 -0
  164. package/dist/src/prediction/generated/waterx_prediction/deps/sui/vec_set.js +19 -0
  165. package/dist/src/prediction/generated/waterx_prediction/events.d.ts +22 -0
  166. package/dist/src/prediction/generated/waterx_prediction/events.js +179 -0
  167. package/dist/src/prediction/generated/waterx_prediction/global_config.d.ts +116 -0
  168. package/dist/src/prediction/generated/waterx_prediction/global_config.js +141 -0
  169. package/dist/src/prediction/generated/waterx_prediction/order.d.ts +200 -0
  170. package/dist/src/prediction/generated/waterx_prediction/order.js +284 -0
  171. package/dist/src/prediction/generated/waterx_prediction/outcome.d.ts +58 -0
  172. package/dist/src/prediction/generated/waterx_prediction/outcome.js +73 -0
  173. package/dist/src/prediction/generated/waterx_prediction/position.d.ts +160 -0
  174. package/dist/src/prediction/generated/waterx_prediction/position.js +214 -0
  175. package/dist/src/prediction/generated/waterx_prediction/version.d.ts +10 -0
  176. package/dist/src/prediction/generated/waterx_prediction/version.js +8 -0
  177. package/dist/src/prediction/generated/waterx_prediction/view.d.ts +353 -0
  178. package/dist/src/prediction/generated/waterx_prediction/view.js +432 -0
  179. package/dist/src/prediction/generated/waterx_prediction/waterx_prediction.d.ts +1698 -0
  180. package/dist/src/prediction/generated/waterx_prediction/waterx_prediction.js +1733 -0
  181. package/dist/src/prediction/gift-link.d.ts +6 -0
  182. package/dist/src/prediction/gift-link.js +5 -0
  183. package/dist/src/prediction/gift.d.ts +223 -0
  184. package/dist/src/prediction/gift.js +451 -0
  185. package/dist/src/prediction/index.d.ts +29 -0
  186. package/dist/src/prediction/index.js +21 -0
  187. package/dist/src/prediction/prediction.d.ts +104 -0
  188. package/dist/src/prediction/prediction.js +317 -0
  189. package/dist/src/prediction/tx-builders.d.ts +44 -0
  190. package/dist/src/prediction/tx-builders.js +52 -0
  191. package/dist/src/prediction/types.d.ts +93 -0
  192. package/dist/src/prediction/types.js +1 -0
  193. package/dist/src/prediction/user/account.d.ts +2 -0
  194. package/dist/src/prediction/user/account.js +1 -0
  195. package/dist/src/prediction/user/admin.d.ts +6 -0
  196. package/dist/src/prediction/user/admin.js +3 -0
  197. package/dist/src/prediction/user/gift.d.ts +2 -0
  198. package/dist/src/prediction/user/gift.js +1 -0
  199. package/dist/src/prediction/user/index.d.ts +5 -0
  200. package/dist/src/prediction/user/index.js +3 -0
  201. package/dist/src/prediction/user/keeper.d.ts +2 -0
  202. package/dist/src/prediction/user/keeper.js +1 -0
  203. package/dist/src/prediction/user/order.d.ts +2 -0
  204. package/dist/src/prediction/user/order.js +1 -0
  205. package/dist/src/prediction/user/position.d.ts +2 -0
  206. package/dist/src/prediction/user/position.js +1 -0
  207. package/dist/src/prediction/utils/bcs.d.ts +1 -0
  208. package/dist/src/prediction/utils/bcs.js +1 -0
  209. package/dist/src/prediction/utils/index.d.ts +1 -0
  210. package/dist/src/prediction/utils/index.js +1 -0
  211. package/dist/src/prediction/utils.d.ts +30 -0
  212. package/dist/src/prediction/utils.js +177 -0
  213. package/dist/src/sdk.d.ts +18 -0
  214. package/dist/src/sdk.js +17 -0
  215. package/dist/src/tx-builders.d.ts +54 -0
  216. package/dist/src/tx-builders.js +141 -0
  217. package/dist/src/unified-client.d.ts +407 -0
  218. package/dist/src/unified-client.js +123 -0
  219. package/dist/src/user/account.d.ts +27 -0
  220. package/dist/src/user/account.js +34 -8
  221. package/dist/src/user/credit.d.ts +8 -14
  222. package/dist/src/user/credit.js +9 -23
  223. package/dist/src/user/custody.d.ts +4 -18
  224. package/dist/src/user/custody.js +14 -25
  225. package/dist/src/utils/consolidate-balance.d.ts +37 -0
  226. package/dist/src/utils/consolidate-balance.js +89 -0
  227. package/dist/src/utils/math.d.ts +86 -0
  228. package/dist/src/utils/math.js +100 -0
  229. package/dist/src/utils/pyth.d.ts +35 -3
  230. package/dist/src/utils/pyth.js +145 -14
  231. package/package.json +129 -34
package/README.md CHANGED
@@ -1,204 +1,110 @@
1
1
  # @waterx/sdk
2
2
 
3
- TypeScript SDK for the WaterX perpetual protocol on Sui: build PTBs with **gRPC** (`@mysten/sui`), run read-only **simulateTransaction** queries, and optional **Pyth** helpers.
3
+ TypeScript SDK for the WaterX protocol on Sui **two product lines in one package**: **perpetuals** and **prediction markets**. Build PTBs with **gRPC** (`@mysten/sui`), run read-only **simulateTransaction** queries, and optional **Pyth** helpers.
4
4
 
5
- > **ABI note:** PTB entry points follow `contracts/waterx_perp` in this repo. **Read-only `view::*` helpers** resolve the module package from each **shared object’s on-chain type** (so `Market` / `WlpPool` can sit on a newer publish than `GlobalConfig` / `AccountRegistry`). BCS layouts for `MarketSummary`, `PositionInfo`, and `TokenPoolSummary` match the **deployed** `view` structs (see `contracts/waterx_perp/package_summaries/waterx_perp/view.json`). Pin `WaterXConfig` to your environment’s package and object IDs.
5
+ > Package name is `@waterx/sdk` (renamed from `@waterx/perp-sdk` in 2.3.0).
6
6
 
7
- ## Install & build
7
+ ## Two lines, one package
8
8
 
9
- ```bash
10
- pnpm install
11
- pnpm build
12
- ```
13
-
14
- Consumers:
15
-
16
- ```bash
17
- pnpm add @waterx/sdk @mysten/sui
18
- ```
19
-
20
- ### Breaking changes (WLP high-level builders)
21
-
22
- `buildMintWlpTx` and `buildSettleRedeemWlpTx` are **`async`** and return `Promise<Transaction>` (they resolve deposit / redeem coin oracle wiring). Callers must **`await`**:
9
+ The perp and prediction lines expose builder functions with **colliding names** (`placeOrder`, `createAccount`, `deposit`, …), so they are kept in separate namespaces:
23
10
 
24
11
  ```ts
25
- const tx = await buildMintWlpTx(client, params);
26
- const tx2 = await buildSettleRedeemWlpTx(client, { requestId: 1n });
27
- ```
28
-
29
- ### Size calculation requires explicit price
30
-
31
- `buildOpenPositionTx` and `buildPlaceOrderTx` no longer fall back to hardcoded prices when computing position size from leverage. You must provide either **`size`** (exact) or **`approxPrice`** (USD price for leverage math). Omitting both throws.
32
-
33
- ### Naming: collateral on an open position
34
-
35
- Move entry points are `deposit_collateral_request` / `withdraw_collateral_request`. The SDK exposes **`depositCollateral`** / **`withdrawCollateral`** as the preferred names; **`increaseCollateral`** / **`releaseCollateral`** remain as deprecated aliases (same parameters). High-level helpers: **`buildDepositCollateralTx`** / **`buildWithdrawCollateralTx`** (deprecated: `buildIncreaseCollateralTx` / `buildReleaseCollateralTx`).
36
-
37
- Withdraw paths take **`collateralAmount`** for the size to pull from margin; **`amount`** is a deprecated alias (if both are passed, `collateralAmount` wins).
38
-
39
- ### UserAccount address in PTB params
40
-
41
- Trading (`openPosition`, `closePosition`, …), account helpers (`depositToAccount`, delegates, …), high-level `build*Tx`, and orders (`placeOrder`, `cancelOrder`) all use **`accountObjectAddress`**: the **UserAccount object id** (hex). Trading paths pass it as `tx.pure.address`; registry calls use `tx.pure.id`. It is **not** a numeric registry index.
42
-
43
- `getAccountsByOwner` returns a `string[]` of `accountObjectAddress`es (the on-chain `account::account_ids` view returns `vector<ID>`).
44
-
45
- High-level `build*Tx` helpers also accept optional **`collateralTokenType`** (defaults to `WaterXConfig.usdcType`). Only token types wired in `resolveTokenPriceFeed` (`src/tx-builders.ts`) get automatic Pyth updates; extend there when the protocol adds collaterals.
46
-
47
- ---
48
-
49
- ## Initialize the client
50
-
51
- All network I/O uses **gRPC** (`SuiGrpcClient`). Trading helpers require `bucketFrameworkPackageId` (Bucket `bucket_v2_framework` package) so the PTB can call `account::request`.
52
-
53
- **Testnet (built-in constants):**
54
-
55
- ```ts
56
- import { WaterXClient } from "@waterx/sdk";
57
-
58
- const client = WaterXClient.testnet();
59
- // optional: custom fullnode gRPC URL
60
- // const client = WaterXClient.testnet({ grpcUrl: "https://fullnode.testnet.sui.io:443" });
61
- ```
62
-
63
- **Custom config (any network):**
12
+ import { Client } from "@waterx/sdk";
64
13
 
65
- ```ts
66
- import { createTestnetConfig, WaterXClient, type WaterXConfig } from "@waterx/sdk";
67
-
68
- const config: WaterXConfig = {
69
- ...createTestnetConfig(),
70
- packageId: "0x...", // your deployed waterx_perp package
71
- globalConfig: "0x...",
72
- // ...all other object IDs and token type strings
73
- };
74
- const client = new WaterXClient(config);
14
+ const client = await Client.create({ network: "TESTNET" });
15
+ client.perp.buildPlaceOrderTx(params); // perpetuals
16
+ client.predict.placeOrder(tx, params); // prediction markets
17
+ // raw line clients for signing/executing: client.perpClient / client.predictClient
18
+ // each line can target a different network: Client.create({ perp: { network: "MAINNET" }, predict: { network: "TESTNET" } })
75
19
  ```
76
20
 
77
- ---
78
-
79
- ## Examples
80
-
81
- ### Read-only: pool summary & WLP metrics
82
-
83
- Uses gRPC `simulateTransaction` + BCS (no signer).
84
-
85
- ```ts
86
- import { getPoolSummary, getWlpTotalSupply, getWlpTvlUsd, WaterXClient } from "@waterx/sdk";
21
+ Import surfaces:
87
22
 
88
- const client = WaterXClient.testnet();
23
+ | Import | What |
24
+ |--------|------|
25
+ | `@waterx/sdk` | `Client` (unified) + `perp` / `prediction` namespaces. Perp's API is also re-exported flat here (**deprecated** — prefer `client.perp` or the `perp` namespace; removed next major). |
26
+ | `@waterx/sdk/perp` | Perp line: `WaterXClient`, builders, fetch, Pyth/Wormhole utils. |
27
+ | `@waterx/sdk/prediction` | Prediction line: `PredictClient`, builders, fetch, utils. |
89
28
 
90
- const pool = await getPoolSummary(client);
91
- console.log("LP supply (raw):", pool.totalLpSupply.toString());
92
- console.log("TVL (u128):", pool.tvlUsd.toString());
29
+ ## Install
93
30
 
94
- const supply = await getWlpTotalSupply(client);
95
- const tvl = await getWlpTvlUsd(client);
31
+ ```bash
32
+ pnpm install
33
+ pnpm build
96
34
  ```
97
35
 
98
- ### Read-only: accounts & position
36
+ Consumers: `pnpm add @waterx/sdk @mysten/sui`
99
37
 
100
- ```ts
101
- import { getAccountsByOwner, getPosition, positionExists, WaterXClient } from "@waterx/sdk";
102
-
103
- const client = WaterXClient.testnet();
104
- const owner = "0x..."; // Sui address
38
+ ## Quickstart (unified client)
105
39
 
106
- const accounts = await getAccountsByOwner(client, owner);
107
- const accountObjectAddress = accounts[0]!;
108
-
109
- const market = client.config.btcMarket;
110
- const has = await positionExists(client, market, 0n);
111
- if (has) {
112
- const pos = await getPosition(client, market, 0n);
113
- // `accountObjectAddress` = on-chain `user_address`; `marketIndex` = pool row index (not Market object id).
114
- console.log(pos.accountObjectAddress, pos.marketIndex, pos.sizeAmount);
115
- }
116
- ```
117
-
118
- ### High-level PTB: open position (Pyth + testnet IDs wired in)
119
-
120
- Returns a `Transaction` you sign and execute with the same client.
40
+ `Client.create()` loads each line's deployment config from the canonical `waterx-config` JSON and returns a ready client. Builders are **build-only** — they return / mutate a `Transaction`; signing & execution stay with the caller (the line client, or a frontend wallet), so multi-step Pyth injection and wallet flows keep working.
121
41
 
122
42
  ```ts
123
- import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
124
- import { buildOpenPositionTx, WaterXClient } from "@waterx/sdk";
125
-
126
- const client = WaterXClient.testnet();
127
- // Use your own keypair or any @mysten/sui Signer (e.g. wallet adapter).
128
- const keypair = Ed25519Keypair.generate();
129
-
130
- const tx = await buildOpenPositionTx(client, {
131
- accountObjectAddress: "0x...", // UserAccount object id (hex), not a numeric id
132
- base: "BTC",
133
- isLong: true,
134
- leverage: 10,
135
- collateralAmount: 1_000_000_000n, // 1000 USDC if 6 decimals
136
- approxPrice: 95_000, // required when `size` is not provided
43
+ import { Client, rawPrice } from "@waterx/sdk";
44
+ import { Transaction } from "@mysten/sui/transactions";
45
+
46
+ const client = await Client.create({ network: "TESTNET" });
47
+ const signer = /* your Ed25519Keypair or wallet Signer */;
48
+
49
+ // --- Perp: place a market order ---
50
+ const tx = await client.perp.buildPlaceOrderTx({
51
+ ticker: "BTCUSD",
52
+ collateralType: client.perpClient.creditType(),
53
+ accountId: "0x...", // UserAccount object id (hex)
54
+ main: {
55
+ isLong: true,
56
+ isStopOrder: false,
57
+ reduceOnly: false,
58
+ size: rawPrice(0.001),
59
+ acceptablePrice: rawPrice(100_000),
60
+ collateralAmount: 5_000_000n,
61
+ },
62
+ preOrders: [],
137
63
  });
64
+ await client.perpClient.signAndExecuteTransaction({ transaction: tx, signer });
138
65
 
139
- const result = await client.signAndExecuteTransaction({
140
- transaction: tx,
141
- signer: keypair,
142
- });
143
- console.log(result.digest);
66
+ // --- Prediction: same pattern under client.predict ---
67
+ const ptx = new Transaction();
68
+ client.predict.placeOrder(ptx, params);
69
+ await client.predictClient.signAndExecuteTransaction({ transaction: ptx, signer });
144
70
  ```
145
71
 
146
- ### Low-level PTB: same flow, your oracle wiring
147
-
148
- Create a `Transaction`, append Pyth / aggregator calls (`updatePythPrices`, `buildPythRuleFeedCalls` from this package — mirror `src/tx-builders.ts`), then call `openPosition(client, tx, openPositionParams)` (or any other builder in `src/user/`). Params are typed as `OpenPositionParams`, `ClosePositionParams`, etc.
149
-
150
- ---
151
-
152
- ## API overview
72
+ > Account creation is shared: both lines build accounts via the same on-chain `waterx_account` system, so an account created through `client.perp.createAccount` is usable by `client.predict.*` (and vice versa).
153
73
 
154
- ### Core
74
+ ## Per-line clients
155
75
 
156
- | Export | Purpose |
157
- | ----------------------- | --------------------------------------------------------------------- |
158
- | `WaterXClient` | gRPC client, `simulate()`, `signAndExecuteTransaction()` |
159
- | `createTestnetConfig()` | Default testnet package/object/token IDs + Pyth config |
160
- | `WaterXConfig` | Full config; must include `bucketFrameworkPackageId` for trading PTBs |
76
+ If you only need one line, construct it directly (both factories are **async** — they fetch deployment config):
161
77
 
162
- ### Transaction builders (append to `Transaction`)
163
-
164
- | Group | Functions |
165
- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
166
- | Shared | `accountSenderRequest(tx, client)` |
167
- | Trading | `openPosition`, `closePosition`, `increasePosition`, `decreasePosition`, `depositCollateral`, `withdrawCollateral` (`increaseCollateral` / `releaseCollateral` deprecated), `liquidate`, `matchOrders`, `updateFundingRate` |
168
- | Orders | `placeOrder`, `cancelOrder` |
169
- | WLP | `mintWlp`, `requestRedeemWlp`, `cancelRedeemWlp`, `settleRedeemWlp` |
170
- | Account | `createAccount`, `depositToAccount`, `receiveCoin`, `transferAccount`, `addDelegate`, `removeDelegate`, `updateDelegatePermissions` |
171
- | Referral | `setReferralCode`, `useReferralCode`, `registerReferralCode`, `bindReferral` |
172
-
173
- Param types: `OpenPositionParams`, `IncreasePositionParams`, `DecreasePositionParams`, etc. (see `src/index.ts`).
174
-
175
- ### Read-only queries (simulate + BCS)
176
-
177
- | Area | Functions |
178
- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
179
- | Account | `getAccountsByOwner`, `getAccountDelegates`, `getAccountObjectId` (deprecated — use `accountObjectAddress` directly), `getAccountCoins`, `getAccountBalance`, `selectCoinsForAmount` |
180
- | Market / pool | `getMarketSummary` (`view::market_summary<LP>` — optional `typeArgs`: LP type string or `{ lpTokenType? }` only), `getPoolSummary`, `getWlpTotalSupply`, `getWlpTvlUsd`, `getTokenPoolSummary` |
181
- | Position | `getPosition`, `positionExists` (same LP type-arg rules as `getMarketSummary`) |
78
+ ```ts
79
+ import { WaterXClient } from "@waterx/sdk/perp";
80
+ import { PredictClient } from "@waterx/sdk/prediction";
182
81
 
183
- **View return shapes:** `MarketSummary` includes `marketIndex` (on-chain index). `PositionInfoView` exposes `marketIndex` (bigint) and `accountObjectAddress` (from `user_address`). `getTokenPoolSummary` maps `TokenPoolSummary.lastPriceRefreshTimestamp` when the return payload includes it; older 72-byte deployments surface `0n` (see `parseTokenPoolSummaryReturn` in `fetch.ts`).
82
+ const perp = await WaterXClient.create("TESTNET"); // or WaterXClient.testnet()
83
+ const predict = await PredictClient.create("TESTNET"); // or PredictClient.testnet()
84
+ ```
184
85
 
185
- ### High-level PTB helpers
86
+ Read-only queries use gRPC `simulateTransaction` (no signer) — the `getX` view helpers, e.g. `await perp.simulate(tx)` or `getMarketData(perp, …)`.
186
87
 
187
- `buildOpenPositionTx`, `buildClosePositionTx`, `buildIncreasePositionTx`, `buildDecreasePositionTx`, `buildDepositCollateralTx`, `buildWithdrawCollateralTx` (`buildIncreaseCollateralTx` / `buildReleaseCollateralTx` deprecated), `buildPlaceOrderTx`, `buildCancelOrderTx` (all `async`, Pyth-backed). All WLP builders are `async` and refresh every pool token's Pyth feed before the call (required by `assert_prices_fresh`): `buildMintWlpTx`, `buildMintAndStakeWlpTx`, `buildRequestRedeemWlpTx` (requires `recipient`), `buildSettleRedeemWlpTx`, `buildCancelRedeemWlpTx`, `buildUnstakeAndRequestRedeemWlpTx`.
88
+ ## Recipes & full surface
188
89
 
189
- ### Constants & Pyth
90
+ To avoid doc drift, per-action usage lives in maintained, lint-checked code rather than this README:
190
91
 
191
- Permission bits, order tags, testnet IDs, Pyth feeds: `src/constants.ts`.
192
- On testnet, `TESTNET_TYPES.WLP` is the LP type wired to the live **`WlpPool` / `Market`** (`wlp_token::WLP_TOKEN`); `TESTNET_PACKAGE_IDS.WLP_STANDALONE` points at the standalone `contracts/wlp` publish for reference.
193
- Oracle wiring: `fetchPriceFeedsUpdateData`, `updatePythPrices`, `buildPythRuleFeedCalls`, `PythCache`, etc. in `src/utils/pyth.ts`.
92
+ - **Perp recipes:** [`examples/`](./examples) — ~30 runnable scripts (place orders, WLP mint/redeem, account/delegates, reads). Each uses `buildClient()` + a builder + `simThenMaybeExecute`.
93
+ - **Prediction recipes:** [`test/prediction/e2e/`](./test/prediction/e2e) the live reference for `client.predict.*` flows.
94
+ - **Authoritative export list:** [`src/index.ts`](./src/index.ts) (perp) and [`src/prediction/index.ts`](./src/prediction/index.ts) — clients, builders, view helpers, BCS types, and `*Calls` generated namespaces.
194
95
 
195
- ---
96
+ Perp `build*Tx` helpers are Pyth-backed (`async`; they refresh feeds before the call). Pyth/Wormhole helpers live in [`src/utils/`](./src/utils).
196
97
 
197
98
  ## Development
198
99
 
199
- | Command | Use |
200
- | --------------------------- | ------------------------------------ |
201
- | `pnpm typecheck` | Typecheck |
202
- | `pnpm test` | Tests |
203
- | `pnpm lint` / `pnpm format` | Prettier |
204
- | `pnpm codegen` | Regenerate `src/generated` from Move |
100
+ | Command | Use |
101
+ | --- | --- |
102
+ | `pnpm typecheck` | Typecheck the whole tree |
103
+ | `pnpm test` / `pnpm test:unit` | Unit tests (perp + prediction) |
104
+ | `pnpm test:e2e` | Testnet simulate e2e (perp + prediction) |
105
+ | `pnpm test:integration` | On-chain integration (needs `SUI_PRIVATE_KEY`; local-only) |
106
+ | `pnpm lint` / `pnpm format` | ESLint + Prettier |
107
+ | `pnpm codegen` | Regenerate `src/generated` from Move |
108
+ | `pnpm seed:testnet` | Seed prediction testnet fixtures (needs `SUI_PRIVATE_KEY`) |
109
+
110
+ Tests are split per line under `test/perp/` and `test/prediction/`, each with `unit` / `e2e` / `integration` tiers. See the per-line `README.md` in each.
@@ -69,8 +69,58 @@ export declare class WaterXClient {
69
69
  feed_id: string;
70
70
  price_info_object: string;
71
71
  };
72
- /** `wlp.pool_tokens[ticker]` (fully-qualified Move type), throws if unknown. */
73
- getPoolTokenType(ticker: string): string;
72
+ /**
73
+ * True when `ticker` is priced by `waterx_constant_rule` (a constant pin,
74
+ * e.g. `USDCUSD → $1`) rather than Pyth. Such tickers are fed via
75
+ * `constant_rule::feed` and need no Pyth update; see {@link refreshOraclePrices}.
76
+ *
77
+ * All-or-nothing, mirroring {@link getSupraRule} and the keeper: only routes a
78
+ * ticker to the constant rule when the rule is FULLY wired (`published_at` +
79
+ * `config` present). A half-populated block — `prices` listed before the rule
80
+ * is deployed, a realistic mid-rollout state — would otherwise make this true
81
+ * while {@link aggregateTickerWithConstant} throws, aborting the whole
82
+ * price-refresh PTB instead of safely falling back to Pyth.
83
+ */
84
+ isConstantTicker(ticker: string): boolean;
85
+ /**
86
+ * True when `ticker` is mid-migration and must be fed by *both* Pyth and the
87
+ * constant rule into one collector — so the aggregator can hold the
88
+ * `{Pyth, Constant}` weight set without an `EMissingPriceSource` window while
89
+ * rule weights are flipped (on-chain `aggregator::remove_outliers` requires
90
+ * every weighted rule present in the collector). Listed in
91
+ * `waterx_constant_rule.dual_feed`; clamped to `prices` so a stray entry that
92
+ * isn't a real constant ticker can't double-feed against no weight. See
93
+ * {@link aggregateTickerWithDual} and the USDCUSD runbook in `waterx-contract`.
94
+ */
95
+ isDualFeedTicker(ticker: string): boolean;
96
+ /**
97
+ * True when `ticker` is fed by the constant rule *alone* (steady state): no
98
+ * Pyth feed call, so it skips the Pyth update. Dual-feed tickers are constant
99
+ * *and* Pyth, so they are NOT constant-only.
100
+ */
101
+ isConstantOnlyTicker(ticker: string): boolean;
102
+ /**
103
+ * The `supra_rule` config when it is deployed, enabled, and fully wired
104
+ * (`config` + `oracle_holder`), else `undefined`. When present, callers feed
105
+ * `supra_rule::feed` as a second weighted rule alongside Pyth on the same
106
+ * collector; see {@link refreshOraclePrices}. Default-off, so a Pyth-only
107
+ * deployment returns `undefined` here.
108
+ */
109
+ getSupraRule(): {
110
+ published_at: string;
111
+ config: string;
112
+ oracle_holder: string;
113
+ } | undefined;
114
+ /**
115
+ * Resolve a WLP pool token's fully-qualified Move type.
116
+ *
117
+ * `wlp.pool_tokens` is keyed by **oracle ticker** (e.g. `"USDCUSD"`) — the
118
+ * Rust keeper requires this, since it reuses each key to look up the token's
119
+ * aggregator + pyth feed. For ergonomics this also accepts the coin symbol
120
+ * (the trailing `::Struct` segment, e.g. `"USD"` → `…::usd::USD`): an exact
121
+ * ticker hit wins, otherwise we match by coin name. Throws if neither hits.
122
+ */
123
+ getPoolTokenType(tickerOrName: string): string;
74
124
  /** Fully-qualified WLP coin type derived from `wlp.original_id`. */
75
125
  wlpType(): string;
76
126
  /**
@@ -117,12 +117,82 @@ export class WaterXClient {
117
117
  throw new Error(`No pyth feed listed for ticker: ${ticker}`);
118
118
  return f;
119
119
  }
120
- /** `wlp.pool_tokens[ticker]` (fully-qualified Move type), throws if unknown. */
121
- getPoolTokenType(ticker) {
122
- const t = this.config.packages.wlp?.pool_tokens?.[ticker];
123
- if (!t)
124
- throw new Error(`No pool token registered for ticker: ${ticker}`);
125
- return t;
120
+ /**
121
+ * True when `ticker` is priced by `waterx_constant_rule` (a constant pin,
122
+ * e.g. `USDCUSD → $1`) rather than Pyth. Such tickers are fed via
123
+ * `constant_rule::feed` and need no Pyth update; see {@link refreshOraclePrices}.
124
+ *
125
+ * All-or-nothing, mirroring {@link getSupraRule} and the keeper: only routes a
126
+ * ticker to the constant rule when the rule is FULLY wired (`published_at` +
127
+ * `config` present). A half-populated block — `prices` listed before the rule
128
+ * is deployed, a realistic mid-rollout state — would otherwise make this true
129
+ * while {@link aggregateTickerWithConstant} throws, aborting the whole
130
+ * price-refresh PTB instead of safely falling back to Pyth.
131
+ */
132
+ isConstantTicker(ticker) {
133
+ const c = this.config.packages.waterx_constant_rule;
134
+ if (!c?.published_at || !c.config)
135
+ return false;
136
+ return c.prices?.[ticker] !== undefined;
137
+ }
138
+ /**
139
+ * True when `ticker` is mid-migration and must be fed by *both* Pyth and the
140
+ * constant rule into one collector — so the aggregator can hold the
141
+ * `{Pyth, Constant}` weight set without an `EMissingPriceSource` window while
142
+ * rule weights are flipped (on-chain `aggregator::remove_outliers` requires
143
+ * every weighted rule present in the collector). Listed in
144
+ * `waterx_constant_rule.dual_feed`; clamped to `prices` so a stray entry that
145
+ * isn't a real constant ticker can't double-feed against no weight. See
146
+ * {@link aggregateTickerWithDual} and the USDCUSD runbook in `waterx-contract`.
147
+ */
148
+ isDualFeedTicker(ticker) {
149
+ const c = this.config.packages.waterx_constant_rule;
150
+ if (!c?.published_at || !c.config)
151
+ return false;
152
+ if (c.prices?.[ticker] === undefined)
153
+ return false;
154
+ return c.dual_feed?.includes(ticker) ?? false;
155
+ }
156
+ /**
157
+ * True when `ticker` is fed by the constant rule *alone* (steady state): no
158
+ * Pyth feed call, so it skips the Pyth update. Dual-feed tickers are constant
159
+ * *and* Pyth, so they are NOT constant-only.
160
+ */
161
+ isConstantOnlyTicker(ticker) {
162
+ return this.isConstantTicker(ticker) && !this.isDualFeedTicker(ticker);
163
+ }
164
+ /**
165
+ * The `supra_rule` config when it is deployed, enabled, and fully wired
166
+ * (`config` + `oracle_holder`), else `undefined`. When present, callers feed
167
+ * `supra_rule::feed` as a second weighted rule alongside Pyth on the same
168
+ * collector; see {@link refreshOraclePrices}. Default-off, so a Pyth-only
169
+ * deployment returns `undefined` here.
170
+ */
171
+ getSupraRule() {
172
+ const s = this.config.packages.supra_rule;
173
+ if (!s?.enabled || !s.published_at || !s.config || !s.oracle_holder)
174
+ return undefined;
175
+ return { published_at: s.published_at, config: s.config, oracle_holder: s.oracle_holder };
176
+ }
177
+ /**
178
+ * Resolve a WLP pool token's fully-qualified Move type.
179
+ *
180
+ * `wlp.pool_tokens` is keyed by **oracle ticker** (e.g. `"USDCUSD"`) — the
181
+ * Rust keeper requires this, since it reuses each key to look up the token's
182
+ * aggregator + pyth feed. For ergonomics this also accepts the coin symbol
183
+ * (the trailing `::Struct` segment, e.g. `"USD"` → `…::usd::USD`): an exact
184
+ * ticker hit wins, otherwise we match by coin name. Throws if neither hits.
185
+ */
186
+ getPoolTokenType(tickerOrName) {
187
+ const poolTokens = this.config.packages.wlp?.pool_tokens ?? {};
188
+ const exact = poolTokens[tickerOrName];
189
+ if (exact)
190
+ return exact;
191
+ for (const t of Object.values(poolTokens)) {
192
+ if (typeof t === "string" && t.split("::").pop() === tickerOrName)
193
+ return t;
194
+ }
195
+ throw new Error(`No pool token registered for ticker/name: ${tickerOrName}`);
126
196
  }
127
197
  /** Fully-qualified WLP coin type derived from `wlp.original_id`. */
128
198
  wlpType() {
@@ -25,6 +25,39 @@ export interface PythRulePackage extends BasePackageEntry {
25
25
  export interface PythSponsorRulePackage extends BasePackageEntry {
26
26
  pyth_sponsor: string;
27
27
  }
28
+ export interface WaterxConstantRulePackage extends BasePackageEntry {
29
+ /** Shared `constant_rule::Config` holding the per-ticker constant prices. */
30
+ config: string;
31
+ /**
32
+ * Oracle ticker → constant 1e9-scaled price (decimal string), mirroring the
33
+ * on-chain `Config.prices` map. A ticker present here is fed via
34
+ * `constant_rule::feed` instead of `pyth_rule::feed` (e.g. `USDCUSD → "1000000000"`).
35
+ */
36
+ prices?: Record<string, string>;
37
+ /**
38
+ * Tickers in transition (subset of `prices`): fed via *both* `pyth_rule::feed`
39
+ * and `constant_rule::feed` into one collector so the aggregator can hold the
40
+ * `{Pyth, Constant}` weight set without an `EMissingPriceSource` window while
41
+ * rule weights are flipped. Empty/absent (steady state) → each `prices` ticker
42
+ * is constant-only. See the USDCUSD migration runbook in `waterx-contract`.
43
+ */
44
+ dual_feed?: string[];
45
+ }
46
+ export interface SupraRulePackage extends BasePackageEntry {
47
+ /** Shared `supra_rule::Config` (per-symbol Supra pair_id + freshness tolerance). */
48
+ config: string;
49
+ /** Supra `OracleHolder` shared object id (network-specific). Required to feed. */
50
+ oracle_holder?: string;
51
+ /** Oracle ticker → Supra pair id (mirrors the on-chain `Config`; informational). */
52
+ pairs?: Record<string, number>;
53
+ /**
54
+ * When true AND `config` + `oracle_holder` are set, `refreshOraclePrices`
55
+ * feeds `supra_rule` on the same `PriceCollector` as Pyth before `aggregate`
56
+ * (a second weighted rule). Defaults to **false** so a Pyth-only deployment
57
+ * is unaffected — flip on only after `weight_threshold`/feeders are ready.
58
+ */
59
+ enabled?: boolean;
60
+ }
28
61
  export interface WxaAccountPackage extends BasePackageEntry {
29
62
  admin_cap: string;
30
63
  account_registry: string;
@@ -93,6 +126,8 @@ export interface WaterxCreditPackage {
93
126
  }
94
127
  /** One backing-asset row on the native custody vault (PSM). */
95
128
  export interface NativeCustodyAsset {
129
+ /** Human-readable asset label, e.g. `"MOCK_USDC"` / `"USDC"` (from `add_asset`). */
130
+ name?: string;
96
131
  /** Fully-qualified backing asset Move type `T`. */
97
132
  type: string;
98
133
  decimal: number;
@@ -123,7 +158,12 @@ export interface WormholeBridgePackage {
123
158
  max_mint_per_tx?: string;
124
159
  hourly_burn_limit?: string;
125
160
  max_burn_per_tx?: string;
126
- trusted_emitters: TrustedEmitterRow[];
161
+ /**
162
+ * @deprecated EVM emitter↔token config now lives solely under `evm.bridge.chains`
163
+ * (deposit_vault = emitter, wormhole_chain_id = chain key). The runtime allowlist is
164
+ * read from the on-chain `Bridge` object, not from config. Kept optional for back-compat.
165
+ */
166
+ trusted_emitters?: TrustedEmitterRow[];
127
167
  /** Shared `Bridge` (phase-5 output). */
128
168
  bridge?: string;
129
169
  /**
@@ -150,6 +190,8 @@ export interface WaterXPackages {
150
190
  waterx_referral?: WaterxReferralPackage;
151
191
  pyth_rule: PythRulePackage;
152
192
  pyth_sponsor_rule?: PythSponsorRulePackage;
193
+ waterx_constant_rule?: WaterxConstantRulePackage;
194
+ supra_rule?: SupraRulePackage;
153
195
  waterx_account: WxaAccountPackage;
154
196
  waterx_oracle: WaterxOraclePackage;
155
197
  waterx_perp: WaterxPerpPackage;
@@ -211,9 +253,17 @@ export interface WaterXConfig {
211
253
  export interface LoadConfigOptions {
212
254
  /**
213
255
  * Override the default config URL. Use this to point at a staging branch
214
- * (`?ref=staging`) or a local mirror during development.
256
+ * (`?ref=staging`) or a local mirror during development. Takes precedence
257
+ * over {@link configRef}.
215
258
  */
216
259
  configUrl?: string;
260
+ /**
261
+ * Pin the canonical config to a specific git ref — a commit SHA, branch,
262
+ * or tag — instead of the default `main` branch. Resolves to
263
+ * `https://raw.githubusercontent.com/WaterXProtocol/waterx-config/<ref>/<network>.json`.
264
+ * Ignored when {@link configUrl} is set.
265
+ */
266
+ configRef?: string;
217
267
  /**
218
268
  * Reuse a previously-fetched config from the in-memory cache (keyed by
219
269
  * the effective URL). Default: false (always fetch fresh).
@@ -224,6 +274,10 @@ export interface LoadConfigOptions {
224
274
  /** Optional request timeout in ms. Default 10_000. */
225
275
  timeoutMs?: number;
226
276
  }
227
- export declare function defaultConfigUrl(network: Network): string;
277
+ /**
278
+ * Build the canonical config URL for `network`, optionally pinned to a
279
+ * specific git `ref` (commit SHA, branch, or tag). Defaults to `main`.
280
+ */
281
+ export declare function defaultConfigUrl(network: Network, ref?: string): string;
228
282
  export declare function clearConfigCache(): void;
229
283
  export declare function loadConfig(network: Network, opts?: LoadConfigOptions): Promise<WaterXConfig>;
@@ -34,16 +34,22 @@ export const WORMHOLE_DEFAULTS = {
34
34
  wormholescan_api: "https://api.testnet.wormholescan.io/api/v1",
35
35
  },
36
36
  };
37
- const DEFAULT_CONFIG_URL_BASE = "https://raw.githubusercontent.com/WaterXProtocol/waterx-config/main";
38
- export function defaultConfigUrl(network) {
39
- return `${DEFAULT_CONFIG_URL_BASE}/${network.toLowerCase()}.json`;
37
+ const CONFIG_REPO_RAW_BASE = "https://raw.githubusercontent.com/WaterXProtocol/waterx-config";
38
+ /** Default git ref for the canonical config when none is pinned. */
39
+ const DEFAULT_CONFIG_REF = "main";
40
+ /**
41
+ * Build the canonical config URL for `network`, optionally pinned to a
42
+ * specific git `ref` (commit SHA, branch, or tag). Defaults to `main`.
43
+ */
44
+ export function defaultConfigUrl(network, ref = DEFAULT_CONFIG_REF) {
45
+ return `${CONFIG_REPO_RAW_BASE}/${ref}/${network.toLowerCase()}.json`;
40
46
  }
41
47
  const cache = new Map();
42
48
  export function clearConfigCache() {
43
49
  cache.clear();
44
50
  }
45
51
  export async function loadConfig(network, opts = {}) {
46
- const url = opts.configUrl ?? defaultConfigUrl(network);
52
+ const url = opts.configUrl ?? defaultConfigUrl(network, opts.configRef);
47
53
  if (opts.cache && cache.has(url)) {
48
54
  return cache.get(url);
49
55
  }
@@ -62,3 +62,9 @@ export declare const ACTION_ADD_PRE_ORDER = 11;
62
62
  export declare const MS_PER_YEAR: number;
63
63
  /** Zero-address placeholder used as the sender in dry-run / simulate calls. */
64
64
  export declare const DRY_RUN_SENDER = "0x0000000000000000000000000000000000000000000000000000000000000000";
65
+ /**
66
+ * Well-known address of Sui's native funds-accumulator root shared object
67
+ * (`@0xacc` in the framework). Pass this to `request_deposit_from_funds<T>`
68
+ * to drain `Balance<T>` parked at an account's address.
69
+ */
70
+ export declare const ACCUMULATOR_ROOT = "0xacc";
@@ -69,3 +69,9 @@ export const MS_PER_YEAR = 365 * 24 * 60 * 60 * 1000;
69
69
  // ======== Misc ========
70
70
  /** Zero-address placeholder used as the sender in dry-run / simulate calls. */
71
71
  export const DRY_RUN_SENDER = "0x0000000000000000000000000000000000000000000000000000000000000000";
72
+ /**
73
+ * Well-known address of Sui's native funds-accumulator root shared object
74
+ * (`@0xacc` in the framework). Pass this to `request_deposit_from_funds<T>`
75
+ * to drain `Balance<T>` parked at an account's address.
76
+ */
77
+ export const ACCUMULATOR_ROOT = "0xacc";
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Shared `waterx_account` PTB builders.
3
+ *
4
+ * Perp and prediction both create/operate accounts through the **same** on-chain
5
+ * `waterx_account` system (same package + `AccountRegistry`), so the actual PTB
6
+ * calls are assembled here once. Each product line resolves the deployment
7
+ * coordinates (`WxaAccountRef`) and builds its own `senderRequest` (via its own
8
+ * account-request helper), then delegates the moveCall to these functions.
9
+ *
10
+ * These builders are raw `tx.moveCall(...)` (no generated-bindings dependency),
11
+ * so the module is shared by both `src/user/account.ts` (perp) and
12
+ * `src/prediction/account.ts` (prediction) without coupling to either line's
13
+ * generated code.
14
+ */
15
+ import type { Transaction, TransactionArgument } from "@mysten/sui/transactions";
16
+ /** Resolved `waterx_account` deployment coordinates (each line resolves these from its own client). */
17
+ export interface WxaAccountRef {
18
+ /** `waterx_account` package id (`published_at`). */
19
+ packageId: string;
20
+ /** `AccountRegistry` shared-object id. */
21
+ registry: string;
22
+ }
23
+ /**
24
+ * `waterx_account::account::create_account`. Returns the new account id
25
+ * (Move return value). `senderRequest` is the `account::request` hot-potato the
26
+ * caller built with its own account-request helper.
27
+ */
28
+ export declare function createAccountCall(tx: Transaction, ref: WxaAccountRef, params: {
29
+ senderRequest: TransactionArgument;
30
+ alias: string;
31
+ }): TransactionArgument;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared `waterx_account` PTB builders.
3
+ *
4
+ * Perp and prediction both create/operate accounts through the **same** on-chain
5
+ * `waterx_account` system (same package + `AccountRegistry`), so the actual PTB
6
+ * calls are assembled here once. Each product line resolves the deployment
7
+ * coordinates (`WxaAccountRef`) and builds its own `senderRequest` (via its own
8
+ * account-request helper), then delegates the moveCall to these functions.
9
+ *
10
+ * These builders are raw `tx.moveCall(...)` (no generated-bindings dependency),
11
+ * so the module is shared by both `src/user/account.ts` (perp) and
12
+ * `src/prediction/account.ts` (prediction) without coupling to either line's
13
+ * generated code.
14
+ */
15
+ /**
16
+ * `waterx_account::account::create_account`. Returns the new account id
17
+ * (Move return value). `senderRequest` is the `account::request` hot-potato the
18
+ * caller built with its own account-request helper.
19
+ */
20
+ export function createAccountCall(tx, ref, params) {
21
+ const [accountId] = tx.moveCall({
22
+ target: `${ref.packageId}::account::create_account`,
23
+ arguments: [tx.object(ref.registry), params.senderRequest, tx.pure.string(params.alias)],
24
+ });
25
+ return accountId;
26
+ }