@mysten/deepbook-v3 2.0.0 → 2.1.3
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/CHANGELOG.md +100 -0
- package/PREDICT.md +256 -0
- package/README.md +116 -0
- package/dist/account.d.mts +139 -0
- package/dist/account.d.mts.map +1 -0
- package/dist/account.mjs +181 -0
- package/dist/account.mjs.map +1 -0
- package/dist/bcs/integers.mjs +23 -0
- package/dist/bcs/integers.mjs.map +1 -0
- package/dist/contracts/account/account.d.mts +382 -0
- package/dist/contracts/account/account.d.mts.map +1 -0
- package/dist/contracts/account/account.mjs +443 -0
- package/dist/contracts/account/account.mjs.map +1 -0
- package/dist/contracts/account/account_events.d.mts +41 -0
- package/dist/contracts/account/account_events.d.mts.map +1 -0
- package/dist/contracts/account/account_events.mjs +72 -0
- package/dist/contracts/account/account_events.mjs.map +1 -0
- package/dist/contracts/account/account_registry.d.mts +210 -0
- package/dist/contracts/account/account_registry.d.mts.map +1 -0
- package/dist/contracts/account/account_registry.mjs +263 -0
- package/dist/contracts/account/account_registry.mjs.map +1 -0
- package/dist/contracts/account/config-arguments.d.mts +10 -0
- package/dist/contracts/account/config-arguments.d.mts.map +1 -0
- package/dist/contracts/account/deps/sui/bag.mjs +44 -0
- package/dist/contracts/account/deps/sui/bag.mjs.map +1 -0
- package/dist/contracts/deepbook/account.d.mts +18 -18
- package/dist/contracts/deepbook/balance_manager.mjs.map +1 -1
- package/dist/contracts/deepbook/balances.d.mts +4 -4
- package/dist/contracts/deepbook/balances.d.mts.map +1 -1
- package/dist/contracts/deepbook/deep_price.d.mts +3 -3
- package/dist/contracts/deepbook/deep_price.d.mts.map +1 -1
- package/dist/contracts/deepbook/order.d.mts +12 -12
- package/dist/contracts/deepbook/pool.mjs.map +1 -1
- package/dist/contracts/deepbook/registry.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/margin_manager.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/margin_manager_upgraded.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/margin_pool.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/margin_registry.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/pool_proxy.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/protocol_config.mjs.map +1 -1
- package/dist/contracts/deepbook_margin/tpsl.mjs.map +1 -1
- package/dist/contracts/deepbook_predict/builder_code_events.mjs +38 -0
- package/dist/contracts/deepbook_predict/builder_code_events.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/config-arguments.d.mts +13 -0
- package/dist/contracts/deepbook_predict/config-arguments.d.mts.map +1 -0
- package/dist/contracts/deepbook_predict/deps/fixed_math/i64.mjs +25 -0
- package/dist/contracts/deepbook_predict/deps/fixed_math/i64.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/deps/sui/balance.mjs +25 -0
- package/dist/contracts/deepbook_predict/deps/sui/balance.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/deps/sui/coin.mjs +24 -0
- package/dist/contracts/deepbook_predict/deps/sui/coin.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/deps/sui/table.mjs +39 -0
- package/dist/contracts/deepbook_predict/deps/sui/table.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/deps/sui/vec_set.mjs +26 -0
- package/dist/contracts/deepbook_predict/deps/sui/vec_set.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/ewma.mjs +29 -0
- package/dist/contracts/deepbook_predict/ewma.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/expiry_cash.mjs +27 -0
- package/dist/contracts/deepbook_predict/expiry_cash.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/expiry_market.mjs +367 -0
- package/dist/contracts/deepbook_predict/expiry_market.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/lp_book.mjs +92 -0
- package/dist/contracts/deepbook_predict/lp_book.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/market_manager.mjs +59 -0
- package/dist/contracts/deepbook_predict/market_manager.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/order.mjs +26 -0
- package/dist/contracts/deepbook_predict/order.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/order_events.mjs +84 -0
- package/dist/contracts/deepbook_predict/order_events.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/plp.mjs +284 -0
- package/dist/contracts/deepbook_predict/plp.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/pool_accounting.mjs +58 -0
- package/dist/contracts/deepbook_predict/pool_accounting.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/predict_account.mjs +106 -0
- package/dist/contracts/deepbook_predict/predict_account.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/pricing.mjs +80 -0
- package/dist/contracts/deepbook_predict/pricing.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/range_codec.mjs +41 -0
- package/dist/contracts/deepbook_predict/range_codec.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/registry.mjs +55 -0
- package/dist/contracts/deepbook_predict/registry.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/strike_exposure.mjs +65 -0
- package/dist/contracts/deepbook_predict/strike_exposure.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/strike_exposure_config.mjs +33 -0
- package/dist/contracts/deepbook_predict/strike_exposure_config.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/strike_payout_tree.mjs +72 -0
- package/dist/contracts/deepbook_predict/strike_payout_tree.mjs.map +1 -0
- package/dist/contracts/deepbook_predict/vault_events.mjs +184 -0
- package/dist/contracts/deepbook_predict/vault_events.mjs.map +1 -0
- package/dist/contracts/deepbook_sessions/config-arguments.d.mts +10 -0
- package/dist/contracts/deepbook_sessions/config-arguments.d.mts.map +1 -0
- package/dist/contracts/deepbook_sessions/deps/sui/vec_map.mjs +37 -0
- package/dist/contracts/deepbook_sessions/deps/sui/vec_map.mjs.map +1 -0
- package/dist/contracts/deepbook_sessions/session_config.d.mts +63 -0
- package/dist/contracts/deepbook_sessions/session_config.d.mts.map +1 -0
- package/dist/contracts/deepbook_sessions/session_config.mjs +82 -0
- package/dist/contracts/deepbook_sessions/session_config.mjs.map +1 -0
- package/dist/contracts/deepbook_sessions/sessions.d.mts +275 -0
- package/dist/contracts/deepbook_sessions/sessions.d.mts.map +1 -0
- package/dist/contracts/deepbook_sessions/sessions.mjs +443 -0
- package/dist/contracts/deepbook_sessions/sessions.mjs.map +1 -0
- package/dist/contracts/margin_liquidation/liquidation_vault.mjs.map +1 -1
- package/dist/contracts/utils/index.d.mts +18 -1
- package/dist/contracts/utils/index.d.mts.map +1 -1
- package/dist/deployments/index.d.mts +31 -0
- package/dist/deployments/index.d.mts.map +1 -0
- package/dist/deployments/index.mjs +30 -0
- package/dist/deployments/index.mjs.map +1 -0
- package/dist/deployments/testnet.d.mts +14 -0
- package/dist/deployments/testnet.d.mts.map +1 -0
- package/dist/deployments/testnet.mjs +73 -0
- package/dist/deployments/testnet.mjs.map +1 -0
- package/dist/deployments/types.d.mts +36 -0
- package/dist/deployments/types.d.mts.map +1 -0
- package/dist/index.mjs +0 -1
- package/dist/predict/client.d.mts +255 -0
- package/dist/predict/client.d.mts.map +1 -0
- package/dist/predict/client.mjs +436 -0
- package/dist/predict/client.mjs.map +1 -0
- package/dist/predict/config/generated.d.mts +29 -0
- package/dist/predict/config/generated.d.mts.map +1 -0
- package/dist/predict/config/generated.mjs +16 -0
- package/dist/predict/config/generated.mjs.map +1 -0
- package/dist/predict/config/index.d.mts +10 -0
- package/dist/predict/config/index.d.mts.map +1 -0
- package/dist/predict/config/index.mjs +13 -0
- package/dist/predict/config/index.mjs.map +1 -0
- package/dist/predict/config/testnet.d.mts +17 -0
- package/dist/predict/config/testnet.d.mts.map +1 -0
- package/dist/predict/config/testnet.mjs +26 -0
- package/dist/predict/config/testnet.mjs.map +1 -0
- package/dist/predict/config/types.d.mts +55 -0
- package/dist/predict/config/types.d.mts.map +1 -0
- package/dist/predict/decode.d.mts +162 -0
- package/dist/predict/decode.d.mts.map +1 -0
- package/dist/predict/decode.mjs +175 -0
- package/dist/predict/decode.mjs.map +1 -0
- package/dist/predict/errors.d.mts +42 -0
- package/dist/predict/errors.d.mts.map +1 -0
- package/dist/predict/errors.mjs +37 -0
- package/dist/predict/errors.mjs.map +1 -0
- package/dist/predict/index.d.mts +18 -0
- package/dist/predict/index.mjs +14 -0
- package/dist/predict/pricing.d.mts +73 -0
- package/dist/predict/pricing.d.mts.map +1 -0
- package/dist/predict/pricing.mjs +129 -0
- package/dist/predict/pricing.mjs.map +1 -0
- package/dist/predict/reads/balances.mjs +41 -0
- package/dist/predict/reads/balances.mjs.map +1 -0
- package/dist/predict/reads/inspect.d.mts +8 -0
- package/dist/predict/reads/inspect.d.mts.map +1 -0
- package/dist/predict/reads/inspect.mjs +37 -0
- package/dist/predict/reads/inspect.mjs.map +1 -0
- package/dist/predict/reads/markets.mjs +130 -0
- package/dist/predict/reads/markets.mjs.map +1 -0
- package/dist/predict/reads/parse.mjs +20 -0
- package/dist/predict/reads/parse.mjs.map +1 -0
- package/dist/predict/reads/pool.mjs +26 -0
- package/dist/predict/reads/pool.mjs.map +1 -0
- package/dist/predict/reads/positions.d.mts +12 -0
- package/dist/predict/reads/positions.d.mts.map +1 -0
- package/dist/predict/reads/positions.mjs +77 -0
- package/dist/predict/reads/positions.mjs.map +1 -0
- package/dist/predict/reads/pricing.d.mts +20 -0
- package/dist/predict/reads/pricing.d.mts.map +1 -0
- package/dist/predict/reads/pricing.mjs +43 -0
- package/dist/predict/reads/pricing.mjs.map +1 -0
- package/dist/predict/ticks.d.mts +11 -0
- package/dist/predict/ticks.d.mts.map +1 -0
- package/dist/predict/ticks.mjs +21 -0
- package/dist/predict/ticks.mjs.map +1 -0
- package/dist/predict/tx/authed.mjs +18 -0
- package/dist/predict/tx/authed.mjs.map +1 -0
- package/dist/predict/tx/common.d.mts +18 -0
- package/dist/predict/tx/common.d.mts.map +1 -0
- package/dist/predict/tx/common.mjs +52 -0
- package/dist/predict/tx/common.mjs.map +1 -0
- package/dist/predict/tx/trade.d.mts +15 -0
- package/dist/predict/tx/trade.d.mts.map +1 -0
- package/dist/predict/tx/trade.mjs +86 -0
- package/dist/predict/tx/trade.mjs.map +1 -0
- package/dist/predict/units.d.mts +11 -0
- package/dist/predict/units.d.mts.map +1 -0
- package/dist/predict/units.mjs +44 -0
- package/dist/predict/units.mjs.map +1 -0
- package/dist/queries/accountQueries.mjs +0 -1
- package/dist/queries/accountQueries.mjs.map +1 -1
- package/dist/queries/orderQueries.mjs +0 -1
- package/dist/queries/orderQueries.mjs.map +1 -1
- package/dist/queries/registryQueries.mjs +0 -1
- package/dist/queries/registryQueries.mjs.map +1 -1
- package/dist/sessions.d.mts +244 -0
- package/dist/sessions.d.mts.map +1 -0
- package/dist/sessions.mjs +291 -0
- package/dist/sessions.mjs.map +1 -0
- package/dist/transactions/balanceManager.d.mts +12 -12
- package/dist/transactions/deepbook.d.mts +20 -20
- package/dist/transactions/deepbookAdmin.d.mts +4 -4
- package/dist/transactions/deepbookAdmin.d.mts.map +1 -1
- package/dist/transactions/marginAdmin.d.mts +7 -7
- package/dist/transactions/marginLiquidations.d.mts +3 -3
- package/dist/transactions/marginMaintainer.d.mts +5 -5
- package/dist/transactions/marginManager.d.mts +32 -32
- package/dist/transactions/marginPool.d.mts +18 -18
- package/dist/transactions/marginRegistry.d.mts +16 -16
- package/dist/transactions/marginTPSL.d.mts +10 -10
- package/dist/transactions/poolProxy.d.mts +8 -8
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/utils/constants.d.mts.map +1 -1
- package/dist/utils/constants.mjs +1 -1
- package/dist/utils/constants.mjs.map +1 -1
- package/package.json +33 -12
- package/src/account.ts +239 -0
- package/src/bcs/integers.ts +35 -0
- package/src/contracts/account/account.ts +706 -0
- package/src/contracts/account/account_events.ts +64 -0
- package/src/contracts/account/account_registry.ts +468 -0
- package/src/contracts/account/config-arguments.ts +8 -0
- package/src/contracts/account/deps/sui/bag.ts +42 -0
- package/src/contracts/deepbook/balance_manager.ts +1 -2
- package/src/contracts/deepbook/pool.ts +12 -24
- package/src/contracts/deepbook/registry.ts +1 -2
- package/src/contracts/deepbook_margin/margin_manager.ts +9 -18
- package/src/contracts/deepbook_margin/margin_manager_upgraded.ts +5 -10
- package/src/contracts/deepbook_margin/margin_pool.ts +2 -4
- package/src/contracts/deepbook_margin/margin_registry.ts +3 -6
- package/src/contracts/deepbook_margin/pool_proxy.ts +3 -6
- package/src/contracts/deepbook_margin/protocol_config.ts +1 -2
- package/src/contracts/deepbook_margin/tpsl.ts +1 -2
- package/src/contracts/deepbook_predict/admin.ts +44 -0
- package/src/contracts/deepbook_predict/builder_code.ts +155 -0
- package/src/contracts/deepbook_predict/builder_code_events.ts +34 -0
- package/src/contracts/deepbook_predict/config-arguments.ts +11 -0
- package/src/contracts/deepbook_predict/config_events.ts +140 -0
- package/src/contracts/deepbook_predict/deps/fixed_math/i64.ts +21 -0
- package/src/contracts/deepbook_predict/deps/sui/balance.ts +25 -0
- package/src/contracts/deepbook_predict/deps/sui/coin.ts +20 -0
- package/src/contracts/deepbook_predict/deps/sui/table.ts +37 -0
- package/src/contracts/deepbook_predict/deps/sui/vec_set.ts +22 -0
- package/src/contracts/deepbook_predict/ewma.ts +26 -0
- package/src/contracts/deepbook_predict/ewma_config.ts +28 -0
- package/src/contracts/deepbook_predict/expiry_cash.ts +24 -0
- package/src/contracts/deepbook_predict/expiry_market.ts +1549 -0
- package/src/contracts/deepbook_predict/lp_book.ts +105 -0
- package/src/contracts/deepbook_predict/market_lifecycle_cap.ts +75 -0
- package/src/contracts/deepbook_predict/market_manager.ts +218 -0
- package/src/contracts/deepbook_predict/order.ts +24 -0
- package/src/contracts/deepbook_predict/order_events.ts +129 -0
- package/src/contracts/deepbook_predict/pause_cap.ts +68 -0
- package/src/contracts/deepbook_predict/plp.ts +987 -0
- package/src/contracts/deepbook_predict/pool_accounting.ts +79 -0
- package/src/contracts/deepbook_predict/predict_account.ts +180 -0
- package/src/contracts/deepbook_predict/pricing.ts +124 -0
- package/src/contracts/deepbook_predict/pricing_config.ts +41 -0
- package/src/contracts/deepbook_predict/protocol_config.ts +1066 -0
- package/src/contracts/deepbook_predict/range_codec.ts +53 -0
- package/src/contracts/deepbook_predict/registry.ts +694 -0
- package/src/contracts/deepbook_predict/strike_exposure.ts +77 -0
- package/src/contracts/deepbook_predict/strike_exposure_config.ts +46 -0
- package/src/contracts/deepbook_predict/strike_payout_tree.ts +89 -0
- package/src/contracts/deepbook_predict/vault_events.ts +222 -0
- package/src/contracts/deepbook_sessions/config-arguments.ts +8 -0
- package/src/contracts/deepbook_sessions/deps/sui/vec_map.ts +33 -0
- package/src/contracts/deepbook_sessions/session_config.ts +130 -0
- package/src/contracts/deepbook_sessions/sessions.ts +663 -0
- package/src/contracts/margin_liquidation/liquidation_vault.ts +2 -4
- package/src/contracts/propbook/block_scholes_store.ts +842 -0
- package/src/contracts/propbook/deps/sui/table.ts +37 -0
- package/src/contracts/propbook/oracle_lane.ts +170 -0
- package/src/contracts/propbook/pyth_feed.ts +414 -0
- package/src/contracts/propbook/registry.ts +596 -0
- package/src/contracts/pyth/pyth.ts +2 -4
- package/src/deployments/index.ts +73 -0
- package/src/deployments/testnet.ts +107 -0
- package/src/deployments/types.ts +81 -0
- package/src/index.ts +5 -0
- package/src/predict/client.ts +941 -0
- package/src/predict/config/generated.ts +39 -0
- package/src/predict/config/index.ts +25 -0
- package/src/predict/config/testnet.ts +27 -0
- package/src/predict/config/types.ts +52 -0
- package/src/predict/decode.ts +476 -0
- package/src/predict/errors.ts +83 -0
- package/src/predict/index.ts +94 -0
- package/src/predict/pricing.ts +199 -0
- package/src/predict/reads/balances.ts +55 -0
- package/src/predict/reads/inspect.ts +78 -0
- package/src/predict/reads/markets.ts +222 -0
- package/src/predict/reads/parse.ts +30 -0
- package/src/predict/reads/pool.ts +37 -0
- package/src/predict/reads/positions.ts +144 -0
- package/src/predict/reads/pricing.ts +79 -0
- package/src/predict/ticks.ts +42 -0
- package/src/predict/tx/authed.ts +20 -0
- package/src/predict/tx/common.ts +92 -0
- package/src/predict/tx/trade.ts +183 -0
- package/src/predict/units.ts +49 -0
- package/src/sessions.ts +471 -0
- package/src/types/index.ts +1 -2
- package/src/utils/constants.ts +1 -7
- package/dist/types/bcs.mjs +0 -7
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { AccountWrapper } from "../../contracts/account/account.mjs";
|
|
2
|
+
import { deriveAccountWrapperIdFrom } from "../tx/common.mjs";
|
|
3
|
+
import { PositionKey, PredictData } from "../../contracts/deepbook_predict/predict_account.mjs";
|
|
4
|
+
import { bcs } from "@mysten/sui/bcs";
|
|
5
|
+
import { deriveDynamicFieldID, normalizeSuiAddress } from "@mysten/sui/utils";
|
|
6
|
+
|
|
7
|
+
//#region src/predict/reads/positions.ts
|
|
8
|
+
const PredictDataFieldBcs = bcs.struct("Field<DataKey,PredictData>", {
|
|
9
|
+
id: bcs.Address,
|
|
10
|
+
name: bcs.bool(),
|
|
11
|
+
value: PredictData
|
|
12
|
+
});
|
|
13
|
+
async function contentOf(client, objectId) {
|
|
14
|
+
try {
|
|
15
|
+
const { object } = await client.core.getObject({
|
|
16
|
+
objectId,
|
|
17
|
+
include: { content: true }
|
|
18
|
+
});
|
|
19
|
+
return object.content ?? null;
|
|
20
|
+
} catch (e) {
|
|
21
|
+
if (/not.?found|does not exist|deleted|NOT_FOUND/i.test(String(e))) return null;
|
|
22
|
+
throw e;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolve the immutable id chain for an owner's positions: wrapper → account
|
|
27
|
+
* UID → PredictData → positions Table. Returns null when the owner has never
|
|
28
|
+
* created a Predict account.
|
|
29
|
+
*/
|
|
30
|
+
async function resolvePositionsTable(client, config, owner) {
|
|
31
|
+
const wrapperContent = await contentOf(client, deriveAccountWrapperIdFrom(config, owner));
|
|
32
|
+
if (!wrapperContent) return null;
|
|
33
|
+
const accountUid = normalizeSuiAddress(AccountWrapper.parse(wrapperContent).account.account_id);
|
|
34
|
+
const fieldContent = await contentOf(client, deriveDynamicFieldID(accountUid, `${config.accountPackageId}::account::DataKey<${config.predictPackageId}::predict_account::PredictApp>`, new Uint8Array([0])));
|
|
35
|
+
if (!fieldContent) return {
|
|
36
|
+
accountUid,
|
|
37
|
+
positionsTableId: null,
|
|
38
|
+
positionCount: 0n
|
|
39
|
+
};
|
|
40
|
+
const data = PredictDataFieldBcs.parse(fieldContent).value;
|
|
41
|
+
return {
|
|
42
|
+
accountUid,
|
|
43
|
+
positionsTableId: normalizeSuiAddress(data.positions.id),
|
|
44
|
+
positionCount: data.positions.size
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* List open positions from a resolved positions Table: one call per page,
|
|
49
|
+
* keys parsed from the dynamic-field NAMES (no per-entry fetches).
|
|
50
|
+
*/
|
|
51
|
+
async function positionsFromTable(client, positionsTableId, opts = {}) {
|
|
52
|
+
const limit = opts.limit ?? 1e3;
|
|
53
|
+
const maxPages = opts.maxPages ?? 10;
|
|
54
|
+
const out = [];
|
|
55
|
+
let cursor = void 0;
|
|
56
|
+
for (let page = 0; page < maxPages; page++) {
|
|
57
|
+
const res = await client.core.listDynamicFields({
|
|
58
|
+
parentId: positionsTableId,
|
|
59
|
+
limit,
|
|
60
|
+
cursor
|
|
61
|
+
});
|
|
62
|
+
for (const entry of res.dynamicFields) {
|
|
63
|
+
const key = PositionKey.parse(entry.name.bcs);
|
|
64
|
+
out.push({
|
|
65
|
+
marketId: normalizeSuiAddress(key.expiry_market_id),
|
|
66
|
+
orderId: key.order_id
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (!res.hasNextPage || !res.cursor) return out;
|
|
70
|
+
cursor = res.cursor;
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`positions listing exceeded ${maxPages} pages (${out.length} so far) — raise maxPages`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { positionsFromTable, resolvePositionsTable };
|
|
77
|
+
//# sourceMappingURL=positions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"positions.mjs","names":[],"sources":["../../../src/predict/reads/positions.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { bcs } from '@mysten/sui/bcs';\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { deriveDynamicFieldID, normalizeSuiAddress } from '@mysten/sui/utils';\nimport { type GeneratedConfig } from '../config/generated.js';\nimport { deriveAccountWrapperIdFrom } from '../tx/common.js';\nimport { AccountWrapper } from '../../account.js';\nimport { PositionKey, PredictData } from '../../contracts/deepbook_predict/predict_account.js';\n\n// ============================================================================\n// Chain-only position enumeration.\n//\n// Every open position is tracked under the owner's account:\n// `predict_account::PredictData.positions` is a\n// `Table<PositionKey{expiry_market_id, order_id}, Position>` — and Table\n// entries are dynamic fields, so the KEYS (everything redeem/claim need)\n// arrive directly from a dynamic-field listing. No indexer, no simulation.\n//\n// The walk (all parsing is exact BCS via `include: {content: true}`; the account\n// and PredictData struct layouts come from the generated `contracts/*` MoveStructs\n// so they can't drift from the deployed `account`/`predict_account` sources):\n// 1. wrapper object (id derived client-side) → account UID\n// 2. derived DataKey<PredictApp> field object → positions Table id\n// 3. listDynamicFields(table) → PositionKey per entry\n// Steps 1-2 resolve ids that are immutable once created — cache them per\n// owner (the facade does) and steady state is ONE call per page of positions.\n// ============================================================================\n\n// sui::dynamic_field::Field<DataKey<PredictApp>, PredictData>. DataKey is\n// source-empty, but Move inserts a hidden `dummy_field: bool` into empty\n// structs — so the name occupies ONE zero byte between id and value (and the\n// same byte is the derived-field key, below). The `value` uses the generated\n// `PredictData` layout so it tracks the deployed struct.\nconst PredictDataFieldBcs = bcs.struct('Field<DataKey,PredictData>', {\n\tid: bcs.Address,\n\tname: bcs.bool(), // DataKey's hidden dummy_field\n\tvalue: PredictData,\n});\n\n/** One open position — the coordinates redeem/claim/hasPosition take. */\nexport interface OpenPosition {\n\tmarketId: string;\n\torderId: bigint;\n}\n\n/** Resolved-once ids for an owner's position store (cache these). */\nexport interface PositionsHandle {\n\taccountUid: string;\n\t/** Null until the account's Predict data exists (first trade/builder-code). */\n\tpositionsTableId: string | null;\n\t/** Open-position count at resolution time (from the Table's size). */\n\tpositionCount: bigint;\n}\n\nasync function contentOf(client: ClientWithCoreApi, objectId: string): Promise<Uint8Array | null> {\n\ttry {\n\t\tconst { object } = await client.core.getObject({ objectId, include: { content: true } });\n\t\treturn object.content ?? null;\n\t} catch (e) {\n\t\t// Only a genuinely absent object means \"no positions\" (never-onboarded\n\t\t// owner, or no Predict data yet). Anything else — transport failures,\n\t\t// rate limits — must surface, not silently read as an empty portfolio.\n\t\tif (/not.?found|does not exist|deleted|NOT_FOUND/i.test(String(e))) return null;\n\t\tthrow e;\n\t}\n}\n\n/**\n * Resolve the immutable id chain for an owner's positions: wrapper → account\n * UID → PredictData → positions Table. Returns null when the owner has never\n * created a Predict account.\n */\nexport async function resolvePositionsTable(\n\tclient: ClientWithCoreApi,\n\tconfig: GeneratedConfig,\n\towner: string,\n): Promise<PositionsHandle | null> {\n\tconst wrapperContent = await contentOf(client, deriveAccountWrapperIdFrom(config, owner));\n\tif (!wrapperContent) return null;\n\tconst accountUid = normalizeSuiAddress(AccountWrapper.parse(wrapperContent).account.account_id);\n\n\t// The PredictData field id is derivable — no listing needed for this hop.\n\tconst dataFieldId = deriveDynamicFieldID(\n\t\taccountUid,\n\t\t`${config.accountPackageId}::account::DataKey<${config.predictPackageId}::predict_account::PredictApp>`,\n\t\tnew Uint8Array([0]), // DataKey's hidden dummy_field: bool = false\n\t);\n\tconst fieldContent = await contentOf(client, dataFieldId);\n\tif (!fieldContent) return { accountUid, positionsTableId: null, positionCount: 0n };\n\n\tconst data = PredictDataFieldBcs.parse(fieldContent).value;\n\treturn {\n\t\taccountUid,\n\t\tpositionsTableId: normalizeSuiAddress(data.positions.id),\n\t\tpositionCount: data.positions.size,\n\t};\n}\n\n/**\n * List open positions from a resolved positions Table: one call per page,\n * keys parsed from the dynamic-field NAMES (no per-entry fetches).\n */\nexport async function positionsFromTable(\n\tclient: ClientWithCoreApi,\n\tpositionsTableId: string,\n\topts: { limit?: number; maxPages?: number } = {},\n): Promise<OpenPosition[]> {\n\tconst limit = opts.limit ?? 1000;\n\tconst maxPages = opts.maxPages ?? 10;\n\tconst out: OpenPosition[] = [];\n\tlet cursor: string | undefined = undefined;\n\tfor (let page = 0; page < maxPages; page++) {\n\t\tconst res = await client.core.listDynamicFields({\n\t\t\tparentId: positionsTableId,\n\t\t\tlimit,\n\t\t\tcursor,\n\t\t});\n\t\tfor (const entry of res.dynamicFields) {\n\t\t\tconst key = PositionKey.parse(entry.name.bcs);\n\t\t\tout.push({\n\t\t\t\tmarketId: normalizeSuiAddress(key.expiry_market_id),\n\t\t\t\torderId: key.order_id,\n\t\t\t});\n\t\t}\n\t\tif (!res.hasNextPage || !res.cursor) return out;\n\t\tcursor = res.cursor;\n\t}\n\tthrow new Error(\n\t\t`positions listing exceeded ${maxPages} pages (${out.length} so far) — raise maxPages`,\n\t);\n}\n\n/** Convenience: resolve + list in one call (uncached; the facade caches). */\nexport async function positions(\n\tclient: ClientWithCoreApi,\n\tconfig: GeneratedConfig,\n\towner: string,\n\topts: { limit?: number; maxPages?: number } = {},\n): Promise<OpenPosition[]> {\n\tconst handle = await resolvePositionsTable(client, config, owner);\n\tif (!handle?.positionsTableId) return [];\n\treturn positionsFromTable(client, handle.positionsTableId, opts);\n}\n"],"mappings":";;;;;;;AAkCA,MAAM,sBAAsB,IAAI,OAAO,8BAA8B;CACpE,IAAI,IAAI;CACR,MAAM,IAAI,MAAM;CAChB,OAAO;CACP,CAAC;AAiBF,eAAe,UAAU,QAA2B,UAA8C;AACjG,KAAI;EACH,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,UAAU;GAAE;GAAU,SAAS,EAAE,SAAS,MAAM;GAAE,CAAC;AACxF,SAAO,OAAO,WAAW;UACjB,GAAG;AAIX,MAAI,+CAA+C,KAAK,OAAO,EAAE,CAAC,CAAE,QAAO;AAC3E,QAAM;;;;;;;;AASR,eAAsB,sBACrB,QACA,QACA,OACkC;CAClC,MAAM,iBAAiB,MAAM,UAAU,QAAQ,2BAA2B,QAAQ,MAAM,CAAC;AACzF,KAAI,CAAC,eAAgB,QAAO;CAC5B,MAAM,aAAa,oBAAoB,eAAe,MAAM,eAAe,CAAC,QAAQ,WAAW;CAQ/F,MAAM,eAAe,MAAM,UAAU,QALjB,qBACnB,YACA,GAAG,OAAO,iBAAiB,qBAAqB,OAAO,iBAAiB,iCACxE,IAAI,WAAW,CAAC,EAAE,CAAC,CACnB,CACwD;AACzD,KAAI,CAAC,aAAc,QAAO;EAAE;EAAY,kBAAkB;EAAM,eAAe;EAAI;CAEnF,MAAM,OAAO,oBAAoB,MAAM,aAAa,CAAC;AACrD,QAAO;EACN;EACA,kBAAkB,oBAAoB,KAAK,UAAU,GAAG;EACxD,eAAe,KAAK,UAAU;EAC9B;;;;;;AAOF,eAAsB,mBACrB,QACA,kBACA,OAA8C,EAAE,EACtB;CAC1B,MAAM,QAAQ,KAAK,SAAS;CAC5B,MAAM,WAAW,KAAK,YAAY;CAClC,MAAM,MAAsB,EAAE;CAC9B,IAAI,SAA6B;AACjC,MAAK,IAAI,OAAO,GAAG,OAAO,UAAU,QAAQ;EAC3C,MAAM,MAAM,MAAM,OAAO,KAAK,kBAAkB;GAC/C,UAAU;GACV;GACA;GACA,CAAC;AACF,OAAK,MAAM,SAAS,IAAI,eAAe;GACtC,MAAM,MAAM,YAAY,MAAM,MAAM,KAAK,IAAI;AAC7C,OAAI,KAAK;IACR,UAAU,oBAAoB,IAAI,iBAAiB;IACnD,SAAS,IAAI;IACb,CAAC;;AAEH,MAAI,CAAC,IAAI,eAAe,CAAC,IAAI,OAAQ,QAAO;AAC5C,WAAS,IAAI;;AAEd,OAAM,IAAI,MACT,8BAA8B,SAAS,UAAU,IAAI,OAAO,2BAC5D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import "../config/generated.mjs";
|
|
2
|
+
import { PricerInputs } from "../pricing.mjs";
|
|
3
|
+
import "../tx/trade.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/predict/reads/pricing.d.ts
|
|
6
|
+
/** A resolved pricer snapshot read from the chain: the decimal forward + rolled SVI the
|
|
7
|
+
* client-side math consumes, plus the oracle source timestamps behind it (ms; for
|
|
8
|
+
* staleness display — Pyth is 0 when no usable spot existed). The Block-Scholes entries are
|
|
9
|
+
* batch ENVELOPE times (what freshness and the SVI roll-down anchor on), not model times. */
|
|
10
|
+
interface PricerSnapshot extends PricerInputs {
|
|
11
|
+
sources: {
|
|
12
|
+
pythSpotMs: number;
|
|
13
|
+
blockScholesSpotMs: number;
|
|
14
|
+
blockScholesForwardMs: number;
|
|
15
|
+
blockScholesSviMs: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { PricerSnapshot };
|
|
20
|
+
//# sourceMappingURL=pricing.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.mts","names":[],"sources":["../../../src/predict/reads/pricing.ts"],"mappings":";;;;;;AA0BA;;;UAAiB,cAAA,SAAuB,YAAA;EACvC,OAAA;IACC,UAAA;IACA,kBAAA;IACA,qBAAA;IACA,iBAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { inspectReturns } from "./inspect.mjs";
|
|
2
|
+
import { loadLivePricer } from "../tx/trade.mjs";
|
|
3
|
+
import { Pricer } from "../../contracts/deepbook_predict/pricing.mjs";
|
|
4
|
+
import { Transaction } from "@mysten/sui/transactions";
|
|
5
|
+
|
|
6
|
+
//#region src/predict/reads/pricing.ts
|
|
7
|
+
const FORWARD_SCALE = 1e9;
|
|
8
|
+
const AB_SCALE = 0xde0b6b3a7640000;
|
|
9
|
+
const RMS_SCALE = 1e9;
|
|
10
|
+
const i64 = (v) => (v.is_negative ? -1 : 1) * Number(v.magnitude);
|
|
11
|
+
function decodePricer(pricer) {
|
|
12
|
+
const s = pricer.svi;
|
|
13
|
+
const svi = {
|
|
14
|
+
a: (s.a_is_negative ? -1 : 1) * Number(s.a_magnitude) / AB_SCALE,
|
|
15
|
+
b: Number(s.b) / AB_SCALE,
|
|
16
|
+
rho: i64(s.rho) / RMS_SCALE,
|
|
17
|
+
m: i64(s.m) / RMS_SCALE,
|
|
18
|
+
sigma: Number(s.sigma) / RMS_SCALE
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
forward: Number(pricer.forward) / FORWARD_SCALE,
|
|
22
|
+
svi,
|
|
23
|
+
sources: {
|
|
24
|
+
pythSpotMs: Number(pricer.pyth_spot_source_timestamp_ms),
|
|
25
|
+
blockScholesSpotMs: Number(pricer.block_scholes_spot_source_timestamp_ms),
|
|
26
|
+
blockScholesForwardMs: Number(pricer.block_scholes_forward_source_timestamp_ms),
|
|
27
|
+
blockScholesSviMs: Number(pricer.block_scholes_svi_source_timestamp_ms)
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function readPricerSnapshot(client, config, marketId, feeds) {
|
|
32
|
+
const tx = new Transaction();
|
|
33
|
+
tx.add(loadLivePricer(config, {
|
|
34
|
+
expiryMarketId: marketId,
|
|
35
|
+
...feeds
|
|
36
|
+
}));
|
|
37
|
+
const [cmd0] = await inspectReturns(client, tx);
|
|
38
|
+
return decodePricer(Pricer.parse(cmd0[0]));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { readPricerSnapshot };
|
|
43
|
+
//# sourceMappingURL=pricing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.mjs","names":[],"sources":["../../../src/predict/reads/pricing.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { Transaction } from '@mysten/sui/transactions';\nimport { type GeneratedConfig } from '../config/generated.js';\nimport { Pricer } from '../../contracts/deepbook_predict/pricing.js';\nimport type { PricerInputs, Svi } from '../pricing.js';\nimport { loadLivePricer, type MarketFeeds } from '../tx/trade.js';\nimport { inspectReturns, type ReadClient } from './inspect.js';\n\n// The chain's fixed-point scales for the rolled `PricingSVI` (see the generated\n// `Pricer`/`PricingSVI` struct): forward and rho/m/sigma at 1e9; the rolled `a`/`b` land\n// at 1e18 (roll_down multiplies the 1e9 raw by an extra 1e9). Converting to `number`\n// (float) is deliberate — this is a display pricer; a is a variance ~O(1e-2), so f64's\n// ~15 significant digits are ample and, per pricing.ts, more precise than the chain's\n// fixed point on the short-dated surfaces this prices.\nconst FORWARD_SCALE = 1e9;\nconst AB_SCALE = 1e18;\nconst RMS_SCALE = 1e9; // rho, m, sigma\n\nconst i64 = (v: { magnitude: string | number | bigint; is_negative: boolean }): number =>\n\t(v.is_negative ? -1 : 1) * Number(v.magnitude);\n\n/** A resolved pricer snapshot read from the chain: the decimal forward + rolled SVI the\n * client-side math consumes, plus the oracle source timestamps behind it (ms; for\n * staleness display — Pyth is 0 when no usable spot existed). The Block-Scholes entries are\n * batch ENVELOPE times (what freshness and the SVI roll-down anchor on), not model times. */\nexport interface PricerSnapshot extends PricerInputs {\n\tsources: {\n\t\tpythSpotMs: number;\n\t\tblockScholesSpotMs: number;\n\t\tblockScholesForwardMs: number;\n\t\tblockScholesSviMs: number;\n\t};\n}\n\n// Decode a `Pricer` (already forward-resolved + roll-down-applied on-chain) into decimal\n// `PricerInputs`. Signed fields (`a`, `rho`, `m`) carry the magnitude/flag pair the chain\n// uses; `b`/`sigma` are non-negative.\nfunction decodePricer(pricer: ReturnType<typeof Pricer.parse>): PricerSnapshot {\n\tconst s = pricer.svi;\n\tconst svi: Svi = {\n\t\ta: ((s.a_is_negative ? -1 : 1) * Number(s.a_magnitude)) / AB_SCALE,\n\t\tb: Number(s.b) / AB_SCALE,\n\t\trho: i64(s.rho) / RMS_SCALE,\n\t\tm: i64(s.m) / RMS_SCALE,\n\t\tsigma: Number(s.sigma) / RMS_SCALE,\n\t};\n\treturn {\n\t\tforward: Number(pricer.forward) / FORWARD_SCALE,\n\t\tsvi,\n\t\tsources: {\n\t\t\tpythSpotMs: Number(pricer.pyth_spot_source_timestamp_ms),\n\t\t\tblockScholesSpotMs: Number(pricer.block_scholes_spot_source_timestamp_ms),\n\t\t\tblockScholesForwardMs: Number(pricer.block_scholes_forward_source_timestamp_ms),\n\t\t\tblockScholesSviMs: Number(pricer.block_scholes_svi_source_timestamp_ms),\n\t\t},\n\t};\n}\n\n// Read one live pricer snapshot for `marketId`: a single simulate of\n// `load_live_pricer` — the chain reads the oracle feeds, picks the forward\n// (Pyth-vs-Block-Scholes admin policy + freshness), and rolls the SVI down to now, then\n// returns the whole `Pricer` by value (copy+drop), whose BCS we decode. One round trip;\n// then a `boardPricer` prices every strike locally.\n//\n// `load_live_pricer` ABORTS (a typed PredictMoveError) when the market is expired, a feed\n// is stale, or the surface fails the pricing-safe envelope — i.e. exactly when the chain\n// itself cannot quote. Callers surface that the same way `read.price` does.\nexport async function readPricerSnapshot(\n\tclient: ReadClient,\n\tconfig: GeneratedConfig,\n\tmarketId: string,\n\tfeeds: MarketFeeds,\n): Promise<PricerSnapshot> {\n\tconst tx = new Transaction();\n\ttx.add(loadLivePricer(config, { expiryMarketId: marketId, ...feeds }));\n\tconst [cmd0] = await inspectReturns(client, tx);\n\treturn decodePricer(Pricer.parse(cmd0[0]));\n}\n"],"mappings":";;;;;;AAeA,MAAM,gBAAgB;AACtB,MAAM,WAAW;AACjB,MAAM,YAAY;AAElB,MAAM,OAAO,OACX,EAAE,cAAc,KAAK,KAAK,OAAO,EAAE,UAAU;AAkB/C,SAAS,aAAa,QAAyD;CAC9E,MAAM,IAAI,OAAO;CACjB,MAAM,MAAW;EAChB,IAAK,EAAE,gBAAgB,KAAK,KAAK,OAAO,EAAE,YAAY,GAAI;EAC1D,GAAG,OAAO,EAAE,EAAE,GAAG;EACjB,KAAK,IAAI,EAAE,IAAI,GAAG;EAClB,GAAG,IAAI,EAAE,EAAE,GAAG;EACd,OAAO,OAAO,EAAE,MAAM,GAAG;EACzB;AACD,QAAO;EACN,SAAS,OAAO,OAAO,QAAQ,GAAG;EAClC;EACA,SAAS;GACR,YAAY,OAAO,OAAO,8BAA8B;GACxD,oBAAoB,OAAO,OAAO,uCAAuC;GACzE,uBAAuB,OAAO,OAAO,0CAA0C;GAC/E,mBAAmB,OAAO,OAAO,sCAAsC;GACvE;EACD;;AAYF,eAAsB,mBACrB,QACA,QACA,UACA,OAC0B;CAC1B,MAAM,KAAK,IAAI,aAAa;AAC5B,IAAG,IAAI,eAAe,QAAQ;EAAE,gBAAgB;EAAU,GAAG;EAAO,CAAC,CAAC;CACtE,MAAM,CAAC,QAAQ,MAAM,eAAe,QAAQ,GAAG;AAC/C,QAAO,aAAa,OAAO,MAAM,KAAK,GAAG,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/predict/ticks.d.ts
|
|
2
|
+
/** +inf sentinel tick: the upper bound of an UP range. */
|
|
3
|
+
declare const POS_INF_TICK: bigint;
|
|
4
|
+
type Side = 'up' | 'down';
|
|
5
|
+
declare function binaryRangeTicks(strikeRaw: bigint, side: Side, tickSize: bigint): {
|
|
6
|
+
lowerTick: bigint;
|
|
7
|
+
higherTick: bigint;
|
|
8
|
+
};
|
|
9
|
+
//#endregion
|
|
10
|
+
export { POS_INF_TICK, Side, binaryRangeTicks };
|
|
11
|
+
//# sourceMappingURL=ticks.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticks.d.mts","names":[],"sources":["../../src/predict/ticks.ts"],"mappings":";;cAOa,YAAA;AAAA,KAED,IAAA;AAAA,iBAOI,gBAAA,CACf,SAAA,UACA,IAAA,EAAM,IAAA,EACN,QAAA;EACI,SAAA;EAAmB,UAAA;AAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PredictInputError } from "./errors.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/predict/ticks.ts
|
|
4
|
+
const TICK_BITS = 30n;
|
|
5
|
+
/** +inf sentinel tick: the upper bound of an UP range. */
|
|
6
|
+
const POS_INF_TICK = (1n << TICK_BITS) - 1n;
|
|
7
|
+
function binaryRangeTicks(strikeRaw, side, tickSize) {
|
|
8
|
+
if (side !== "up" && side !== "down") throw new PredictInputError(`side must be 'up' or 'down', got ${JSON.stringify(side)}`);
|
|
9
|
+
const tick = strikeRaw / tickSize;
|
|
10
|
+
if (tick * tickSize !== strikeRaw) throw new PredictInputError(`strike ${strikeRaw} is not a whole tick multiple of ${tickSize}`);
|
|
11
|
+
if (tick <= 0n || tick >= POS_INF_TICK) throw new PredictInputError(`strike tick ${tick} outside the finite tick domain (1..POS_INF_TICK-1)`);
|
|
12
|
+
const isUp = side === "up";
|
|
13
|
+
return {
|
|
14
|
+
lowerTick: isUp ? tick : 0n,
|
|
15
|
+
higherTick: isUp ? POS_INF_TICK : tick
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { POS_INF_TICK, binaryRangeTicks };
|
|
21
|
+
//# sourceMappingURL=ticks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticks.mjs","names":[],"sources":["../../src/predict/ticks.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { PredictInputError } from './errors.js';\n\nconst TICK_BITS = 30n;\n\n/** +inf sentinel tick: the upper bound of an UP range. */\nexport const POS_INF_TICK = (1n << TICK_BITS) - 1n;\n\nexport type Side = 'up' | 'down';\n\n// Convert a raw binary-range strike to the `(lower_tick, higher_tick)` pair the\n// `mint` entrypoint takes directly (there is no standalone packed range key).\n// An UP order is `(strike, +inf)` -> lower_tick = strike/tick_size, higher_tick =\n// POS_INF_TICK; a DOWN order is `(-inf, strike)` -> lower_tick = 0 (neg-inf),\n// higher_tick = strike/tick_size.\nexport function binaryRangeTicks(\n\tstrikeRaw: bigint,\n\tside: Side,\n\ttickSize: bigint,\n): { lowerTick: bigint; higherTick: bigint } {\n\t// Anything not exactly 'up' used to fall through to DOWN, byte-identical to a real\n\t// down mint — no build error, no simulate error, no chain abort. `side` arrives from UI\n\t// state, JSON, or a DB column at runtime, where the literal type does not protect.\n\tif (side !== 'up' && side !== 'down') {\n\t\tthrow new PredictInputError(`side must be 'up' or 'down', got ${JSON.stringify(side)}`);\n\t}\n\tconst tick = strikeRaw / tickSize;\n\tif (tick * tickSize !== strikeRaw) {\n\t\tthrow new PredictInputError(`strike ${strikeRaw} is not a whole tick multiple of ${tickSize}`);\n\t}\n\tif (tick <= 0n || tick >= POS_INF_TICK) {\n\t\tthrow new PredictInputError(\n\t\t\t`strike tick ${tick} outside the finite tick domain (1..POS_INF_TICK-1)`,\n\t\t);\n\t}\n\tconst isUp = side === 'up';\n\treturn {\n\t\tlowerTick: isUp ? tick : 0n,\n\t\thigherTick: isUp ? POS_INF_TICK : tick,\n\t};\n}\n"],"mappings":";;;AAIA,MAAM,YAAY;;AAGlB,MAAa,gBAAgB,MAAM,aAAa;AAShD,SAAgB,iBACf,WACA,MACA,UAC4C;AAI5C,KAAI,SAAS,QAAQ,SAAS,OAC7B,OAAM,IAAI,kBAAkB,oCAAoC,KAAK,UAAU,KAAK,GAAG;CAExF,MAAM,OAAO,YAAY;AACzB,KAAI,OAAO,aAAa,UACvB,OAAM,IAAI,kBAAkB,UAAU,UAAU,mCAAmC,WAAW;AAE/F,KAAI,QAAQ,MAAM,QAAQ,aACzB,OAAM,IAAI,kBACT,eAAe,KAAK,qDACpB;CAEF,MAAM,OAAO,SAAS;AACtB,QAAO;EACN,WAAW,OAAO,OAAO;EACzB,YAAY,OAAO,eAAe;EAClC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { depositFunds as depositFunds$1, withdrawFunds as withdrawFunds$1 } from "../../contracts/account/account.mjs";
|
|
2
|
+
import { withAuth } from "./common.mjs";
|
|
3
|
+
import { setBuilderCode as setBuilderCode$1, unsetBuilderCode as unsetBuilderCode$1 } from "../../contracts/deepbook_predict/predict_account.mjs";
|
|
4
|
+
import { cancelSupplyRequest as cancelSupplyRequest$1, cancelWithdrawRequest as cancelWithdrawRequest$1, requestSupply as requestSupply$1, requestWithdraw as requestWithdraw$1 } from "../../contracts/deepbook_predict/plp.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/predict/tx/authed.ts
|
|
7
|
+
const depositFunds = withAuth(depositFunds$1);
|
|
8
|
+
const withdrawFunds = withAuth(withdrawFunds$1);
|
|
9
|
+
const requestSupply = withAuth(requestSupply$1);
|
|
10
|
+
const requestWithdraw = withAuth(requestWithdraw$1);
|
|
11
|
+
const cancelSupplyRequest = withAuth(cancelSupplyRequest$1);
|
|
12
|
+
const cancelWithdrawRequest = withAuth(cancelWithdrawRequest$1);
|
|
13
|
+
const setBuilderCode = withAuth(setBuilderCode$1);
|
|
14
|
+
const unsetBuilderCode = withAuth(unsetBuilderCode$1);
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { cancelSupplyRequest, cancelWithdrawRequest, depositFunds, requestSupply, requestWithdraw, setBuilderCode, unsetBuilderCode, withdrawFunds };
|
|
18
|
+
//# sourceMappingURL=authed.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authed.mjs","names":["account.depositFunds","account.withdrawFunds","plp.requestSupply","plp.requestWithdraw","plp.cancelSupplyRequest","plp.cancelWithdrawRequest","predictAccount.setBuilderCode","predictAccount.unsetBuilderCode"],"sources":["../../../src/predict/tx/authed.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { accountMoveCalls as account } from '../../account.js';\nimport * as plp from '../../contracts/deepbook_predict/plp.js';\nimport * as predictAccount from '../../contracts/deepbook_predict/predict_account.js';\nimport { withAuth } from './common.js';\n\n// Every owner-authorized single call in this SDK, declared rather than written: `withAuth`\n// prepends the `generate_auth` command and fills the generated `auth` argument, so each of these\n// takes exactly its generated options minus that slot. Command order is always auth → call, the\n// call consuming the hot potato. The builder-code pair lives in the PREDICT package's\n// `predict_account` module, not the account package.\nexport const depositFunds = withAuth(account.depositFunds);\nexport const withdrawFunds = withAuth(account.withdrawFunds);\nexport const requestSupply = withAuth(plp.requestSupply);\nexport const requestWithdraw = withAuth(plp.requestWithdraw);\nexport const cancelSupplyRequest = withAuth(plp.cancelSupplyRequest);\nexport const cancelWithdrawRequest = withAuth(plp.cancelWithdrawRequest);\nexport const setBuilderCode = withAuth(predictAccount.setBuilderCode);\nexport const unsetBuilderCode = withAuth(predictAccount.unsetBuilderCode);\n"],"mappings":";;;;;;AAYA,MAAa,eAAe,SAASA,eAAqB;AAC1D,MAAa,gBAAgB,SAASC,gBAAsB;AAC5D,MAAa,gBAAgB,SAASC,gBAAkB;AACxD,MAAa,kBAAkB,SAASC,kBAAoB;AAC5D,MAAa,sBAAsB,SAASC,sBAAwB;AACpE,MAAa,wBAAwB,SAASC,wBAA0B;AACxE,MAAa,iBAAiB,SAASC,iBAA8B;AACrE,MAAa,mBAAmB,SAASC,mBAAgC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "../../account.mjs";
|
|
2
|
+
import { PredictConfig } from "../config/types.mjs";
|
|
3
|
+
import "../config/generated.mjs";
|
|
4
|
+
import { Transaction, TransactionArgument, TransactionResult } from "@mysten/sui/transactions";
|
|
5
|
+
|
|
6
|
+
//#region src/predict/tx/common.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Owner authority is a hot-potato `Auth` minted from the tx sender (`ctx` is implicit in a PTB)
|
|
9
|
+
* and consumed by the very next account-loading call (`load_account_mut` inside `deposit_funds` /
|
|
10
|
+
* `withdraw_funds` / `mint` / …). It resolves to owner auth for whoever signs the transaction.
|
|
11
|
+
* See `packages/account/sources/account.move`.
|
|
12
|
+
*/
|
|
13
|
+
declare function generateAuth(cfg: PredictConfig): (tx: Transaction) => TransactionResult;
|
|
14
|
+
/** The deterministic id of an owner's canonical account wrapper — no chain read needed. */
|
|
15
|
+
declare function deriveAccountWrapperId(cfg: PredictConfig, owner: string): string;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { deriveAccountWrapperId, generateAuth };
|
|
18
|
+
//# sourceMappingURL=common.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.mts","names":[],"sources":["../../../src/predict/tx/common.ts"],"mappings":";;;;;;;AAwBA;;;;;iBAAgB,YAAA,CAAa,GAAA,EAAK,aAAA,IAAiB,EAAA,EAAI,WAAA,KAAgB,iBAAA;;iBAiEvD,sBAAA,CAAuB,GAAA,EAAK,aAAA,EAAe,KAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { generateAuth as generateAuth$1 } from "../../contracts/account/account.mjs";
|
|
2
|
+
import { AccountContract } from "../../account.mjs";
|
|
3
|
+
import { toGeneratedConfig } from "../config/generated.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/predict/tx/common.ts
|
|
6
|
+
function accountContract(cfg) {
|
|
7
|
+
return new AccountContract({
|
|
8
|
+
accountPackageId: cfg.packages.account,
|
|
9
|
+
accountRegistry: cfg.objects.accountRegistry
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Owner authority is a hot-potato `Auth` minted from the tx sender (`ctx` is implicit in a PTB)
|
|
14
|
+
* and consumed by the very next account-loading call (`load_account_mut` inside `deposit_funds` /
|
|
15
|
+
* `withdraw_funds` / `mint` / …). It resolves to owner auth for whoever signs the transaction.
|
|
16
|
+
* See `packages/account/sources/account.move`.
|
|
17
|
+
*/
|
|
18
|
+
function generateAuth(cfg) {
|
|
19
|
+
return generateAuth$1({ config: toGeneratedConfig(cfg) });
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Every owner-authorized call in this SDK is the same two commands — mint the hot-potato `Auth`,
|
|
23
|
+
* then make the generated call that consumes it. This lifts a generated binding into that pair,
|
|
24
|
+
* so such a builder is declared rather than written: `withAuth(account.depositFunds)` takes
|
|
25
|
+
* `deposit_funds`'s own options with the `auth` slot already filled.
|
|
26
|
+
*/
|
|
27
|
+
function withAuth(call) {
|
|
28
|
+
return (options) => (tx) => {
|
|
29
|
+
const auth = tx.add(generateAuth$1({ config: options.config }));
|
|
30
|
+
return tx.add(call({
|
|
31
|
+
...options,
|
|
32
|
+
arguments: {
|
|
33
|
+
...options.arguments,
|
|
34
|
+
auth
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function deriveAccountWrapperIdFrom(config, owner) {
|
|
40
|
+
return new AccountContract({
|
|
41
|
+
accountPackageId: config.accountPackageId,
|
|
42
|
+
accountRegistry: config.accountRegistry
|
|
43
|
+
}).deriveAccountWrapperId(owner);
|
|
44
|
+
}
|
|
45
|
+
/** The deterministic id of an owner's canonical account wrapper — no chain read needed. */
|
|
46
|
+
function deriveAccountWrapperId(cfg, owner) {
|
|
47
|
+
return deriveAccountWrapperIdFrom(toGeneratedConfig(cfg), owner);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { accountContract, deriveAccountWrapperId, deriveAccountWrapperIdFrom, generateAuth, withAuth };
|
|
52
|
+
//# sourceMappingURL=common.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.mjs","names":["account.generateAuth"],"sources":["../../../src/predict/tx/common.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport type { Transaction, TransactionArgument, TransactionResult } from '@mysten/sui/transactions';\nimport { toGeneratedConfig, type GeneratedConfig } from '../config/generated.js';\nimport type { PredictConfig } from '../config/index.js';\nimport { AccountContract, accountMoveCalls as account } from '../../account.js';\n\n// Predict's accounts ARE the shared on-chain account primitive (`packages/account`), so the\n// builders live in `@mysten/deepbook-v3/account` and this is the thin adapter that drives them with\n// Predict's deployed ids. The generated thunks are still used directly by `withAuth` below, which\n// wraps Predict's own entrypoints too — those take the same `Auth` hot potato.\nexport function accountContract(cfg: PredictConfig): AccountContract {\n\treturn new AccountContract({\n\t\taccountPackageId: cfg.packages.account,\n\t\taccountRegistry: cfg.objects.accountRegistry,\n\t});\n}\n\n/**\n * Owner authority is a hot-potato `Auth` minted from the tx sender (`ctx` is implicit in a PTB)\n * and consumed by the very next account-loading call (`load_account_mut` inside `deposit_funds` /\n * `withdraw_funds` / `mint` / …). It resolves to owner auth for whoever signs the transaction.\n * See `packages/account/sources/account.move`.\n */\nexport function generateAuth(cfg: PredictConfig): (tx: Transaction) => TransactionResult {\n\treturn account.generateAuth({ config: toGeneratedConfig(cfg) });\n}\n\n// The shape every generated binding shares: options in, one PTB command out.\ntype GeneratedCall<Options> = (options: Options) => (tx: Transaction) => TransactionResult;\n\n// The generated options of a call that consumes the hot-potato `Auth`. Codegen types\n// `arguments` as the named form OR a positional tuple; only the named form is used here.\ninterface AuthCallOptions {\n\targuments: { auth: TransactionArgument } | readonly unknown[];\n\tconfig?: object;\n\tpackage?: string;\n}\n\n// The named-`arguments` arm of such an options type (the tuple arm has no `auth` property).\ntype NamedArguments<Options extends AuthCallOptions> = Extract<\n\tOptions['arguments'],\n\t{ auth: TransactionArgument }\n>;\n\n/**\n * The options {@link withAuth} leaves to the caller: the generated ones, minus the `auth`\n * argument it supplies itself, with the projected config required (it is what mints the auth).\n */\nexport type WithAuthOptions<Options extends AuthCallOptions> = Omit<\n\tOptions,\n\t'arguments' | 'config'\n> & {\n\tconfig: GeneratedConfig;\n\targuments: Omit<NamedArguments<Options>, 'auth'>;\n};\n\n/**\n * Every owner-authorized call in this SDK is the same two commands — mint the hot-potato `Auth`,\n * then make the generated call that consumes it. This lifts a generated binding into that pair,\n * so such a builder is declared rather than written: `withAuth(account.depositFunds)` takes\n * `deposit_funds`'s own options with the `auth` slot already filled.\n */\nexport function withAuth<Options extends AuthCallOptions>(\n\tcall: GeneratedCall<Options>,\n): (options: WithAuthOptions<Options>) => (tx: Transaction) => TransactionResult {\n\treturn (options) => (tx) => {\n\t\tconst auth = tx.add(account.generateAuth({ config: options.config }));\n\t\t// The one unchecked step: with `Options` still generic, TS cannot see that putting `auth`\n\t\t// back makes the arguments whole again. Callers get the fully checked type above.\n\t\treturn tx.add(\n\t\t\tcall({ ...options, arguments: { ...options.arguments, auth } } as unknown as Options),\n\t\t);\n\t};\n}\n\n// The derivation must agree with on-chain `derive_address`, so it is owned in one place:\n// `@mysten/deepbook-v3/account`. This projects Predict's config onto that contract.\nexport function deriveAccountWrapperIdFrom(\n\tconfig: Pick<GeneratedConfig, 'accountRegistry' | 'accountPackageId'>,\n\towner: string,\n): string {\n\treturn new AccountContract({\n\t\taccountPackageId: config.accountPackageId,\n\t\taccountRegistry: config.accountRegistry,\n\t}).deriveAccountWrapperId(owner);\n}\n\n/** The deterministic id of an owner's canonical account wrapper — no chain read needed. */\nexport function deriveAccountWrapperId(cfg: PredictConfig, owner: string): string {\n\treturn deriveAccountWrapperIdFrom(toGeneratedConfig(cfg), owner);\n}\n"],"mappings":";;;;;AAWA,SAAgB,gBAAgB,KAAqC;AACpE,QAAO,IAAI,gBAAgB;EAC1B,kBAAkB,IAAI,SAAS;EAC/B,iBAAiB,IAAI,QAAQ;EAC7B,CAAC;;;;;;;;AASH,SAAgB,aAAa,KAA4D;AACxF,QAAOA,eAAqB,EAAE,QAAQ,kBAAkB,IAAI,EAAE,CAAC;;;;;;;;AAsChE,SAAgB,SACf,MACgF;AAChF,SAAQ,aAAa,OAAO;EAC3B,MAAM,OAAO,GAAG,IAAIA,eAAqB,EAAE,QAAQ,QAAQ,QAAQ,CAAC,CAAC;AAGrE,SAAO,GAAG,IACT,KAAK;GAAE,GAAG;GAAS,WAAW;IAAE,GAAG,QAAQ;IAAW;IAAM;GAAE,CAAuB,CACrF;;;AAMH,SAAgB,2BACf,QACA,OACS;AACT,QAAO,IAAI,gBAAgB;EAC1B,kBAAkB,OAAO;EACzB,iBAAiB,OAAO;EACxB,CAAC,CAAC,uBAAuB,MAAM;;;AAIjC,SAAgB,uBAAuB,KAAoB,OAAuB;AACjF,QAAO,2BAA2B,kBAAkB,IAAI,EAAE,MAAM"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { GeneratedConfig } from "../config/generated.mjs";
|
|
2
|
+
import { Transaction, TransactionResult } from "@mysten/sui/transactions";
|
|
3
|
+
|
|
4
|
+
//#region src/predict/tx/trade.d.ts
|
|
5
|
+
interface MarketFeeds {
|
|
6
|
+
pythFeed: string;
|
|
7
|
+
blockScholesValueStore: string;
|
|
8
|
+
blockScholesSviStore: string;
|
|
9
|
+
}
|
|
10
|
+
declare function loadLivePricer(config: GeneratedConfig, args: {
|
|
11
|
+
expiryMarketId: string;
|
|
12
|
+
} & MarketFeeds): (tx: Transaction) => TransactionResult;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { MarketFeeds, loadLivePricer };
|
|
15
|
+
//# sourceMappingURL=trade.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.d.mts","names":[],"sources":["../../../src/predict/tx/trade.ts"],"mappings":";;;;UAoBiB,WAAA;EAChB,QAAA;EACA,sBAAA;EACA,oBAAA;AAAA;AAAA,iBAQe,cAAA,CACf,MAAA,EAAQ,eAAA,EACR,IAAA;EAAQ,cAAA;AAAA,IAA2B,WAAA,IAChC,EAAA,EAAI,WAAA,KAAgB,iBAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { U64_MAX } from "../units.mjs";
|
|
2
|
+
import { withAuth } from "./common.mjs";
|
|
3
|
+
import { loadLivePricer as loadLivePricer$1, mintExactAmount as mintExactAmount$1, mintExactQuantity as mintExactQuantity$1, redeemLive as redeemLive$1, redeemSettled as redeemSettled$1 } from "../../contracts/deepbook_predict/expiry_market.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/predict/tx/trade.ts
|
|
6
|
+
const authed = {
|
|
7
|
+
mintExactQuantity: withAuth(mintExactQuantity$1),
|
|
8
|
+
mintExactAmount: withAuth(mintExactAmount$1),
|
|
9
|
+
redeemLive: withAuth(redeemLive$1),
|
|
10
|
+
redeemSettled: withAuth(redeemSettled$1)
|
|
11
|
+
};
|
|
12
|
+
function loadLivePricer(config, args) {
|
|
13
|
+
return (tx) => tx.add(loadLivePricer$1({
|
|
14
|
+
config,
|
|
15
|
+
arguments: {
|
|
16
|
+
market: args.expiryMarketId,
|
|
17
|
+
pyth: args.pythFeed,
|
|
18
|
+
bsValues: args.blockScholesValueStore,
|
|
19
|
+
bsSvi: args.blockScholesSviStore
|
|
20
|
+
}
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
function liveTrade(config, args, build) {
|
|
24
|
+
return (tx) => {
|
|
25
|
+
const pricer = tx.add(loadLivePricer(config, args));
|
|
26
|
+
return tx.add(build(pricer));
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function mintExactQuantity(config, args) {
|
|
30
|
+
return liveTrade(config, args, (pricer) => authed.mintExactQuantity({
|
|
31
|
+
config,
|
|
32
|
+
arguments: {
|
|
33
|
+
market: args.expiryMarketId,
|
|
34
|
+
wrapper: args.wrapperId,
|
|
35
|
+
pricer,
|
|
36
|
+
lowerTick: args.lowerTick,
|
|
37
|
+
higherTick: args.higherTick,
|
|
38
|
+
quantity: args.quantityRaw,
|
|
39
|
+
maxCost: args.maxCostRaw ?? U64_MAX,
|
|
40
|
+
maxProbability: args.maxProbabilityRaw ?? U64_MAX
|
|
41
|
+
}
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
function mintExactAmount(config, args) {
|
|
45
|
+
return liveTrade(config, args, (pricer) => authed.mintExactAmount({
|
|
46
|
+
config,
|
|
47
|
+
arguments: {
|
|
48
|
+
market: args.expiryMarketId,
|
|
49
|
+
wrapper: args.wrapperId,
|
|
50
|
+
pricer,
|
|
51
|
+
lowerTick: args.lowerTick,
|
|
52
|
+
higherTick: args.higherTick,
|
|
53
|
+
maxPremium: args.maxPremiumRaw,
|
|
54
|
+
minQuantity: args.minQuantityRaw,
|
|
55
|
+
maxCost: args.maxCostRaw ?? U64_MAX
|
|
56
|
+
}
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
function redeemLive(config, args) {
|
|
60
|
+
return liveTrade(config, args, (pricer) => authed.redeemLive({
|
|
61
|
+
config,
|
|
62
|
+
arguments: {
|
|
63
|
+
market: args.expiryMarketId,
|
|
64
|
+
wrapper: args.wrapperId,
|
|
65
|
+
pricer,
|
|
66
|
+
orderId: args.orderId,
|
|
67
|
+
closeQuantity: args.closeQuantityRaw,
|
|
68
|
+
minProbability: args.minProbabilityRaw ?? 0n,
|
|
69
|
+
minProceeds: args.minProceedsRaw ?? 0n
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
function redeemSettled(config, args) {
|
|
74
|
+
return authed.redeemSettled({
|
|
75
|
+
config,
|
|
76
|
+
arguments: {
|
|
77
|
+
market: args.expiryMarketId,
|
|
78
|
+
wrapper: args.wrapperId,
|
|
79
|
+
orderId: args.orderId
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
export { loadLivePricer, mintExactAmount, mintExactQuantity, redeemLive, redeemSettled };
|
|
86
|
+
//# sourceMappingURL=trade.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.mjs","names":["expiryMarket.mintExactQuantity","expiryMarket.mintExactAmount","expiryMarket.redeemLive","expiryMarket.redeemSettled","expiryMarket.loadLivePricer"],"sources":["../../../src/predict/tx/trade.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport type { Transaction, TransactionResult } from '@mysten/sui/transactions';\nimport type { GeneratedConfig } from '../config/generated.js';\nimport { U64_MAX } from '../units.js';\nimport * as expiryMarket from '../../contracts/deepbook_predict/expiry_market.js';\nimport { withAuth } from './common.js';\n\n// The four trade calls with their `auth` argument already supplied (see `withAuth`): each\n// takes its generated options minus that slot and expands to auth → call.\nconst authed = {\n\tmintExactQuantity: withAuth(expiryMarket.mintExactQuantity),\n\tmintExactAmount: withAuth(expiryMarket.mintExactAmount),\n\tredeemLive: withAuth(expiryMarket.redeemLive),\n\tredeemSettled: withAuth(expiryMarket.redeemSettled),\n};\n\n// The oracle feed object ids a live market's pricer reads. Grouped so callers pass one\n// bundle; the deployment's per-underlying ids live in `cfg.underlyings[symbol]` (see\n// `src/config/testnet.ts`), named to match `deployment.testnet.json`.\nexport interface MarketFeeds {\n\tpythFeed: string;\n\tblockScholesValueStore: string;\n\tblockScholesSviStore: string;\n}\n\n// Load a fresh `Pricer` from the live oracle feeds. Every live-flow trade call\n// (`mint_*`, `redeem_live`) borrows this `&Pricer` and it must be loaded first in the\n// PTB. Deployed sig `load_live_pricer` (expiry_market.move): market, config,\n// propbook_registry (&OracleRegistry), pyth, bs_values, bs_svi, clock (auto-injected).\n// `config` and `propbook_registry` are supplied by the config slice, not named here.\nexport function loadLivePricer(\n\tconfig: GeneratedConfig,\n\targs: { expiryMarketId: string } & MarketFeeds,\n): (tx: Transaction) => TransactionResult {\n\treturn (tx) =>\n\t\ttx.add(\n\t\t\texpiryMarket.loadLivePricer({\n\t\t\t\tconfig,\n\t\t\t\targuments: {\n\t\t\t\t\tmarket: args.expiryMarketId,\n\t\t\t\t\tpyth: args.pythFeed,\n\t\t\t\t\tbsValues: args.blockScholesValueStore,\n\t\t\t\t\tbsSvi: args.blockScholesSviStore,\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n}\n\n// The three commands every live-flow trade is: load a fresh market-bound `Pricer`, mint\n// owner auth, then the one `expiry_market::*` call that consumes both. Only the pricer is\n// composed here — `build` returns an `authed.*` call, which is the other two commands.\nfunction liveTrade(\n\tconfig: GeneratedConfig,\n\targs: { expiryMarketId: string } & MarketFeeds,\n\tbuild: (pricer: TransactionResult) => (tx: Transaction) => TransactionResult,\n): (tx: Transaction) => TransactionResult {\n\treturn (tx) => {\n\t\tconst pricer = tx.add(loadLivePricer(config, args));\n\t\treturn tx.add(build(pricer));\n\t};\n}\n\n// Mint a position of an exact `quantityRaw`, capped by cost/probability ceilings,\n// returning the new order id (u256). Command order is pricer → auth → mint (auth is a\n// hot potato consumed by this call). `maxCostRaw`/`maxProbabilityRaw` default to\n// `U64_MAX` (no slippage cap). Deployed sig `mint_exact_quantity`.\nexport function mintExactQuantity(\n\tconfig: GeneratedConfig,\n\targs: {\n\t\texpiryMarketId: string;\n\t\twrapperId: string;\n\t\tlowerTick: bigint;\n\t\thigherTick: bigint;\n\t\tquantityRaw: bigint;\n\t\tmaxCostRaw?: bigint;\n\t\tmaxProbabilityRaw?: bigint;\n\t} & MarketFeeds,\n): (tx: Transaction) => TransactionResult {\n\treturn liveTrade(config, args, (pricer) =>\n\t\tauthed.mintExactQuantity({\n\t\t\tconfig,\n\t\t\targuments: {\n\t\t\t\tmarket: args.expiryMarketId,\n\t\t\t\twrapper: args.wrapperId,\n\t\t\t\tpricer,\n\t\t\t\tlowerTick: args.lowerTick,\n\t\t\t\thigherTick: args.higherTick,\n\t\t\t\tquantity: args.quantityRaw,\n\t\t\t\tmaxCost: args.maxCostRaw ?? U64_MAX,\n\t\t\t\tmaxProbability: args.maxProbabilityRaw ?? U64_MAX,\n\t\t\t},\n\t\t}),\n\t);\n}\n\n// Mint by spending up to `maxPremiumRaw` (raw quote units), enforcing a `minQuantityRaw`\n// floor on the position received and a `maxCostRaw` all-in ceiling, returning the new\n// order id (u256). Command order is pricer → auth → mint. Deployed sig\n// `mint_exact_amount`: …, max_premium, min_quantity, max_cost, root.\nexport function mintExactAmount(\n\tconfig: GeneratedConfig,\n\targs: {\n\t\texpiryMarketId: string;\n\t\twrapperId: string;\n\t\tlowerTick: bigint;\n\t\thigherTick: bigint;\n\t\tmaxPremiumRaw: bigint;\n\t\tminQuantityRaw: bigint;\n\t\tmaxCostRaw?: bigint;\n\t} & MarketFeeds,\n): (tx: Transaction) => TransactionResult {\n\treturn liveTrade(config, args, (pricer) =>\n\t\tauthed.mintExactAmount({\n\t\t\tconfig,\n\t\t\targuments: {\n\t\t\t\tmarket: args.expiryMarketId,\n\t\t\t\twrapper: args.wrapperId,\n\t\t\t\tpricer,\n\t\t\t\tlowerTick: args.lowerTick,\n\t\t\t\thigherTick: args.higherTick,\n\t\t\t\tmaxPremium: args.maxPremiumRaw,\n\t\t\t\tminQuantity: args.minQuantityRaw,\n\t\t\t\tmaxCost: args.maxCostRaw ?? U64_MAX,\n\t\t\t},\n\t\t}),\n\t);\n}\n\n// Owner-authorized redeem of a live (not-yet-settled) position: close `closeQuantityRaw`\n// of `orderId` at the live pricer's mark, enforcing close-side slippage floors\n// (`minProbabilityRaw`/`minProceedsRaw`, default 0 = uncapped). Returns `Option<u256>`:\n// the replacement order id when a partial close leaves quantity open, else none. Command\n// order is pricer → auth → redeem. Deployed sig `redeem_live`.\nexport function redeemLive(\n\tconfig: GeneratedConfig,\n\targs: {\n\t\texpiryMarketId: string;\n\t\twrapperId: string;\n\t\torderId: bigint;\n\t\tcloseQuantityRaw: bigint;\n\t\tminProbabilityRaw?: bigint;\n\t\tminProceedsRaw?: bigint;\n\t} & MarketFeeds,\n): (tx: Transaction) => TransactionResult {\n\treturn liveTrade(config, args, (pricer) =>\n\t\tauthed.redeemLive({\n\t\t\tconfig,\n\t\t\targuments: {\n\t\t\t\tmarket: args.expiryMarketId,\n\t\t\t\twrapper: args.wrapperId,\n\t\t\t\tpricer,\n\t\t\t\torderId: args.orderId,\n\t\t\t\tcloseQuantity: args.closeQuantityRaw,\n\t\t\t\tminProbability: args.minProbabilityRaw ?? 0n,\n\t\t\t\tminProceeds: args.minProceedsRaw ?? 0n,\n\t\t\t},\n\t\t}),\n\t);\n}\n\n// Owner-authorized redeem of a settled position: closes `orderId` IN FULL against the\n// recorded settlement price (the deployed entrypoint takes no quantity — a settled claim\n// is all-or-nothing). No live pricer (settlement price is fixed); auth is consumed by the\n// call. Deployed sig `redeem_settled` (owner-auth form). The keeper-facing\n// `redeem_settled_permissionless` is a separate entrypoint, out of scope for this SDK.\nexport function redeemSettled(\n\tconfig: GeneratedConfig,\n\targs: {\n\t\texpiryMarketId: string;\n\t\twrapperId: string;\n\t\torderId: bigint;\n\t},\n): (tx: Transaction) => TransactionResult {\n\treturn authed.redeemSettled({\n\t\tconfig,\n\t\targuments: {\n\t\t\tmarket: args.expiryMarketId,\n\t\t\twrapper: args.wrapperId,\n\t\t\torderId: args.orderId,\n\t\t},\n\t});\n}\n"],"mappings":";;;;;AAUA,MAAM,SAAS;CACd,mBAAmB,SAASA,oBAA+B;CAC3D,iBAAiB,SAASC,kBAA6B;CACvD,YAAY,SAASC,aAAwB;CAC7C,eAAe,SAASC,gBAA2B;CACnD;AAgBD,SAAgB,eACf,QACA,MACyC;AACzC,SAAQ,OACP,GAAG,IACFC,iBAA4B;EAC3B;EACA,WAAW;GACV,QAAQ,KAAK;GACb,MAAM,KAAK;GACX,UAAU,KAAK;GACf,OAAO,KAAK;GACZ;EACD,CAAC,CACF;;AAMH,SAAS,UACR,QACA,MACA,OACyC;AACzC,SAAQ,OAAO;EACd,MAAM,SAAS,GAAG,IAAI,eAAe,QAAQ,KAAK,CAAC;AACnD,SAAO,GAAG,IAAI,MAAM,OAAO,CAAC;;;AAQ9B,SAAgB,kBACf,QACA,MASyC;AACzC,QAAO,UAAU,QAAQ,OAAO,WAC/B,OAAO,kBAAkB;EACxB;EACA,WAAW;GACV,QAAQ,KAAK;GACb,SAAS,KAAK;GACd;GACA,WAAW,KAAK;GAChB,YAAY,KAAK;GACjB,UAAU,KAAK;GACf,SAAS,KAAK,cAAc;GAC5B,gBAAgB,KAAK,qBAAqB;GAC1C;EACD,CAAC,CACF;;AAOF,SAAgB,gBACf,QACA,MASyC;AACzC,QAAO,UAAU,QAAQ,OAAO,WAC/B,OAAO,gBAAgB;EACtB;EACA,WAAW;GACV,QAAQ,KAAK;GACb,SAAS,KAAK;GACd;GACA,WAAW,KAAK;GAChB,YAAY,KAAK;GACjB,YAAY,KAAK;GACjB,aAAa,KAAK;GAClB,SAAS,KAAK,cAAc;GAC5B;EACD,CAAC,CACF;;AAQF,SAAgB,WACf,QACA,MAQyC;AACzC,QAAO,UAAU,QAAQ,OAAO,WAC/B,OAAO,WAAW;EACjB;EACA,WAAW;GACV,QAAQ,KAAK;GACb,SAAS,KAAK;GACd;GACA,SAAS,KAAK;GACd,eAAe,KAAK;GACpB,gBAAgB,KAAK,qBAAqB;GAC1C,aAAa,KAAK,kBAAkB;GACpC;EACD,CAAC,CACF;;AAQF,SAAgB,cACf,QACA,MAKyC;AACzC,QAAO,OAAO,cAAc;EAC3B;EACA,WAAW;GACV,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,SAAS,KAAK;GACd;EACD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/predict/units.d.ts
|
|
2
|
+
declare const U64_MAX: bigint;
|
|
3
|
+
declare const usdcToRaw: (v: number | string) => bigint;
|
|
4
|
+
declare const rawToUsdc: (raw: bigint) => number;
|
|
5
|
+
declare const priceToRaw: (v: number | string) => bigint;
|
|
6
|
+
declare const rawToPrice: (raw: bigint) => number;
|
|
7
|
+
declare function probabilityToRaw(p: number): bigint;
|
|
8
|
+
declare const rawToProbability: (raw: bigint) => number;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { U64_MAX, priceToRaw, probabilityToRaw, rawToPrice, rawToProbability, rawToUsdc, usdcToRaw };
|
|
11
|
+
//# sourceMappingURL=units.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"units.d.mts","names":[],"sources":["../../src/predict/units.ts"],"mappings":";cAGa,OAAA;AAAA,cAqCA,SAAA,GAAa,CAAA;AAAA,cACb,SAAA,GAAa,GAAA;AAAA,cACb,UAAA,GAAc,CAAA;AAAA,cACd,UAAA,GAAc,GAAA;AAAA,iBACX,gBAAA,CAAiB,CAAA;AAAA,cAIpB,gBAAA,GAAoB,GAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { PredictInputError } from "./errors.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/predict/units.ts
|
|
4
|
+
const U64_MAX = (1n << 64n) - 1n;
|
|
5
|
+
function expandExponential(s) {
|
|
6
|
+
const m = /^(\d+)(?:\.(\d+))?[eE]([+-]?\d+)$/.exec(s);
|
|
7
|
+
if (!m) return s;
|
|
8
|
+
const [, whole, frac = "", expStr] = m;
|
|
9
|
+
const digits = whole + frac;
|
|
10
|
+
const point = whole.length + Number(expStr);
|
|
11
|
+
if (point <= 0) return "0." + "0".repeat(-point) + digits;
|
|
12
|
+
if (point >= digits.length) return digits + "0".repeat(point - digits.length);
|
|
13
|
+
return digits.slice(0, point) + "." + digits.slice(point);
|
|
14
|
+
}
|
|
15
|
+
/** Exact decimal→raw conversion via string math. Throws on negatives and excess precision. */
|
|
16
|
+
function toRaw(value, decimals) {
|
|
17
|
+
const s = expandExponential(typeof value === "number" ? value.toString() : value.trim());
|
|
18
|
+
if (!/^\d+(\.\d+)?$/.test(s)) throw new PredictInputError(`invalid or negative decimal value: ${s}`);
|
|
19
|
+
const [whole, frac = ""] = s.split(".");
|
|
20
|
+
if (frac.length > decimals) throw new PredictInputError(`${s} exceeds ${decimals} decimals`);
|
|
21
|
+
return BigInt(whole) * 10n ** BigInt(decimals) + BigInt(frac.padEnd(decimals, "0") || "0");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Raw→decimal for DISPLAY. Casts through Number, so values above 2^53 raw lose
|
|
25
|
+
* precision in the low digits — fine for UI, not for accounting. Exact values
|
|
26
|
+
* stay available as bigints from the primitives layer (`accountBalance`,
|
|
27
|
+
* `poolStats`, …).
|
|
28
|
+
*/
|
|
29
|
+
function fromRaw(raw, decimals) {
|
|
30
|
+
return Number(raw) / 10 ** decimals;
|
|
31
|
+
}
|
|
32
|
+
const usdcToRaw = (v) => toRaw(v, 6);
|
|
33
|
+
const rawToUsdc = (raw) => fromRaw(raw, 6);
|
|
34
|
+
const priceToRaw = (v) => toRaw(v, 9);
|
|
35
|
+
const rawToPrice = (raw) => fromRaw(raw, 9);
|
|
36
|
+
function probabilityToRaw(p) {
|
|
37
|
+
if (p < 0 || p > 1) throw new PredictInputError(`probability must be in [0,1], got ${p}`);
|
|
38
|
+
return toRaw(p, 9);
|
|
39
|
+
}
|
|
40
|
+
const rawToProbability = (raw) => fromRaw(raw, 9);
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { U64_MAX, fromRaw, priceToRaw, probabilityToRaw, rawToPrice, rawToProbability, rawToUsdc, usdcToRaw };
|
|
44
|
+
//# sourceMappingURL=units.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"units.mjs","names":[],"sources":["../../src/predict/units.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { PredictInputError } from './errors.js';\nexport const U64_MAX = (1n << 64n) - 1n;\n\n// Expand exponential notation to a plain decimal string, exactly (string math).\n// JS Number.toString() emits exponentials below 1e-6 and at/above 1e21, which\n// the plain-decimal regex in toRaw would otherwise reject with a misleading\n// \"invalid\" error even when the value is exactly representable.\nfunction expandExponential(s: string): string {\n\tconst m = /^(\\d+)(?:\\.(\\d+))?[eE]([+-]?\\d+)$/.exec(s);\n\tif (!m) return s;\n\tconst [, whole, frac = '', expStr] = m;\n\tconst digits = whole + frac;\n\tconst point = whole.length + Number(expStr);\n\tif (point <= 0) return '0.' + '0'.repeat(-point) + digits;\n\tif (point >= digits.length) return digits + '0'.repeat(point - digits.length);\n\treturn digits.slice(0, point) + '.' + digits.slice(point);\n}\n\n/** Exact decimal→raw conversion via string math. Throws on negatives and excess precision. */\nexport function toRaw(value: number | string, decimals: number): bigint {\n\tconst s = expandExponential(typeof value === 'number' ? value.toString() : value.trim());\n\tif (!/^\\d+(\\.\\d+)?$/.test(s))\n\t\tthrow new PredictInputError(`invalid or negative decimal value: ${s}`);\n\tconst [whole, frac = ''] = s.split('.');\n\tif (frac.length > decimals) throw new PredictInputError(`${s} exceeds ${decimals} decimals`);\n\treturn BigInt(whole) * 10n ** BigInt(decimals) + BigInt(frac.padEnd(decimals, '0') || '0');\n}\n\n/**\n * Raw→decimal for DISPLAY. Casts through Number, so values above 2^53 raw lose\n * precision in the low digits — fine for UI, not for accounting. Exact values\n * stay available as bigints from the primitives layer (`accountBalance`,\n * `poolStats`, …).\n */\nexport function fromRaw(raw: bigint, decimals: number): number {\n\treturn Number(raw) / 10 ** decimals;\n}\n\nexport const usdcToRaw = (v: number | string) => toRaw(v, 6);\nexport const rawToUsdc = (raw: bigint) => fromRaw(raw, 6);\nexport const priceToRaw = (v: number | string) => toRaw(v, 9);\nexport const rawToPrice = (raw: bigint) => fromRaw(raw, 9);\nexport function probabilityToRaw(p: number): bigint {\n\tif (p < 0 || p > 1) throw new PredictInputError(`probability must be in [0,1], got ${p}`);\n\treturn toRaw(p, 9);\n}\nexport const rawToProbability = (raw: bigint) => fromRaw(raw, 9);\n"],"mappings":";;;AAGA,MAAa,WAAW,MAAM,OAAO;AAMrC,SAAS,kBAAkB,GAAmB;CAC7C,MAAM,IAAI,oCAAoC,KAAK,EAAE;AACrD,KAAI,CAAC,EAAG,QAAO;CACf,MAAM,GAAG,OAAO,OAAO,IAAI,UAAU;CACrC,MAAM,SAAS,QAAQ;CACvB,MAAM,QAAQ,MAAM,SAAS,OAAO,OAAO;AAC3C,KAAI,SAAS,EAAG,QAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG;AACnD,KAAI,SAAS,OAAO,OAAQ,QAAO,SAAS,IAAI,OAAO,QAAQ,OAAO,OAAO;AAC7E,QAAO,OAAO,MAAM,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,MAAM;;;AAI1D,SAAgB,MAAM,OAAwB,UAA0B;CACvE,MAAM,IAAI,kBAAkB,OAAO,UAAU,WAAW,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC;AACxF,KAAI,CAAC,gBAAgB,KAAK,EAAE,CAC3B,OAAM,IAAI,kBAAkB,sCAAsC,IAAI;CACvE,MAAM,CAAC,OAAO,OAAO,MAAM,EAAE,MAAM,IAAI;AACvC,KAAI,KAAK,SAAS,SAAU,OAAM,IAAI,kBAAkB,GAAG,EAAE,WAAW,SAAS,WAAW;AAC5F,QAAO,OAAO,MAAM,GAAG,OAAO,OAAO,SAAS,GAAG,OAAO,KAAK,OAAO,UAAU,IAAI,IAAI,IAAI;;;;;;;;AAS3F,SAAgB,QAAQ,KAAa,UAA0B;AAC9D,QAAO,OAAO,IAAI,GAAG,MAAM;;AAG5B,MAAa,aAAa,MAAuB,MAAM,GAAG,EAAE;AAC5D,MAAa,aAAa,QAAgB,QAAQ,KAAK,EAAE;AACzD,MAAa,cAAc,MAAuB,MAAM,GAAG,EAAE;AAC7D,MAAa,cAAc,QAAgB,QAAQ,KAAK,EAAE;AAC1D,SAAgB,iBAAiB,GAAmB;AACnD,KAAI,IAAI,KAAK,IAAI,EAAG,OAAM,IAAI,kBAAkB,qCAAqC,IAAI;AACzF,QAAO,MAAM,GAAG,EAAE;;AAEnB,MAAa,oBAAoB,QAAgB,QAAQ,KAAK,EAAE"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Account } from "../contracts/deepbook/account.mjs";
|
|
2
2
|
import { OrderDeepPrice } from "../contracts/deepbook/deep_price.mjs";
|
|
3
|
-
import "../types/bcs.mjs";
|
|
4
3
|
import { DEEP_SCALAR, FLOAT_SCALAR } from "../utils/config.mjs";
|
|
5
4
|
import { bcs } from "@mysten/sui/bcs";
|
|
6
5
|
import { Transaction } from "@mysten/sui/transactions";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountQueries.mjs","names":["#ctx"],"sources":["../../src/queries/accountQueries.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { Account, OrderDeepPrice } from '../types/bcs.js';\nimport type { AccountInfo, LockedBalances, PoolDeepPrice } from '../types/index.js';\nimport { DEEP_SCALAR, FLOAT_SCALAR } from '../utils/config.js';\nimport type { QueryContext } from './context.js';\n\nexport class AccountQueries {\n\t#ctx: QueryContext;\n\n\tconstructor(ctx: QueryContext) {\n\t\tthis.#ctx = ctx;\n\t}\n\n\tasync account(poolKey: string, managerKey: string): Promise<AccountInfo> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.#ctx.address);\n\t\tconst pool = this.#ctx.config.getPool(poolKey);\n\t\tconst baseScalar = this.#ctx.config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#ctx.config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.#ctx.deepBook.account(poolKey, managerKey));\n\t\tconst res = await this.#ctx.client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst accountInformation = res.commandResults![0].returnValues[0].bcs;\n\t\tconst accountInfo = Account.parse(new Uint8Array(accountInformation));\n\n\t\treturn {\n\t\t\tepoch: accountInfo.epoch,\n\t\t\topen_orders: accountInfo.open_orders,\n\t\t\ttaker_volume: Number(accountInfo.taker_volume) / baseScalar,\n\t\t\tmaker_volume: Number(accountInfo.maker_volume) / baseScalar,\n\t\t\tactive_stake: Number(accountInfo.active_stake) / DEEP_SCALAR,\n\t\t\tinactive_stake: Number(accountInfo.inactive_stake) / DEEP_SCALAR,\n\t\t\tcreated_proposal: accountInfo.created_proposal,\n\t\t\tvoted_proposal: accountInfo.voted_proposal,\n\t\t\tunclaimed_rebates: {\n\t\t\t\tbase: Number(accountInfo.unclaimed_rebates.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.unclaimed_rebates.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.unclaimed_rebates.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\tsettled_balances: {\n\t\t\t\tbase: Number(accountInfo.settled_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.settled_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.settled_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\towed_balances: {\n\t\t\t\tbase: Number(accountInfo.owed_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.owed_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.owed_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync lockedBalance(poolKey: string, balanceManagerKey: string): Promise<LockedBalances> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.#ctx.address);\n\t\tconst pool = this.#ctx.config.getPool(poolKey);\n\t\tconst baseScalar = this.#ctx.config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#ctx.config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.#ctx.deepBook.lockedBalance(poolKey, balanceManagerKey));\n\t\tconst res = await this.#ctx.client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbase: Number((baseLocked / baseScalar).toFixed(9)),\n\t\t\tquote: Number((quoteLocked / quoteScalar).toFixed(9)),\n\t\t\tdeep: Number((deepLocked / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\tasync getPoolDeepPrice(poolKey: string): Promise<PoolDeepPrice> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.#ctx.address);\n\t\tconst pool = this.#ctx.config.getPool(poolKey);\n\t\ttx.add(this.#ctx.deepBook.getPoolDeepPrice(poolKey));\n\n\t\tconst baseCoin = this.#ctx.config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#ctx.config.getCoin(pool.quoteCoin);\n\t\tconst deepCoin = this.#ctx.config.getCoin('DEEP');\n\n\t\tconst res = await this.#ctx.client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst poolDeepPriceBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst poolDeepPrice = OrderDeepPrice.parse(new Uint8Array(poolDeepPriceBytes));\n\n\t\tif (poolDeepPrice.asset_is_base) {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_base:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * baseCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_quote:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * quoteCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t}\n\t}\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"accountQueries.mjs","names":["#ctx"],"sources":["../../src/queries/accountQueries.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport { Transaction } from '@mysten/sui/transactions';\n\nimport { Account, OrderDeepPrice } from '../types/bcs.js';\nimport type { AccountInfo, LockedBalances, PoolDeepPrice } from '../types/index.js';\nimport { DEEP_SCALAR, FLOAT_SCALAR } from '../utils/config.js';\nimport type { QueryContext } from './context.js';\n\nexport class AccountQueries {\n\t#ctx: QueryContext;\n\n\tconstructor(ctx: QueryContext) {\n\t\tthis.#ctx = ctx;\n\t}\n\n\tasync account(poolKey: string, managerKey: string): Promise<AccountInfo> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.#ctx.address);\n\t\tconst pool = this.#ctx.config.getPool(poolKey);\n\t\tconst baseScalar = this.#ctx.config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#ctx.config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.#ctx.deepBook.account(poolKey, managerKey));\n\t\tconst res = await this.#ctx.client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst accountInformation = res.commandResults![0].returnValues[0].bcs;\n\t\tconst accountInfo = Account.parse(new Uint8Array(accountInformation));\n\n\t\treturn {\n\t\t\tepoch: accountInfo.epoch,\n\t\t\topen_orders: accountInfo.open_orders,\n\t\t\ttaker_volume: Number(accountInfo.taker_volume) / baseScalar,\n\t\t\tmaker_volume: Number(accountInfo.maker_volume) / baseScalar,\n\t\t\tactive_stake: Number(accountInfo.active_stake) / DEEP_SCALAR,\n\t\t\tinactive_stake: Number(accountInfo.inactive_stake) / DEEP_SCALAR,\n\t\t\tcreated_proposal: accountInfo.created_proposal,\n\t\t\tvoted_proposal: accountInfo.voted_proposal,\n\t\t\tunclaimed_rebates: {\n\t\t\t\tbase: Number(accountInfo.unclaimed_rebates.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.unclaimed_rebates.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.unclaimed_rebates.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\tsettled_balances: {\n\t\t\t\tbase: Number(accountInfo.settled_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.settled_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.settled_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t\towed_balances: {\n\t\t\t\tbase: Number(accountInfo.owed_balances.base) / baseScalar,\n\t\t\t\tquote: Number(accountInfo.owed_balances.quote) / quoteScalar,\n\t\t\t\tdeep: Number(accountInfo.owed_balances.deep) / DEEP_SCALAR,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync lockedBalance(poolKey: string, balanceManagerKey: string): Promise<LockedBalances> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.#ctx.address);\n\t\tconst pool = this.#ctx.config.getPool(poolKey);\n\t\tconst baseScalar = this.#ctx.config.getCoin(pool.baseCoin).scalar;\n\t\tconst quoteScalar = this.#ctx.config.getCoin(pool.quoteCoin).scalar;\n\n\t\ttx.add(this.#ctx.deepBook.lockedBalance(poolKey, balanceManagerKey));\n\t\tconst res = await this.#ctx.client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst baseLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[0].bcs));\n\t\tconst quoteLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[1].bcs));\n\t\tconst deepLocked = Number(bcs.U64.parse(res.commandResults![0].returnValues[2].bcs));\n\n\t\treturn {\n\t\t\tbase: Number((baseLocked / baseScalar).toFixed(9)),\n\t\t\tquote: Number((quoteLocked / quoteScalar).toFixed(9)),\n\t\t\tdeep: Number((deepLocked / DEEP_SCALAR).toFixed(9)),\n\t\t};\n\t}\n\n\tasync getPoolDeepPrice(poolKey: string): Promise<PoolDeepPrice> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.#ctx.address);\n\t\tconst pool = this.#ctx.config.getPool(poolKey);\n\t\ttx.add(this.#ctx.deepBook.getPoolDeepPrice(poolKey));\n\n\t\tconst baseCoin = this.#ctx.config.getCoin(pool.baseCoin);\n\t\tconst quoteCoin = this.#ctx.config.getCoin(pool.quoteCoin);\n\t\tconst deepCoin = this.#ctx.config.getCoin('DEEP');\n\n\t\tconst res = await this.#ctx.client.core.simulateTransaction({\n\t\t\ttransaction: tx,\n\t\t\tinclude: { commandResults: true, effects: true },\n\t\t});\n\n\t\tconst poolDeepPriceBytes = res.commandResults![0].returnValues[0].bcs;\n\t\tconst poolDeepPrice = OrderDeepPrice.parse(new Uint8Array(poolDeepPriceBytes));\n\n\t\tif (poolDeepPrice.asset_is_base) {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_base:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * baseCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tasset_is_base: poolDeepPrice.asset_is_base,\n\t\t\t\tdeep_per_quote:\n\t\t\t\t\t((Number(poolDeepPrice.deep_per_asset) / FLOAT_SCALAR) * quoteCoin.scalar) /\n\t\t\t\t\tdeepCoin.scalar,\n\t\t\t};\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;AAWA,IAAa,iBAAb,MAA4B;CAC3B;CAEA,YAAY,KAAmB;AAC9B,QAAKA,MAAO;;CAGb,MAAM,QAAQ,SAAiB,YAA0C;EACxE,MAAM,KAAK,IAAI,aAAa;AAC5B,KAAG,UAAU,MAAKA,IAAK,QAAQ;EAC/B,MAAM,OAAO,MAAKA,IAAK,OAAO,QAAQ,QAAQ;EAC9C,MAAM,aAAa,MAAKA,IAAK,OAAO,QAAQ,KAAK,SAAS,CAAC;EAC3D,MAAM,cAAc,MAAKA,IAAK,OAAO,QAAQ,KAAK,UAAU,CAAC;AAE7D,KAAG,IAAI,MAAKA,IAAK,SAAS,QAAQ,SAAS,WAAW,CAAC;EAMvD,MAAM,sBALM,MAAM,MAAKA,IAAK,OAAO,KAAK,oBAAoB;GAC3D,aAAa;GACb,SAAS;IAAE,gBAAgB;IAAM,SAAS;IAAM;GAChD,CAAC,EAE6B,eAAgB,GAAG,aAAa,GAAG;EAClE,MAAM,cAAc,QAAQ,MAAM,IAAI,WAAW,mBAAmB,CAAC;AAErE,SAAO;GACN,OAAO,YAAY;GACnB,aAAa,YAAY;GACzB,cAAc,OAAO,YAAY,aAAa,GAAG;GACjD,cAAc,OAAO,YAAY,aAAa,GAAG;GACjD,cAAc,OAAO,YAAY,aAAa,GAAG;GACjD,gBAAgB,OAAO,YAAY,eAAe,GAAG;GACrD,kBAAkB,YAAY;GAC9B,gBAAgB,YAAY;GAC5B,mBAAmB;IAClB,MAAM,OAAO,YAAY,kBAAkB,KAAK,GAAG;IACnD,OAAO,OAAO,YAAY,kBAAkB,MAAM,GAAG;IACrD,MAAM,OAAO,YAAY,kBAAkB,KAAK,GAAG;IACnD;GACD,kBAAkB;IACjB,MAAM,OAAO,YAAY,iBAAiB,KAAK,GAAG;IAClD,OAAO,OAAO,YAAY,iBAAiB,MAAM,GAAG;IACpD,MAAM,OAAO,YAAY,iBAAiB,KAAK,GAAG;IAClD;GACD,eAAe;IACd,MAAM,OAAO,YAAY,cAAc,KAAK,GAAG;IAC/C,OAAO,OAAO,YAAY,cAAc,MAAM,GAAG;IACjD,MAAM,OAAO,YAAY,cAAc,KAAK,GAAG;IAC/C;GACD;;CAGF,MAAM,cAAc,SAAiB,mBAAoD;EACxF,MAAM,KAAK,IAAI,aAAa;AAC5B,KAAG,UAAU,MAAKA,IAAK,QAAQ;EAC/B,MAAM,OAAO,MAAKA,IAAK,OAAO,QAAQ,QAAQ;EAC9C,MAAM,aAAa,MAAKA,IAAK,OAAO,QAAQ,KAAK,SAAS,CAAC;EAC3D,MAAM,cAAc,MAAKA,IAAK,OAAO,QAAQ,KAAK,UAAU,CAAC;AAE7D,KAAG,IAAI,MAAKA,IAAK,SAAS,cAAc,SAAS,kBAAkB,CAAC;EACpE,MAAM,MAAM,MAAM,MAAKA,IAAK,OAAO,KAAK,oBAAoB;GAC3D,aAAa;GACb,SAAS;IAAE,gBAAgB;IAAM,SAAS;IAAM;GAChD,CAAC;EAEF,MAAM,aAAa,OAAO,IAAI,IAAI,MAAM,IAAI,eAAgB,GAAG,aAAa,GAAG,IAAI,CAAC;EACpF,MAAM,cAAc,OAAO,IAAI,IAAI,MAAM,IAAI,eAAgB,GAAG,aAAa,GAAG,IAAI,CAAC;EACrF,MAAM,aAAa,OAAO,IAAI,IAAI,MAAM,IAAI,eAAgB,GAAG,aAAa,GAAG,IAAI,CAAC;AAEpF,SAAO;GACN,MAAM,QAAQ,aAAa,YAAY,QAAQ,EAAE,CAAC;GAClD,OAAO,QAAQ,cAAc,aAAa,QAAQ,EAAE,CAAC;GACrD,MAAM,QAAQ,aAAa,aAAa,QAAQ,EAAE,CAAC;GACnD;;CAGF,MAAM,iBAAiB,SAAyC;EAC/D,MAAM,KAAK,IAAI,aAAa;AAC5B,KAAG,UAAU,MAAKA,IAAK,QAAQ;EAC/B,MAAM,OAAO,MAAKA,IAAK,OAAO,QAAQ,QAAQ;AAC9C,KAAG,IAAI,MAAKA,IAAK,SAAS,iBAAiB,QAAQ,CAAC;EAEpD,MAAM,WAAW,MAAKA,IAAK,OAAO,QAAQ,KAAK,SAAS;EACxD,MAAM,YAAY,MAAKA,IAAK,OAAO,QAAQ,KAAK,UAAU;EAC1D,MAAM,WAAW,MAAKA,IAAK,OAAO,QAAQ,OAAO;EAOjD,MAAM,sBALM,MAAM,MAAKA,IAAK,OAAO,KAAK,oBAAoB;GAC3D,aAAa;GACb,SAAS;IAAE,gBAAgB;IAAM,SAAS;IAAM;GAChD,CAAC,EAE6B,eAAgB,GAAG,aAAa,GAAG;EAClE,MAAM,gBAAgB,eAAe,MAAM,IAAI,WAAW,mBAAmB,CAAC;AAE9E,MAAI,cAAc,cACjB,QAAO;GACN,eAAe,cAAc;GAC7B,eACG,OAAO,cAAc,eAAe,GAAG,eAAgB,SAAS,SAClE,SAAS;GACV;MAED,QAAO;GACN,eAAe,cAAc;GAC7B,gBACG,OAAO,cAAc,eAAe,GAAG,eAAgB,UAAU,SACnE,SAAS;GACV"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { VecSet } from "../contracts/deepbook/deps/sui/vec_set.mjs";
|
|
2
2
|
import { Order } from "../contracts/deepbook/order.mjs";
|
|
3
|
-
import "../types/bcs.mjs";
|
|
4
3
|
import { DEEP_SCALAR, FLOAT_SCALAR } from "../utils/config.mjs";
|
|
5
4
|
import { bcs } from "@mysten/sui/bcs";
|
|
6
5
|
import { Transaction } from "@mysten/sui/transactions";
|