@lightconexyz/lightcone-sdk 0.5.2 → 0.6.1
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/README.md +34 -4
- package/dist/client.d.ts +30 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -1
- package/dist/domain/admin/client.d.ts +10 -1
- package/dist/domain/admin/client.d.ts.map +1 -1
- package/dist/domain/admin/client.js +51 -0
- package/dist/domain/admin/client.js.map +1 -1
- package/dist/domain/admin/wire.d.ts +267 -7
- package/dist/domain/admin/wire.d.ts.map +1 -1
- package/dist/domain/admin/wire.js.map +1 -1
- package/dist/domain/faucet.d.ts +25 -0
- package/dist/domain/faucet.d.ts.map +1 -0
- package/dist/domain/faucet.js +3 -0
- package/dist/domain/faucet.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +3 -1
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/market/client.d.ts +23 -2
- package/dist/domain/market/client.d.ts.map +1 -1
- package/dist/domain/market/client.js +30 -0
- package/dist/domain/market/client.js.map +1 -1
- package/dist/domain/market/convert.d.ts +10 -0
- package/dist/domain/market/convert.d.ts.map +1 -1
- package/dist/domain/market/convert.js +43 -4
- package/dist/domain/market/convert.js.map +1 -1
- package/dist/domain/market/icon.d.ts +17 -0
- package/dist/domain/market/icon.d.ts.map +1 -0
- package/dist/domain/market/icon.js +25 -0
- package/dist/domain/market/icon.js.map +1 -0
- package/dist/domain/market/index.d.ts +13 -4
- package/dist/domain/market/index.d.ts.map +1 -1
- package/dist/domain/market/index.js +3 -1
- package/dist/domain/market/index.js.map +1 -1
- package/dist/domain/market/outcome.d.ts +3 -1
- package/dist/domain/market/outcome.d.ts.map +1 -1
- package/dist/domain/market/outcome.js +7 -7
- package/dist/domain/market/outcome.js.map +1 -1
- package/dist/domain/market/tokens.d.ts +53 -3
- package/dist/domain/market/tokens.d.ts.map +1 -1
- package/dist/domain/market/tokens.js +99 -8
- package/dist/domain/market/tokens.js.map +1 -1
- package/dist/domain/market/wire.d.ts +46 -8
- package/dist/domain/market/wire.d.ts.map +1 -1
- package/dist/domain/market/wire.js.map +1 -1
- package/dist/domain/metrics/client.d.ts +66 -0
- package/dist/domain/metrics/client.d.ts.map +1 -0
- package/dist/domain/metrics/client.js +124 -0
- package/dist/domain/metrics/client.js.map +1 -0
- package/dist/domain/metrics/index.d.ts +3 -0
- package/dist/domain/metrics/index.d.ts.map +1 -0
- package/dist/domain/metrics/index.js +19 -0
- package/dist/domain/metrics/index.js.map +1 -0
- package/dist/domain/metrics/wire.d.ts +342 -0
- package/dist/domain/metrics/wire.d.ts.map +1 -0
- package/dist/domain/metrics/wire.js +3 -0
- package/dist/domain/metrics/wire.js.map +1 -0
- package/dist/domain/notification/client.d.ts +6 -0
- package/dist/domain/notification/client.d.ts.map +1 -1
- package/dist/domain/notification/client.js +10 -0
- package/dist/domain/notification/client.js.map +1 -1
- package/dist/domain/notification/index.d.ts +3 -1
- package/dist/domain/notification/index.d.ts.map +1 -1
- package/dist/domain/notification/index.js.map +1 -1
- package/dist/domain/order/client.d.ts +28 -2
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +76 -16
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/order/convert.d.ts +5 -5
- package/dist/domain/order/convert.d.ts.map +1 -1
- package/dist/domain/order/convert.js +1 -1
- package/dist/domain/order/convert.js.map +1 -1
- package/dist/domain/order/index.d.ts +1 -1
- package/dist/domain/order/index.d.ts.map +1 -1
- package/dist/domain/order/index.js.map +1 -1
- package/dist/domain/order/state.d.ts +9 -7
- package/dist/domain/order/state.d.ts.map +1 -1
- package/dist/domain/order/state.js +81 -28
- package/dist/domain/order/state.js.map +1 -1
- package/dist/domain/orderbook/index.d.ts +1 -1
- package/dist/domain/orderbook/index.d.ts.map +1 -1
- package/dist/domain/orderbook/index.js +3 -8
- package/dist/domain/orderbook/index.js.map +1 -1
- package/dist/domain/orderbook/state.d.ts +30 -7
- package/dist/domain/orderbook/state.d.ts.map +1 -1
- package/dist/domain/orderbook/state.js +41 -12
- package/dist/domain/orderbook/state.js.map +1 -1
- package/dist/domain/position/client.d.ts +55 -0
- package/dist/domain/position/client.d.ts.map +1 -1
- package/dist/domain/position/client.js +71 -0
- package/dist/domain/position/client.js.map +1 -1
- package/dist/domain/position/index.d.ts +3 -2
- package/dist/domain/position/index.d.ts.map +1 -1
- package/dist/domain/position/index.js.map +1 -1
- package/dist/domain/price_history/client.d.ts +12 -1
- package/dist/domain/price_history/client.d.ts.map +1 -1
- package/dist/domain/price_history/client.js +14 -0
- package/dist/domain/price_history/client.js.map +1 -1
- package/dist/domain/price_history/wire.d.ts +27 -0
- package/dist/domain/price_history/wire.d.ts.map +1 -1
- package/dist/domain/price_history/wire.js.map +1 -1
- package/dist/domain/referral/client.d.ts +6 -0
- package/dist/domain/referral/client.d.ts.map +1 -1
- package/dist/domain/referral/client.js +22 -9
- package/dist/domain/referral/client.js.map +1 -1
- package/dist/http/client.d.ts +9 -0
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +24 -9
- package/dist/http/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prelude.d.ts +12 -4
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +4 -2
- package/dist/prelude.js.map +1 -1
- package/dist/shared/fmt/decimal.js +4 -4
- package/dist/shared/fmt/decimal.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +2 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/types.d.ts +1 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +19 -0
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/index.d.ts +12 -1
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js +20 -0
- package/dist/ws/index.js.map +1 -1
- package/dist/ws/subscriptions.d.ts +6 -0
- package/dist/ws/subscriptions.d.ts.map +1 -1
- package/dist/ws/subscriptions.js +4 -0
- package/dist/ws/subscriptions.js.map +1 -1
- package/package.json +1 -1
|
@@ -28,7 +28,7 @@ export interface OutcomeImpact {
|
|
|
28
28
|
dollar: string;
|
|
29
29
|
isPositive: boolean;
|
|
30
30
|
}
|
|
31
|
-
export declare function impactPct(
|
|
31
|
+
export declare function impactPct(depositPrice: Decimal, conditionalPrice: Decimal): [number, string];
|
|
32
32
|
export declare function impact(depositAssetPrice: Decimal, conditionalPrice: Decimal): OutcomeImpact;
|
|
33
33
|
/**
|
|
34
34
|
* Derive scaling decimals from an orderbook pair's token metadata.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAO5F;AAED,wBAAgB,MAAM,CACpB,iBAAiB,EAAE,OAAO,EAC1B,gBAAgB,EAAE,OAAO,GACxB,aAAa,CAef;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAUxE;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAE9D;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAEhE;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAEjE;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;CAMnD"}
|
|
@@ -13,9 +13,6 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
13
13
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
17
|
exports.OrderBookValidationError = exports.orderBookPairFromWire = void 0;
|
|
21
18
|
exports.impactPct = impactPct;
|
|
@@ -24,7 +21,6 @@ exports.orderbookDecimals = orderbookDecimals;
|
|
|
24
21
|
exports.orderBookMarket = orderBookMarket;
|
|
25
22
|
exports.orderBookBaseMint = orderBookBaseMint;
|
|
26
23
|
exports.orderBookQuoteMint = orderBookQuoteMint;
|
|
27
|
-
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
28
24
|
const web3_js_1 = require("@solana/web3.js");
|
|
29
25
|
__exportStar(require("./client"), exports);
|
|
30
26
|
__exportStar(require("./wire"), exports);
|
|
@@ -32,12 +28,11 @@ __exportStar(require("./state"), exports);
|
|
|
32
28
|
__exportStar(require("./ticker"), exports);
|
|
33
29
|
var convert_1 = require("./convert");
|
|
34
30
|
Object.defineProperty(exports, "orderBookPairFromWire", { enumerable: true, get: function () { return convert_1.orderBookPairFromWire; } });
|
|
35
|
-
function impactPct(
|
|
36
|
-
if (depositPrice.isZero() ||
|
|
31
|
+
function impactPct(depositPrice, conditionalPrice) {
|
|
32
|
+
if (depositPrice.isZero() || conditionalPrice.isZero()) {
|
|
37
33
|
return [0, ""];
|
|
38
34
|
}
|
|
39
|
-
const
|
|
40
|
-
const value = conditional.minus(depositPrice).div(depositPrice).mul(100);
|
|
35
|
+
const value = conditionalPrice.minus(depositPrice).div(depositPrice).mul(100);
|
|
41
36
|
return [value.toNumber(), value.greaterThan(0) ? "+" : ""];
|
|
42
37
|
}
|
|
43
38
|
function impact(depositAssetPrice, conditionalPrice) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/orderbook/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Decimal from \"decimal.js\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport type { OrderbookDecimals } from \"../../shared/scaling\";\nimport type { ConditionalToken } from \"../market\";\n\nexport * from \"./client\";\nexport * from \"./wire\";\nexport * from \"./state\";\nexport * from \"./ticker\";\nexport { orderBookPairFromWire } from \"./convert\";\n\nexport interface OrderBookPair {\n id: number;\n marketPubkey: PubkeyStr;\n orderbookId: OrderBookId;\n base: ConditionalToken;\n quote: ConditionalToken;\n outcomeIndex: number;\n tickSize: number;\n totalBids: number;\n totalAsks: number;\n lastTradePrice?: string;\n lastTradeTime?: Date;\n active: boolean;\n}\n\nexport interface OutcomeImpact {\n sign: string;\n pct: number;\n dollar: string;\n isPositive: boolean;\n}\n\nexport function impactPct(depositPrice: Decimal, conditionalPrice: Decimal): [number, string] {\n if (depositPrice.isZero() || conditionalPrice.isZero()) {\n return [0, \"\"];\n }\n\n const value = conditionalPrice.minus(depositPrice).div(depositPrice).mul(100);\n return [value.toNumber(), value.greaterThan(0) ? \"+\" : \"\"];\n}\n\nexport function impact(\n depositAssetPrice: Decimal,\n conditionalPrice: Decimal\n): OutcomeImpact {\n if (depositAssetPrice.isZero()) {\n return { sign: \"\", pct: 0, dollar: \"0\", isPositive: false };\n }\n\n const pctDecimal = conditionalPrice.minus(depositAssetPrice).div(depositAssetPrice).mul(100);\n const pct = pctDecimal.toNumber();\n const dollar = conditionalPrice.minus(depositAssetPrice).abs().toString();\n\n return {\n sign: pct > 0 ? \"+\" : \"-\",\n pct: Math.abs(pct),\n dollar,\n isPositive: pct > 0,\n };\n}\n\n/**\n * Derive scaling decimals from an orderbook pair's token metadata.\n *\n * No REST call needed — decimals are computed from the base/quote token objects.\n */\nexport function orderbookDecimals(pair: OrderBookPair): OrderbookDecimals {\n const baseDecimals = pair.base.decimals;\n const quoteDecimals = pair.quote.decimals;\n return {\n orderbookId: pair.orderbookId,\n baseDecimals,\n quoteDecimals,\n priceDecimals: Math.max(0, 6 + quoteDecimals - baseDecimals),\n tickSize: BigInt(Math.max(pair.tickSize, 0)),\n };\n}\n\n/** Return the market as a `PublicKey`. */\nexport function orderBookMarket(pair: OrderBookPair): PublicKey {\n return new PublicKey(pair.marketPubkey);\n}\n\n/** Return the base conditional-token mint as a `PublicKey`. */\nexport function orderBookBaseMint(pair: OrderBookPair): PublicKey {\n return new PublicKey(pair.base.pubkey);\n}\n\n/** Return the quote conditional-token mint as a `PublicKey`. */\nexport function orderBookQuoteMint(pair: OrderBookPair): PublicKey {\n return new PublicKey(pair.quote.pubkey);\n}\n\nexport class OrderBookValidationError extends Error {\n readonly orderbookId: string;\n readonly details: string[];\n\n constructor(orderbookId: string, details: string[]) {\n super(`OrderBook validation errors (${orderbookId}): ${details.join(\"; \")}`);\n this.name = \"OrderBookValidationError\";\n this.orderbookId = orderbookId;\n this.details = details;\n }\n}\n"]}
|
|
@@ -3,11 +3,33 @@ import type { OrderBook } from "./wire";
|
|
|
3
3
|
export type OrderbookApplyResult = {
|
|
4
4
|
kind: "applied";
|
|
5
5
|
} | {
|
|
6
|
-
kind: "
|
|
6
|
+
kind: "ignored";
|
|
7
|
+
reason: OrderbookIgnoreReason;
|
|
7
8
|
} | {
|
|
8
|
-
kind: "
|
|
9
|
+
kind: "refresh_required";
|
|
10
|
+
reason: OrderbookRefreshReason;
|
|
11
|
+
};
|
|
12
|
+
export type OrderbookIgnoreReason = {
|
|
13
|
+
kind: "invalid_delta_sequence";
|
|
14
|
+
got: number;
|
|
15
|
+
} | {
|
|
16
|
+
kind: "stale_delta";
|
|
17
|
+
current: number;
|
|
18
|
+
got: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "already_awaiting_snapshot";
|
|
21
|
+
got: number;
|
|
22
|
+
};
|
|
23
|
+
export type OrderbookRefreshReason = {
|
|
24
|
+
kind: "missing_snapshot";
|
|
25
|
+
got: number;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "sequence_gap";
|
|
9
28
|
expected: number;
|
|
10
29
|
got: number;
|
|
30
|
+
} | {
|
|
31
|
+
kind: "server_resync";
|
|
32
|
+
got: number;
|
|
11
33
|
};
|
|
12
34
|
export declare class OrderbookState {
|
|
13
35
|
readonly orderbookId: OrderBookId;
|
|
@@ -17,15 +39,16 @@ export declare class OrderbookState {
|
|
|
17
39
|
private cachedBestBid;
|
|
18
40
|
private cachedBestAsk;
|
|
19
41
|
private hasSnapshot;
|
|
42
|
+
private awaitingSnapshot;
|
|
20
43
|
constructor(orderbookId: OrderBookId);
|
|
21
44
|
/**
|
|
22
45
|
* Apply a WS orderbook message (snapshot replaces, delta merges).
|
|
23
46
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
47
|
+
* Server resync messages take precedence and return `refresh_required`.
|
|
48
|
+
* Otherwise, snapshots are applied and deltas with a `seq` at or below the
|
|
49
|
+
* current value are ignored to prevent stale updates. Deltas that skip one
|
|
50
|
+
* or more expected sequence values are rejected so callers can refresh from
|
|
51
|
+
* a fresh snapshot instead of mutating a corrupted book.
|
|
29
52
|
*/
|
|
30
53
|
apply(book: OrderBook): OrderbookApplyResult;
|
|
31
54
|
bids(): ReadonlyMap<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/domain/orderbook/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,qBAAa,cAAc;IACzB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,gBAAgB,CAAU;gBAEtB,WAAW,EAAE,WAAW;IAWpC;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB;IAkF5C,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAInC,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAInC,OAAO,IAAI,MAAM,GAAG,SAAS;IAe7B,OAAO,IAAI,MAAM,GAAG,SAAS;IAc7B,QAAQ,IAAI,MAAM,GAAG,SAAS;IAU9B,MAAM,IAAI,MAAM,GAAG,SAAS;IAU5B,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,IAAI;CASd"}
|
|
@@ -13,6 +13,7 @@ class OrderbookState {
|
|
|
13
13
|
cachedBestBid;
|
|
14
14
|
cachedBestAsk;
|
|
15
15
|
hasSnapshot;
|
|
16
|
+
awaitingSnapshot;
|
|
16
17
|
constructor(orderbookId) {
|
|
17
18
|
this.orderbookId = orderbookId;
|
|
18
19
|
this.seq = 0;
|
|
@@ -21,40 +22,67 @@ class OrderbookState {
|
|
|
21
22
|
this.cachedBestBid = null;
|
|
22
23
|
this.cachedBestAsk = null;
|
|
23
24
|
this.hasSnapshot = false;
|
|
25
|
+
this.awaitingSnapshot = false;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Apply a WS orderbook message (snapshot replaces, delta merges).
|
|
27
29
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* Server resync messages take precedence and return `refresh_required`.
|
|
31
|
+
* Otherwise, snapshots are applied and deltas with a `seq` at or below the
|
|
32
|
+
* current value are ignored to prevent stale updates. Deltas that skip one
|
|
33
|
+
* or more expected sequence values are rejected so callers can refresh from
|
|
34
|
+
* a fresh snapshot instead of mutating a corrupted book.
|
|
33
35
|
*/
|
|
34
36
|
apply(book) {
|
|
37
|
+
const seq = book.seq ?? 0;
|
|
35
38
|
if (book.resync) {
|
|
36
|
-
|
|
39
|
+
this.awaitingSnapshot = true;
|
|
40
|
+
return {
|
|
41
|
+
kind: "refresh_required",
|
|
42
|
+
reason: { kind: "server_resync", got: seq },
|
|
43
|
+
};
|
|
37
44
|
}
|
|
38
|
-
const seq = book.seq ?? 0;
|
|
39
45
|
if (book.is_snapshot) {
|
|
40
46
|
this.bidsMap.clear();
|
|
41
47
|
this.asksMap.clear();
|
|
42
48
|
this.hasSnapshot = true;
|
|
49
|
+
this.awaitingSnapshot = false;
|
|
43
50
|
}
|
|
44
51
|
else {
|
|
52
|
+
if (this.awaitingSnapshot) {
|
|
53
|
+
return {
|
|
54
|
+
kind: "ignored",
|
|
55
|
+
reason: { kind: "already_awaiting_snapshot", got: seq },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
45
58
|
// The backend sends snapshots with seq=0 and starts delta seq at 1.
|
|
46
59
|
// A delta with seq=0 means it has no valid sequence, so drop it.
|
|
47
60
|
if (seq <= 0) {
|
|
48
|
-
return {
|
|
61
|
+
return {
|
|
62
|
+
kind: "ignored",
|
|
63
|
+
reason: { kind: "invalid_delta_sequence", got: seq },
|
|
64
|
+
};
|
|
49
65
|
}
|
|
50
66
|
if (!this.hasSnapshot) {
|
|
51
|
-
|
|
67
|
+
this.awaitingSnapshot = true;
|
|
68
|
+
return {
|
|
69
|
+
kind: "refresh_required",
|
|
70
|
+
reason: { kind: "missing_snapshot", got: seq },
|
|
71
|
+
};
|
|
52
72
|
}
|
|
53
73
|
if (seq <= this.seq) {
|
|
54
|
-
return {
|
|
74
|
+
return {
|
|
75
|
+
kind: "ignored",
|
|
76
|
+
reason: { kind: "stale_delta", current: this.seq, got: seq },
|
|
77
|
+
};
|
|
55
78
|
}
|
|
56
|
-
|
|
57
|
-
|
|
79
|
+
const expected = this.seq + 1;
|
|
80
|
+
if (seq !== expected) {
|
|
81
|
+
this.awaitingSnapshot = true;
|
|
82
|
+
return {
|
|
83
|
+
kind: "refresh_required",
|
|
84
|
+
reason: { kind: "sequence_gap", expected, got: seq },
|
|
85
|
+
};
|
|
58
86
|
}
|
|
59
87
|
}
|
|
60
88
|
this.seq = seq;
|
|
@@ -137,6 +165,7 @@ class OrderbookState {
|
|
|
137
165
|
this.cachedBestBid = null;
|
|
138
166
|
this.cachedBestAsk = null;
|
|
139
167
|
this.hasSnapshot = false;
|
|
168
|
+
this.awaitingSnapshot = false;
|
|
140
169
|
}
|
|
141
170
|
}
|
|
142
171
|
exports.OrderbookState = OrderbookState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/domain/orderbook/state.ts"],"names":[],"mappings":"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","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { OrderBookId } from \"../../shared\";\nimport type { OrderBook } from \"./wire\";\n\nexport type OrderbookApplyResult =\n | { kind: \"applied\" }\n | { kind: \"stale\" }\n | { kind: \"gap_detected\"; expected: number; got: number };\n\nexport class OrderbookState {\n readonly orderbookId: OrderBookId;\n seq: number;\n private readonly bidsMap: Map<string, string>;\n private readonly asksMap: Map<string, string>;\n private cachedBestBid: string | undefined | null;\n private cachedBestAsk: string | undefined | null;\n private hasSnapshot: boolean;\n\n constructor(orderbookId: OrderBookId) {\n this.orderbookId = orderbookId;\n this.seq = 0;\n this.bidsMap = new Map();\n this.asksMap = new Map();\n this.cachedBestBid = null;\n this.cachedBestAsk = null;\n this.hasSnapshot = false;\n }\n\n /**\n * Apply a WS orderbook message (snapshot replaces, delta merges).\n *\n * Snapshots are always applied. Deltas with a `seq` at or below the\n * current value are silently dropped to prevent stale updates. Deltas\n * that skip one or more expected sequence values are rejected so callers\n * can refresh from a fresh snapshot instead of mutating a corrupted book.\n * Server resync messages leave the book unchanged and return `stale`.\n */\n apply(book: OrderBook): OrderbookApplyResult {\n if (book.resync) {\n return { kind: \"stale\" };\n }\n\n const seq = book.seq ?? 0;\n\n if (book.is_snapshot) {\n this.bidsMap.clear();\n this.asksMap.clear();\n this.hasSnapshot = true;\n } else {\n // The backend sends snapshots with seq=0 and starts delta seq at 1.\n // A delta with seq=0 means it has no valid sequence, so drop it.\n if (seq <= 0) {\n return { kind: \"stale\" };\n }\n\n if (!this.hasSnapshot) {\n return { kind: \"gap_detected\", expected: 0, got: seq };\n }\n\n if (seq <= this.seq) {\n return { kind: \"stale\" };\n }\n\n if (seq !== this.seq + 1) {\n return { kind: \"gap_detected\", expected: this.seq + 1, got: seq };\n }\n }\n\n this.seq = seq;\n\n for (const level of book.bids) {\n if (new Decimal(level.size).isZero()) {\n this.bidsMap.delete(level.price);\n } else {\n this.bidsMap.set(level.price, level.size);\n }\n }\n\n for (const level of book.asks) {\n if (new Decimal(level.size).isZero()) {\n this.asksMap.delete(level.price);\n } else {\n this.asksMap.set(level.price, level.size);\n }\n }\n\n this.cachedBestBid = null;\n this.cachedBestAsk = null;\n\n return { kind: \"applied\" };\n }\n\n bids(): ReadonlyMap<string, string> {\n return this.bidsMap;\n }\n\n asks(): ReadonlyMap<string, string> {\n return this.asksMap;\n }\n\n bestBid(): string | undefined {\n if (this.cachedBestBid !== null) {\n return this.cachedBestBid;\n }\n if (this.bidsMap.size === 0) {\n this.cachedBestBid = undefined;\n return undefined;\n }\n const result = Array.from(this.bidsMap.keys())\n .sort((a, b) => new Decimal(a).cmp(new Decimal(b)))\n .at(-1);\n this.cachedBestBid = result;\n return result;\n }\n\n bestAsk(): string | undefined {\n if (this.cachedBestAsk !== null) {\n return this.cachedBestAsk;\n }\n if (this.asksMap.size === 0) {\n this.cachedBestAsk = undefined;\n return undefined;\n }\n const result = Array.from(this.asksMap.keys())\n .sort((a, b) => new Decimal(a).cmp(new Decimal(b)))[0];\n this.cachedBestAsk = result;\n return result;\n }\n\n midPrice(): string | undefined {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n if (!bid || !ask) {\n return undefined;\n }\n\n return new Decimal(bid).plus(ask).div(2).toString();\n }\n\n spread(): string | undefined {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n if (!bid || !ask) {\n return undefined;\n }\n\n return new Decimal(ask).minus(bid).toString();\n }\n\n isEmpty(): boolean {\n return this.bidsMap.size === 0 && this.asksMap.size === 0;\n }\n\n clear(): void {\n this.bidsMap.clear();\n this.asksMap.clear();\n this.seq = 0;\n this.cachedBestBid = null;\n this.cachedBestAsk = null;\n this.hasSnapshot = false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/domain/orderbook/state.ts"],"names":[],"mappings":"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","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { OrderBookId } from \"../../shared\";\nimport type { OrderBook } from \"./wire\";\n\nexport type OrderbookApplyResult =\n | { kind: \"applied\" }\n | { kind: \"ignored\"; reason: OrderbookIgnoreReason }\n | { kind: \"refresh_required\"; reason: OrderbookRefreshReason };\n\nexport type OrderbookIgnoreReason =\n | { kind: \"invalid_delta_sequence\"; got: number }\n | { kind: \"stale_delta\"; current: number; got: number }\n | { kind: \"already_awaiting_snapshot\"; got: number };\n\nexport type OrderbookRefreshReason =\n | { kind: \"missing_snapshot\"; got: number }\n | { kind: \"sequence_gap\"; expected: number; got: number }\n | { kind: \"server_resync\"; got: number };\n\nexport class OrderbookState {\n readonly orderbookId: OrderBookId;\n seq: number;\n private readonly bidsMap: Map<string, string>;\n private readonly asksMap: Map<string, string>;\n private cachedBestBid: string | undefined | null;\n private cachedBestAsk: string | undefined | null;\n private hasSnapshot: boolean;\n private awaitingSnapshot: boolean;\n\n constructor(orderbookId: OrderBookId) {\n this.orderbookId = orderbookId;\n this.seq = 0;\n this.bidsMap = new Map();\n this.asksMap = new Map();\n this.cachedBestBid = null;\n this.cachedBestAsk = null;\n this.hasSnapshot = false;\n this.awaitingSnapshot = false;\n }\n\n /**\n * Apply a WS orderbook message (snapshot replaces, delta merges).\n *\n * Server resync messages take precedence and return `refresh_required`.\n * Otherwise, snapshots are applied and deltas with a `seq` at or below the\n * current value are ignored to prevent stale updates. Deltas that skip one\n * or more expected sequence values are rejected so callers can refresh from\n * a fresh snapshot instead of mutating a corrupted book.\n */\n apply(book: OrderBook): OrderbookApplyResult {\n const seq = book.seq ?? 0;\n\n if (book.resync) {\n this.awaitingSnapshot = true;\n return {\n kind: \"refresh_required\",\n reason: { kind: \"server_resync\", got: seq },\n };\n }\n\n if (book.is_snapshot) {\n this.bidsMap.clear();\n this.asksMap.clear();\n this.hasSnapshot = true;\n this.awaitingSnapshot = false;\n } else {\n if (this.awaitingSnapshot) {\n return {\n kind: \"ignored\",\n reason: { kind: \"already_awaiting_snapshot\", got: seq },\n };\n }\n\n // The backend sends snapshots with seq=0 and starts delta seq at 1.\n // A delta with seq=0 means it has no valid sequence, so drop it.\n if (seq <= 0) {\n return {\n kind: \"ignored\",\n reason: { kind: \"invalid_delta_sequence\", got: seq },\n };\n }\n\n if (!this.hasSnapshot) {\n this.awaitingSnapshot = true;\n return {\n kind: \"refresh_required\",\n reason: { kind: \"missing_snapshot\", got: seq },\n };\n }\n\n if (seq <= this.seq) {\n return {\n kind: \"ignored\",\n reason: { kind: \"stale_delta\", current: this.seq, got: seq },\n };\n }\n\n const expected = this.seq + 1;\n if (seq !== expected) {\n this.awaitingSnapshot = true;\n return {\n kind: \"refresh_required\",\n reason: { kind: \"sequence_gap\", expected, got: seq },\n };\n }\n }\n\n this.seq = seq;\n\n for (const level of book.bids) {\n if (new Decimal(level.size).isZero()) {\n this.bidsMap.delete(level.price);\n } else {\n this.bidsMap.set(level.price, level.size);\n }\n }\n\n for (const level of book.asks) {\n if (new Decimal(level.size).isZero()) {\n this.asksMap.delete(level.price);\n } else {\n this.asksMap.set(level.price, level.size);\n }\n }\n\n this.cachedBestBid = null;\n this.cachedBestAsk = null;\n\n return { kind: \"applied\" };\n }\n\n bids(): ReadonlyMap<string, string> {\n return this.bidsMap;\n }\n\n asks(): ReadonlyMap<string, string> {\n return this.asksMap;\n }\n\n bestBid(): string | undefined {\n if (this.cachedBestBid !== null) {\n return this.cachedBestBid;\n }\n if (this.bidsMap.size === 0) {\n this.cachedBestBid = undefined;\n return undefined;\n }\n const result = Array.from(this.bidsMap.keys())\n .sort((a, b) => new Decimal(a).cmp(new Decimal(b)))\n .at(-1);\n this.cachedBestBid = result;\n return result;\n }\n\n bestAsk(): string | undefined {\n if (this.cachedBestAsk !== null) {\n return this.cachedBestAsk;\n }\n if (this.asksMap.size === 0) {\n this.cachedBestAsk = undefined;\n return undefined;\n }\n const result = Array.from(this.asksMap.keys())\n .sort((a, b) => new Decimal(a).cmp(new Decimal(b)))[0];\n this.cachedBestAsk = result;\n return result;\n }\n\n midPrice(): string | undefined {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n if (!bid || !ask) {\n return undefined;\n }\n\n return new Decimal(bid).plus(ask).div(2).toString();\n }\n\n spread(): string | undefined {\n const bid = this.bestBid();\n const ask = this.bestAsk();\n if (!bid || !ask) {\n return undefined;\n }\n\n return new Decimal(ask).minus(bid).toString();\n }\n\n isEmpty(): boolean {\n return this.bidsMap.size === 0 && this.asksMap.size === 0;\n }\n\n clear(): void {\n this.bidsMap.clear();\n this.asksMap.clear();\n this.seq = 0;\n this.cachedBestBid = null;\n this.cachedBestAsk = null;\n this.hasSnapshot = false;\n this.awaitingSnapshot = false;\n }\n}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PublicKey, Transaction, type TransactionInstruction } from "@solana/web3.js";
|
|
2
2
|
import type { ClientContext } from "../../context";
|
|
3
3
|
import type { Position as ProgramPosition, RedeemWinningsParams, WithdrawFromPositionParams, InitPositionTokensParams, ExtendPositionTokensParams, DepositToGlobalParams, GlobalToMarketDepositParams, WithdrawFromGlobalParams } from "../../program/types";
|
|
4
|
+
import type { PubkeyStr } from "../../shared";
|
|
5
|
+
import type { DepositTokenBalance } from "./index";
|
|
4
6
|
import type { MarketPositionsResponse, PositionsResponse } from "./wire";
|
|
5
7
|
import { DepositBuilder, MergeBuilder, WithdrawBuilder, RedeemWinningsBuilder, WithdrawFromPositionBuilder, InitPositionTokensBuilder, ExtendPositionTokensBuilder, DepositToGlobalBuilder, WithdrawFromGlobalBuilder, GlobalToMarketDepositBuilder } from "./builders";
|
|
6
8
|
export declare class Positions {
|
|
@@ -9,6 +11,59 @@ export declare class Positions {
|
|
|
9
11
|
pda(owner: PublicKey, market: PublicKey): PublicKey;
|
|
10
12
|
get(userPubkey: string): Promise<PositionsResponse>;
|
|
11
13
|
getForMarket(userPubkey: string, marketPubkey: string): Promise<MarketPositionsResponse>;
|
|
14
|
+
/**
|
|
15
|
+
* Get all conditional-token positions for the authenticated user across
|
|
16
|
+
* every market. The wallet is resolved server-side from the `auth_token`
|
|
17
|
+
* cookie, so no parameter is required. Same response shape as `get()`.
|
|
18
|
+
*
|
|
19
|
+
* `GET /api/users/positions`
|
|
20
|
+
*/
|
|
21
|
+
positions(): Promise<PositionsResponse>;
|
|
22
|
+
/**
|
|
23
|
+
* Same as {@link positions}, but uses the supplied `authToken` for this
|
|
24
|
+
* call instead of the SDK's process-wide cookie store.
|
|
25
|
+
*
|
|
26
|
+
* Intended for server-side cookie forwarding (SSR / server functions)
|
|
27
|
+
* where the per-request browser cookie can't propagate to the shared
|
|
28
|
+
* client. In a browser context this is equivalent to {@link positions}
|
|
29
|
+
* because the runtime is already attaching the cookie via
|
|
30
|
+
* `credentials: "include"`.
|
|
31
|
+
*/
|
|
32
|
+
positionsWithAuth(authToken: string): Promise<PositionsResponse>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the authenticated user's positions in a specific market. The wallet
|
|
35
|
+
* is resolved server-side from the `auth_token` cookie.
|
|
36
|
+
*
|
|
37
|
+
* `GET /api/users/markets/{market_pubkey}/positions`
|
|
38
|
+
*/
|
|
39
|
+
positionsForMarket(marketPubkey: string): Promise<MarketPositionsResponse>;
|
|
40
|
+
/**
|
|
41
|
+
* Same as {@link positionsForMarket}, but uses the supplied `authToken`
|
|
42
|
+
* for this call instead of the SDK's process-wide cookie store. For
|
|
43
|
+
* server-side cookie forwarding (SSR / server functions).
|
|
44
|
+
*/
|
|
45
|
+
positionsForMarketWithAuth(marketPubkey: string, authToken: string): Promise<MarketPositionsResponse>;
|
|
46
|
+
/**
|
|
47
|
+
* Get SPL deposit-token balances for the authenticated user.
|
|
48
|
+
*
|
|
49
|
+
* The wallet is resolved server-side from the `auth_token` cookie, so no
|
|
50
|
+
* parameter is required. Returns balances keyed by mint pubkey for every
|
|
51
|
+
* deposit token registered in the backend's `deposit_token_metadata`.
|
|
52
|
+
* An empty object means the user has none of the tracked balances — this
|
|
53
|
+
* is not an error.
|
|
54
|
+
*/
|
|
55
|
+
depositTokenBalances(): Promise<Record<PubkeyStr, DepositTokenBalance>>;
|
|
56
|
+
/**
|
|
57
|
+
* Same as {@link depositTokenBalances}, but uses the supplied `authToken`
|
|
58
|
+
* for this call instead of the SDK's process-wide cookie store.
|
|
59
|
+
*
|
|
60
|
+
* Intended for server-side cookie forwarding (SSR / server functions)
|
|
61
|
+
* where the per-request browser cookie can't propagate to the shared
|
|
62
|
+
* client. In a browser context this is equivalent to
|
|
63
|
+
* {@link depositTokenBalances} because the runtime is already attaching
|
|
64
|
+
* the cookie via `credentials: "include"`.
|
|
65
|
+
*/
|
|
66
|
+
depositTokenBalancesWithAuth(authToken: string): Promise<Record<PubkeyStr, DepositTokenBalance>>;
|
|
12
67
|
redeemWinningsIx(params: RedeemWinningsParams, winningOutcome: number): TransactionInstruction;
|
|
13
68
|
withdrawFromPositionIx(params: WithdrawFromPositionParams, isToken2022: boolean): TransactionInstruction;
|
|
14
69
|
initPositionTokensIx(params: InitPositionTokensParams, numOutcomes: number): TransactionInstruction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/position/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAcnD,OAAO,KAAK,EACV,QAAQ,IAAI,eAAe,EAC3B,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,yBAAyB,EACzB,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAEpB,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAIlD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS;IAM7C,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAKnD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/domain/position/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,77 @@ class Positions {
|
|
|
26
26
|
const url = `${this.client.http.baseUrl()}/api/users/${encodeURIComponent(userPubkey)}/markets/${encodeURIComponent(marketPubkey)}/positions`;
|
|
27
27
|
return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Get all conditional-token positions for the authenticated user across
|
|
31
|
+
* every market. The wallet is resolved server-side from the `auth_token`
|
|
32
|
+
* cookie, so no parameter is required. Same response shape as `get()`.
|
|
33
|
+
*
|
|
34
|
+
* `GET /api/users/positions`
|
|
35
|
+
*/
|
|
36
|
+
async positions() {
|
|
37
|
+
const url = `${this.client.http.baseUrl()}/api/users/positions`;
|
|
38
|
+
return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Same as {@link positions}, but uses the supplied `authToken` for this
|
|
42
|
+
* call instead of the SDK's process-wide cookie store.
|
|
43
|
+
*
|
|
44
|
+
* Intended for server-side cookie forwarding (SSR / server functions)
|
|
45
|
+
* where the per-request browser cookie can't propagate to the shared
|
|
46
|
+
* client. In a browser context this is equivalent to {@link positions}
|
|
47
|
+
* because the runtime is already attaching the cookie via
|
|
48
|
+
* `credentials: "include"`.
|
|
49
|
+
*/
|
|
50
|
+
async positionsWithAuth(authToken) {
|
|
51
|
+
const url = `${this.client.http.baseUrl()}/api/users/positions`;
|
|
52
|
+
return this.client.http.getWithAuth(url, http_1.RetryPolicy.Idempotent, authToken);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the authenticated user's positions in a specific market. The wallet
|
|
56
|
+
* is resolved server-side from the `auth_token` cookie.
|
|
57
|
+
*
|
|
58
|
+
* `GET /api/users/markets/{market_pubkey}/positions`
|
|
59
|
+
*/
|
|
60
|
+
async positionsForMarket(marketPubkey) {
|
|
61
|
+
const url = `${this.client.http.baseUrl()}/api/users/markets/${encodeURIComponent(marketPubkey)}/positions`;
|
|
62
|
+
return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Same as {@link positionsForMarket}, but uses the supplied `authToken`
|
|
66
|
+
* for this call instead of the SDK's process-wide cookie store. For
|
|
67
|
+
* server-side cookie forwarding (SSR / server functions).
|
|
68
|
+
*/
|
|
69
|
+
async positionsForMarketWithAuth(marketPubkey, authToken) {
|
|
70
|
+
const url = `${this.client.http.baseUrl()}/api/users/markets/${encodeURIComponent(marketPubkey)}/positions`;
|
|
71
|
+
return this.client.http.getWithAuth(url, http_1.RetryPolicy.Idempotent, authToken);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get SPL deposit-token balances for the authenticated user.
|
|
75
|
+
*
|
|
76
|
+
* The wallet is resolved server-side from the `auth_token` cookie, so no
|
|
77
|
+
* parameter is required. Returns balances keyed by mint pubkey for every
|
|
78
|
+
* deposit token registered in the backend's `deposit_token_metadata`.
|
|
79
|
+
* An empty object means the user has none of the tracked balances — this
|
|
80
|
+
* is not an error.
|
|
81
|
+
*/
|
|
82
|
+
async depositTokenBalances() {
|
|
83
|
+
const url = `${this.client.http.baseUrl()}/api/users/deposit-token-balances`;
|
|
84
|
+
return this.client.http.get(url, http_1.RetryPolicy.Idempotent);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Same as {@link depositTokenBalances}, but uses the supplied `authToken`
|
|
88
|
+
* for this call instead of the SDK's process-wide cookie store.
|
|
89
|
+
*
|
|
90
|
+
* Intended for server-side cookie forwarding (SSR / server functions)
|
|
91
|
+
* where the per-request browser cookie can't propagate to the shared
|
|
92
|
+
* client. In a browser context this is equivalent to
|
|
93
|
+
* {@link depositTokenBalances} because the runtime is already attaching
|
|
94
|
+
* the cookie via `credentials: "include"`.
|
|
95
|
+
*/
|
|
96
|
+
async depositTokenBalancesWithAuth(authToken) {
|
|
97
|
+
const url = `${this.client.http.baseUrl()}/api/users/deposit-token-balances`;
|
|
98
|
+
return this.client.http.getWithAuth(url, http_1.RetryPolicy.Idempotent, authToken);
|
|
99
|
+
}
|
|
29
100
|
// ── On-chain transaction builders ────────────────────────────────────
|
|
30
101
|
redeemWinningsIx(params, winningOutcome) {
|
|
31
102
|
return (0, instructions_1.buildRedeemWinningsIx)(params, winningOutcome, this.client.programId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/position/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { PublicKey, Transaction, type TransactionInstruction } from \"@solana/web3.js\";\nimport type { ClientContext } from \"../../context\";\nimport { requireConnection } from \"../../context\";\nimport { RetryPolicy } from \"../../http\";\nimport {\n buildRedeemWinningsIx,\n buildWithdrawFromPositionIx,\n buildInitPositionTokensIx,\n buildExtendPositionTokensIx,\n buildDepositToGlobalIx,\n buildGlobalToMarketDepositIx,\n buildWithdrawFromGlobalIx,\n} from \"../../program/instructions\";\nimport { getPositionPda } from \"../../program/pda\";\nimport { deserializePosition as deserializeProgramPosition } from \"../../program/accounts\";\nimport type {\n Position as ProgramPosition,\n RedeemWinningsParams,\n WithdrawFromPositionParams,\n InitPositionTokensParams,\n ExtendPositionTokensParams,\n DepositToGlobalParams,\n GlobalToMarketDepositParams,\n WithdrawFromGlobalParams,\n} from \"../../program/types\";\nimport type { MarketPositionsResponse, PositionsResponse } from \"./wire\";\nimport {\n DepositBuilder,\n MergeBuilder,\n WithdrawBuilder,\n RedeemWinningsBuilder,\n WithdrawFromPositionBuilder,\n InitPositionTokensBuilder,\n ExtendPositionTokensBuilder,\n DepositToGlobalBuilder,\n WithdrawFromGlobalBuilder,\n GlobalToMarketDepositBuilder,\n} from \"./builders\";\n\nexport class Positions {\n constructor(private readonly client: ClientContext) {}\n\n // ── PDA helpers ──────────────────────────────────────────────────────\n\n pda(owner: PublicKey, market: PublicKey): PublicKey {\n return getPositionPda(owner, market, this.client.programId)[0];\n }\n\n // ── HTTP methods ─────────────────────────────────────────────────────\n\n async get(userPubkey: string): Promise<PositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/${encodeURIComponent(userPubkey)}/positions`;\n return this.client.http.get<PositionsResponse>(url, RetryPolicy.Idempotent);\n }\n\n async getForMarket(userPubkey: string, marketPubkey: string): Promise<MarketPositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/${encodeURIComponent(userPubkey)}/markets/${encodeURIComponent(marketPubkey)}/positions`;\n return this.client.http.get<MarketPositionsResponse>(url, RetryPolicy.Idempotent);\n }\n\n // ── On-chain transaction builders ────────────────────────────────────\n\n redeemWinningsIx(\n params: RedeemWinningsParams,\n winningOutcome: number\n ): TransactionInstruction {\n return buildRedeemWinningsIx(params, winningOutcome, this.client.programId);\n }\n\n withdrawFromPositionIx(\n params: WithdrawFromPositionParams,\n isToken2022: boolean\n ): TransactionInstruction {\n return buildWithdrawFromPositionIx(params, isToken2022, this.client.programId);\n }\n\n initPositionTokensIx(\n params: InitPositionTokensParams,\n numOutcomes: number\n ): TransactionInstruction {\n return buildInitPositionTokensIx(params, numOutcomes, this.client.programId);\n }\n\n extendPositionTokensIx(\n params: ExtendPositionTokensParams,\n numOutcomes: number\n ): TransactionInstruction {\n return buildExtendPositionTokensIx(params, numOutcomes, this.client.programId);\n }\n\n depositToGlobalIx(params: DepositToGlobalParams): TransactionInstruction {\n return buildDepositToGlobalIx(params, this.client.programId);\n }\n\n globalToMarketDepositIx(\n params: GlobalToMarketDepositParams,\n numOutcomes: number\n ): TransactionInstruction {\n return buildGlobalToMarketDepositIx(params, numOutcomes, this.client.programId);\n }\n\n withdrawFromGlobalIx(params: WithdrawFromGlobalParams): TransactionInstruction {\n return buildWithdrawFromGlobalIx(params, this.client.programId);\n }\n\n // ── Transaction builders (_tx convenience wrappers) ─────────────────\n\n redeemWinningsTx(\n params: RedeemWinningsParams,\n winningOutcome: number\n ): Transaction {\n const ix = this.redeemWinningsIx(params, winningOutcome);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n withdrawFromPositionTx(\n params: WithdrawFromPositionParams,\n isToken2022: boolean\n ): Transaction {\n const ix = this.withdrawFromPositionIx(params, isToken2022);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n initPositionTokensTx(\n params: InitPositionTokensParams,\n numOutcomes: number\n ): Transaction {\n const ix = this.initPositionTokensIx(params, numOutcomes);\n return new Transaction({ feePayer: params.payer }).add(ix);\n }\n\n extendPositionTokensTx(\n params: ExtendPositionTokensParams,\n numOutcomes: number\n ): Transaction {\n const ix = this.extendPositionTokensIx(params, numOutcomes);\n return new Transaction({ feePayer: params.payer }).add(ix);\n }\n\n depositToGlobalTx(params: DepositToGlobalParams): Transaction {\n const ix = this.depositToGlobalIx(params);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n globalToMarketDepositTx(\n params: GlobalToMarketDepositParams,\n numOutcomes: number\n ): Transaction {\n const ix = this.globalToMarketDepositIx(params, numOutcomes);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n withdrawFromGlobalTx(params: WithdrawFromGlobalParams): Transaction {\n const ix = this.withdrawFromGlobalIx(params);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n // ── Builder factories ──────────────────────────────────────────────\n\n deposit(): DepositBuilder {\n return new DepositBuilder(this.client, this.client.depositSource);\n }\n\n merge(): MergeBuilder {\n return new MergeBuilder(this.client);\n }\n\n withdraw(): WithdrawBuilder {\n return new WithdrawBuilder(this.client, this.client.depositSource);\n }\n\n redeemWinnings(): RedeemWinningsBuilder {\n return new RedeemWinningsBuilder(this.client);\n }\n\n withdrawFromPosition(): WithdrawFromPositionBuilder {\n return new WithdrawFromPositionBuilder(this.client);\n }\n\n initPositionTokens(): InitPositionTokensBuilder {\n return new InitPositionTokensBuilder(this.client);\n }\n\n extendPositionTokens(): ExtendPositionTokensBuilder {\n return new ExtendPositionTokensBuilder(this.client);\n }\n\n depositToGlobal(): DepositToGlobalBuilder {\n return new DepositToGlobalBuilder(this.client);\n }\n\n withdrawFromGlobal(): WithdrawFromGlobalBuilder {\n return new WithdrawFromGlobalBuilder(this.client);\n }\n\n globalToMarketDeposit(): GlobalToMarketDepositBuilder {\n return new GlobalToMarketDepositBuilder(this.client);\n }\n\n // ── On-chain account fetchers (require Connection) ──────────────────\n\n async getOnchain(owner: PublicKey, market: PublicKey): Promise<ProgramPosition | null> {\n const connection = requireConnection(this.client);\n const positionPda = this.pda(owner, market);\n const accountInfo = await connection.getAccountInfo(positionPda);\n if (!accountInfo) {\n return null;\n }\n return deserializeProgramPosition(accountInfo.data as Buffer);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/domain/position/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { PublicKey, Transaction, type TransactionInstruction } from \"@solana/web3.js\";\nimport type { ClientContext } from \"../../context\";\nimport { requireConnection } from \"../../context\";\nimport { RetryPolicy } from \"../../http\";\nimport {\n buildRedeemWinningsIx,\n buildWithdrawFromPositionIx,\n buildInitPositionTokensIx,\n buildExtendPositionTokensIx,\n buildDepositToGlobalIx,\n buildGlobalToMarketDepositIx,\n buildWithdrawFromGlobalIx,\n} from \"../../program/instructions\";\nimport { getPositionPda } from \"../../program/pda\";\nimport { deserializePosition as deserializeProgramPosition } from \"../../program/accounts\";\nimport type {\n Position as ProgramPosition,\n RedeemWinningsParams,\n WithdrawFromPositionParams,\n InitPositionTokensParams,\n ExtendPositionTokensParams,\n DepositToGlobalParams,\n GlobalToMarketDepositParams,\n WithdrawFromGlobalParams,\n} from \"../../program/types\";\nimport type { PubkeyStr } from \"../../shared\";\nimport type { DepositTokenBalance } from \"./index\";\nimport type { MarketPositionsResponse, PositionsResponse } from \"./wire\";\nimport {\n DepositBuilder,\n MergeBuilder,\n WithdrawBuilder,\n RedeemWinningsBuilder,\n WithdrawFromPositionBuilder,\n InitPositionTokensBuilder,\n ExtendPositionTokensBuilder,\n DepositToGlobalBuilder,\n WithdrawFromGlobalBuilder,\n GlobalToMarketDepositBuilder,\n} from \"./builders\";\n\nexport class Positions {\n constructor(private readonly client: ClientContext) {}\n\n // ── PDA helpers ──────────────────────────────────────────────────────\n\n pda(owner: PublicKey, market: PublicKey): PublicKey {\n return getPositionPda(owner, market, this.client.programId)[0];\n }\n\n // ── HTTP methods ─────────────────────────────────────────────────────\n\n async get(userPubkey: string): Promise<PositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/${encodeURIComponent(userPubkey)}/positions`;\n return this.client.http.get<PositionsResponse>(url, RetryPolicy.Idempotent);\n }\n\n async getForMarket(userPubkey: string, marketPubkey: string): Promise<MarketPositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/${encodeURIComponent(userPubkey)}/markets/${encodeURIComponent(marketPubkey)}/positions`;\n return this.client.http.get<MarketPositionsResponse>(url, RetryPolicy.Idempotent);\n }\n\n /**\n * Get all conditional-token positions for the authenticated user across\n * every market. The wallet is resolved server-side from the `auth_token`\n * cookie, so no parameter is required. Same response shape as `get()`.\n *\n * `GET /api/users/positions`\n */\n async positions(): Promise<PositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/positions`;\n return this.client.http.get<PositionsResponse>(url, RetryPolicy.Idempotent);\n }\n\n /**\n * Same as {@link positions}, but uses the supplied `authToken` for this\n * call instead of the SDK's process-wide cookie store.\n *\n * Intended for server-side cookie forwarding (SSR / server functions)\n * where the per-request browser cookie can't propagate to the shared\n * client. In a browser context this is equivalent to {@link positions}\n * because the runtime is already attaching the cookie via\n * `credentials: \"include\"`.\n */\n async positionsWithAuth(authToken: string): Promise<PositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/positions`;\n return this.client.http.getWithAuth<PositionsResponse>(\n url,\n RetryPolicy.Idempotent,\n authToken,\n );\n }\n\n /**\n * Get the authenticated user's positions in a specific market. The wallet\n * is resolved server-side from the `auth_token` cookie.\n *\n * `GET /api/users/markets/{market_pubkey}/positions`\n */\n async positionsForMarket(marketPubkey: string): Promise<MarketPositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/markets/${encodeURIComponent(marketPubkey)}/positions`;\n return this.client.http.get<MarketPositionsResponse>(url, RetryPolicy.Idempotent);\n }\n\n /**\n * Same as {@link positionsForMarket}, but uses the supplied `authToken`\n * for this call instead of the SDK's process-wide cookie store. For\n * server-side cookie forwarding (SSR / server functions).\n */\n async positionsForMarketWithAuth(\n marketPubkey: string,\n authToken: string,\n ): Promise<MarketPositionsResponse> {\n const url = `${this.client.http.baseUrl()}/api/users/markets/${encodeURIComponent(marketPubkey)}/positions`;\n return this.client.http.getWithAuth<MarketPositionsResponse>(\n url,\n RetryPolicy.Idempotent,\n authToken,\n );\n }\n\n /**\n * Get SPL deposit-token balances for the authenticated user.\n *\n * The wallet is resolved server-side from the `auth_token` cookie, so no\n * parameter is required. Returns balances keyed by mint pubkey for every\n * deposit token registered in the backend's `deposit_token_metadata`.\n * An empty object means the user has none of the tracked balances — this\n * is not an error.\n */\n async depositTokenBalances(): Promise<Record<PubkeyStr, DepositTokenBalance>> {\n const url = `${this.client.http.baseUrl()}/api/users/deposit-token-balances`;\n return this.client.http.get<Record<PubkeyStr, DepositTokenBalance>>(\n url,\n RetryPolicy.Idempotent,\n );\n }\n\n /**\n * Same as {@link depositTokenBalances}, but uses the supplied `authToken`\n * for this call instead of the SDK's process-wide cookie store.\n *\n * Intended for server-side cookie forwarding (SSR / server functions)\n * where the per-request browser cookie can't propagate to the shared\n * client. In a browser context this is equivalent to\n * {@link depositTokenBalances} because the runtime is already attaching\n * the cookie via `credentials: \"include\"`.\n */\n async depositTokenBalancesWithAuth(\n authToken: string,\n ): Promise<Record<PubkeyStr, DepositTokenBalance>> {\n const url = `${this.client.http.baseUrl()}/api/users/deposit-token-balances`;\n return this.client.http.getWithAuth<Record<PubkeyStr, DepositTokenBalance>>(\n url,\n RetryPolicy.Idempotent,\n authToken,\n );\n }\n\n // ── On-chain transaction builders ────────────────────────────────────\n\n redeemWinningsIx(\n params: RedeemWinningsParams,\n winningOutcome: number\n ): TransactionInstruction {\n return buildRedeemWinningsIx(params, winningOutcome, this.client.programId);\n }\n\n withdrawFromPositionIx(\n params: WithdrawFromPositionParams,\n isToken2022: boolean\n ): TransactionInstruction {\n return buildWithdrawFromPositionIx(params, isToken2022, this.client.programId);\n }\n\n initPositionTokensIx(\n params: InitPositionTokensParams,\n numOutcomes: number\n ): TransactionInstruction {\n return buildInitPositionTokensIx(params, numOutcomes, this.client.programId);\n }\n\n extendPositionTokensIx(\n params: ExtendPositionTokensParams,\n numOutcomes: number\n ): TransactionInstruction {\n return buildExtendPositionTokensIx(params, numOutcomes, this.client.programId);\n }\n\n depositToGlobalIx(params: DepositToGlobalParams): TransactionInstruction {\n return buildDepositToGlobalIx(params, this.client.programId);\n }\n\n globalToMarketDepositIx(\n params: GlobalToMarketDepositParams,\n numOutcomes: number\n ): TransactionInstruction {\n return buildGlobalToMarketDepositIx(params, numOutcomes, this.client.programId);\n }\n\n withdrawFromGlobalIx(params: WithdrawFromGlobalParams): TransactionInstruction {\n return buildWithdrawFromGlobalIx(params, this.client.programId);\n }\n\n // ── Transaction builders (_tx convenience wrappers) ─────────────────\n\n redeemWinningsTx(\n params: RedeemWinningsParams,\n winningOutcome: number\n ): Transaction {\n const ix = this.redeemWinningsIx(params, winningOutcome);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n withdrawFromPositionTx(\n params: WithdrawFromPositionParams,\n isToken2022: boolean\n ): Transaction {\n const ix = this.withdrawFromPositionIx(params, isToken2022);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n initPositionTokensTx(\n params: InitPositionTokensParams,\n numOutcomes: number\n ): Transaction {\n const ix = this.initPositionTokensIx(params, numOutcomes);\n return new Transaction({ feePayer: params.payer }).add(ix);\n }\n\n extendPositionTokensTx(\n params: ExtendPositionTokensParams,\n numOutcomes: number\n ): Transaction {\n const ix = this.extendPositionTokensIx(params, numOutcomes);\n return new Transaction({ feePayer: params.payer }).add(ix);\n }\n\n depositToGlobalTx(params: DepositToGlobalParams): Transaction {\n const ix = this.depositToGlobalIx(params);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n globalToMarketDepositTx(\n params: GlobalToMarketDepositParams,\n numOutcomes: number\n ): Transaction {\n const ix = this.globalToMarketDepositIx(params, numOutcomes);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n withdrawFromGlobalTx(params: WithdrawFromGlobalParams): Transaction {\n const ix = this.withdrawFromGlobalIx(params);\n return new Transaction({ feePayer: params.user }).add(ix);\n }\n\n // ── Builder factories ──────────────────────────────────────────────\n\n deposit(): DepositBuilder {\n return new DepositBuilder(this.client, this.client.depositSource);\n }\n\n merge(): MergeBuilder {\n return new MergeBuilder(this.client);\n }\n\n withdraw(): WithdrawBuilder {\n return new WithdrawBuilder(this.client, this.client.depositSource);\n }\n\n redeemWinnings(): RedeemWinningsBuilder {\n return new RedeemWinningsBuilder(this.client);\n }\n\n withdrawFromPosition(): WithdrawFromPositionBuilder {\n return new WithdrawFromPositionBuilder(this.client);\n }\n\n initPositionTokens(): InitPositionTokensBuilder {\n return new InitPositionTokensBuilder(this.client);\n }\n\n extendPositionTokens(): ExtendPositionTokensBuilder {\n return new ExtendPositionTokensBuilder(this.client);\n }\n\n depositToGlobal(): DepositToGlobalBuilder {\n return new DepositToGlobalBuilder(this.client);\n }\n\n withdrawFromGlobal(): WithdrawFromGlobalBuilder {\n return new WithdrawFromGlobalBuilder(this.client);\n }\n\n globalToMarketDeposit(): GlobalToMarketDepositBuilder {\n return new GlobalToMarketDepositBuilder(this.client);\n }\n\n // ── On-chain account fetchers (require Connection) ──────────────────\n\n async getOnchain(owner: PublicKey, market: PublicKey): Promise<ProgramPosition | null> {\n const connection = requireConnection(this.client);\n const positionPda = this.pda(owner, market);\n const accountInfo = await connection.getAccountInfo(positionPda);\n if (!accountInfo) {\n return null;\n }\n return deserializeProgramPosition(accountInfo.data as Buffer);\n }\n}\n"]}
|
|
@@ -56,14 +56,15 @@ export interface DepositAssetMetadata {
|
|
|
56
56
|
symbol: string;
|
|
57
57
|
name: string;
|
|
58
58
|
iconUrl: string;
|
|
59
|
-
value: Decimal;
|
|
60
59
|
}
|
|
61
60
|
export interface DepositTokenBalance {
|
|
62
61
|
mint: PubkeyStr;
|
|
63
62
|
idle: string;
|
|
64
63
|
symbol: string;
|
|
65
64
|
name: string;
|
|
66
|
-
|
|
65
|
+
icon_url_low?: string;
|
|
66
|
+
icon_url_medium?: string;
|
|
67
|
+
icon_url_high?: string;
|
|
67
68
|
}
|
|
68
69
|
export declare function computedBase(balance: TokenBalance, conditionalPrice: Decimal): TokenBalanceComputedBase;
|
|
69
70
|
export declare function computedQuote(balance: TokenBalance): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/position/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG3D,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AAEvB,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/position/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG3D,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AAEvB,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EACrB,gBAAgB,EAAE,OAAO,GACxB,wBAAwB,CAQ1B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAG3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/position/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/position/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAgFA,oCAWC;AAED,sCAGC;AAhGD,4DAAiC;AAEjC,sDAAmD;AAEnD,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AA0EvB,SAAgB,YAAY,CAC1B,OAAqB,EACrB,gBAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,oBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,OAAO;QACL,KAAK,EAAE,IAAA,iBAAO,EAAC,KAAK,CAAC;QACrB,IAAI,EAAE,IAAA,iBAAO,EAAC,IAAI,CAAC;QACnB,KAAK,EAAE,IAAA,iBAAO,EAAC,gBAAgB,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,OAAqB;IACjD,MAAM,IAAI,GAAG,IAAI,oBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAA,iBAAO,EAAC,IAAI,CAAC,CAAC;AACvB,CAAC","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { OrderBookId, PubkeyStr } from \"../../shared\";\nimport { display } from \"../../shared/fmt/decimal\";\n\nexport * from \"./builders\";\nexport * from \"./client\";\nexport * from \"./wire\";\n\nexport interface Portfolio {\n userAddress: PubkeyStr;\n walletHoldings: WalletHolding[];\n positions: Position[];\n totalWalletValue: string;\n totalPositionsValue: string;\n}\n\nexport interface Position {\n eventPubkey: PubkeyStr;\n eventName: string;\n eventImgSrc: string;\n outcomes: PositionOutcome[];\n totalValue: string;\n createdAt: Date;\n}\n\nexport interface PositionOutcome {\n conditionId: number;\n conditionName: string;\n tokenMint: PubkeyStr;\n amount: string;\n usdValue: string;\n}\n\nexport interface WalletHolding {\n tokenMint: PubkeyStr;\n symbol: string;\n amount: string;\n decimals: number;\n usdValue: string;\n imgSrc: string;\n}\n\nexport type TokenBalanceTokenType =\n | { kind: \"DepositAsset\" }\n | {\n kind: \"ConditionalToken\";\n orderbookId: OrderBookId;\n marketPubkey: PubkeyStr;\n outcomeIndex: number;\n };\n\nexport interface TokenBalance {\n mint: PubkeyStr;\n idle: string;\n onBook: string;\n tokenType: TokenBalanceTokenType;\n}\n\nexport interface TokenBalanceComputedBase {\n value: string;\n size: string;\n price: string;\n}\n\nexport interface DepositAssetMetadata {\n symbol: string;\n name: string;\n iconUrl: string;\n}\n\nexport interface DepositTokenBalance {\n mint: PubkeyStr;\n idle: string;\n symbol: string;\n name: string;\n icon_url_low?: string;\n icon_url_medium?: string;\n icon_url_high?: string;\n}\n\nexport function computedBase(\n balance: TokenBalance,\n conditionalPrice: Decimal\n): TokenBalanceComputedBase {\n const size = new Decimal(balance.idle).plus(balance.onBook);\n const value = size.mul(conditionalPrice);\n return {\n value: display(value),\n size: display(size),\n price: display(conditionalPrice),\n };\n}\n\nexport function computedQuote(balance: TokenBalance): string {\n const size = new Decimal(balance.idle).plus(balance.onBook);\n return display(size);\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Resolution } from "../../shared";
|
|
2
2
|
import { type LightconeHttp } from "../../http";
|
|
3
|
-
import type { DepositTokenPriceHistoryResponse, OrderbookPriceHistoryResponse } from "./wire";
|
|
3
|
+
import type { DepositAssetPricesSnapshotResponse, DepositTokenPriceHistoryResponse, OrderbookPriceHistoryResponse } from "./wire";
|
|
4
4
|
interface ClientContext {
|
|
5
5
|
http: LightconeHttp;
|
|
6
6
|
}
|
|
@@ -26,6 +26,17 @@ export declare class PriceHistoryClient {
|
|
|
26
26
|
get(orderbookId: string, query?: OrderbookPriceHistoryQuery): Promise<OrderbookPriceHistoryResponse>;
|
|
27
27
|
getDepositAsset(depositAsset: string, resolution?: Resolution, from?: number, to?: number, cursor?: number, limit?: number): Promise<DepositTokenPriceHistoryResponse>;
|
|
28
28
|
getDepositAsset(depositAsset: string, query?: DepositPriceHistoryQuery): Promise<DepositTokenPriceHistoryResponse>;
|
|
29
|
+
/**
|
|
30
|
+
* Snapshot of current prices for every active mint in `global_deposit_tokens`.
|
|
31
|
+
*
|
|
32
|
+
* No params. Returns a map of mint -> price (Decimal-as-string). The
|
|
33
|
+
* backend prefers the live tick from `deposit_token_prices` and falls
|
|
34
|
+
* back to the most recent 1m candle close. Assets with neither are
|
|
35
|
+
* silently absent.
|
|
36
|
+
*
|
|
37
|
+
* For live updates, subscribe via `subscribeDepositAssetPrice` per asset.
|
|
38
|
+
*/
|
|
39
|
+
getDepositAssetPricesSnapshot(): Promise<DepositAssetPricesSnapshotResponse>;
|
|
29
40
|
getLineData(orderbookId: string, resolution?: Resolution, from?: number, to?: number, cursor?: number, limit?: number): Promise<{
|
|
30
41
|
time: number;
|
|
31
42
|
value: string;
|