@lightconexyz/lightcone-sdk 0.2.2 → 0.2.4
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 +25 -14
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/client.js +3 -7
- package/dist/auth/client.js.map +1 -1
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +17 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +36 -10
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +14 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +10 -0
- package/dist/context.js.map +1 -0
- package/dist/domain/admin/client.d.ts +15 -5
- package/dist/domain/admin/client.d.ts.map +1 -1
- package/dist/domain/admin/client.js +39 -0
- package/dist/domain/admin/client.js.map +1 -1
- package/dist/domain/index.d.ts +0 -1
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +1 -2
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/market/client.d.ts +11 -5
- package/dist/domain/market/client.d.ts.map +1 -1
- package/dist/domain/market/client.js +76 -0
- package/dist/domain/market/client.js.map +1 -1
- package/dist/domain/order/client.d.ts +21 -5
- package/dist/domain/order/client.d.ts.map +1 -1
- package/dist/domain/order/client.js +89 -0
- package/dist/domain/order/client.js.map +1 -1
- package/dist/domain/order/index.d.ts +8 -2
- package/dist/domain/order/index.d.ts.map +1 -1
- package/dist/domain/order/index.js +23 -0
- package/dist/domain/order/index.js.map +1 -1
- package/dist/domain/orderbook/client.d.ts +7 -12
- package/dist/domain/orderbook/client.d.ts.map +1 -1
- package/dist/domain/orderbook/client.js +24 -4
- package/dist/domain/orderbook/client.js.map +1 -1
- package/dist/domain/orderbook/state.d.ts +2 -0
- package/dist/domain/orderbook/state.d.ts.map +1 -1
- package/dist/domain/orderbook/state.js +25 -2
- package/dist/domain/orderbook/state.js.map +1 -1
- package/dist/domain/position/client.d.ts +11 -5
- package/dist/domain/position/client.d.ts.map +1 -1
- package/dist/domain/position/client.js +38 -0
- package/dist/domain/position/client.js.map +1 -1
- package/dist/domain/position/index.d.ts +4 -1
- package/dist/domain/position/index.d.ts.map +1 -1
- package/dist/domain/position/index.js +20 -0
- package/dist/domain/position/index.js.map +1 -1
- package/dist/domain/position/wire.d.ts +6 -0
- package/dist/domain/position/wire.d.ts.map +1 -1
- package/dist/domain/position/wire.js.map +1 -1
- package/dist/domain/price_history/client.d.ts +25 -3
- package/dist/domain/price_history/client.d.ts.map +1 -1
- package/dist/domain/price_history/client.js +95 -6
- package/dist/domain/price_history/client.js.map +1 -1
- package/dist/domain/price_history/index.d.ts +4 -0
- package/dist/domain/price_history/index.d.ts.map +1 -1
- package/dist/domain/price_history/index.js.map +1 -1
- package/dist/domain/price_history/state.d.ts +16 -0
- package/dist/domain/price_history/state.d.ts.map +1 -1
- package/dist/domain/price_history/state.js +42 -1
- package/dist/domain/price_history/state.js.map +1 -1
- package/dist/domain/price_history/wire.d.ts +51 -21
- package/dist/domain/price_history/wire.d.ts.map +1 -1
- package/dist/domain/price_history/wire.js.map +1 -1
- package/dist/http/client.d.ts.map +1 -1
- package/dist/http/client.js +17 -36
- package/dist/http/client.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/prelude.d.ts +5 -6
- package/dist/prelude.d.ts.map +1 -1
- package/dist/prelude.js +4 -5
- package/dist/prelude.js.map +1 -1
- package/dist/privy/client.d.ts +1 -0
- package/dist/privy/client.d.ts.map +1 -1
- package/dist/privy/client.js +10 -0
- package/dist/privy/client.js.map +1 -1
- package/dist/program/accounts.d.ts +2 -1
- package/dist/program/accounts.d.ts.map +1 -1
- package/dist/program/accounts.js +2 -1
- package/dist/program/accounts.js.map +1 -1
- package/dist/program/index.d.ts +1 -2
- package/dist/program/index.d.ts.map +1 -1
- package/dist/program/index.js +8 -6
- package/dist/program/index.js.map +1 -1
- package/dist/program/instructions.d.ts +1 -1
- package/dist/program/instructions.d.ts.map +1 -1
- package/dist/program/instructions.js +3 -3
- package/dist/program/instructions.js.map +1 -1
- package/dist/program/orders.d.ts +13 -1
- package/dist/program/orders.d.ts.map +1 -1
- package/dist/program/orders.js +53 -3
- package/dist/program/orders.js.map +1 -1
- package/dist/rpc.d.ts +19 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +51 -0
- package/dist/rpc.js.map +1 -0
- package/dist/shared/fmt/decimal.d.ts +1 -1
- package/dist/shared/fmt/decimal.d.ts.map +1 -1
- package/dist/shared/fmt/decimal.js +2 -2
- 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/scaling.d.ts.map +1 -1
- package/dist/shared/scaling.js +7 -3
- package/dist/shared/scaling.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 +9 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/ws/client.browser.d.ts +2 -0
- package/dist/ws/client.browser.d.ts.map +1 -1
- package/dist/ws/client.browser.js +43 -6
- package/dist/ws/client.browser.js.map +1 -1
- package/dist/ws/client.node.d.ts +2 -0
- package/dist/ws/client.node.d.ts.map +1 -1
- package/dist/ws/client.node.js +43 -6
- package/dist/ws/client.node.js.map +1 -1
- package/dist/ws/index.d.ts +1 -2
- package/dist/ws/index.d.ts.map +1 -1
- package/dist/ws/index.js.map +1 -1
- package/dist/ws/types.d.ts +2 -0
- package/dist/ws/types.d.ts.map +1 -1
- package/dist/ws/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/domain/deposit_price/client.d.ts +0 -13
- package/dist/domain/deposit_price/client.d.ts.map +0 -1
- package/dist/domain/deposit_price/client.js +0 -28
- package/dist/domain/deposit_price/client.js.map +0 -1
- package/dist/domain/deposit_price/index.d.ts +0 -9
- package/dist/domain/deposit_price/index.d.ts.map +0 -1
- package/dist/domain/deposit_price/index.js +0 -20
- package/dist/domain/deposit_price/index.js.map +0 -1
- package/dist/domain/deposit_price/state.d.ts +0 -17
- package/dist/domain/deposit_price/state.d.ts.map +0 -1
- package/dist/domain/deposit_price/state.js +0 -45
- package/dist/domain/deposit_price/state.js.map +0 -1
- package/dist/domain/deposit_price/wire.d.ts +0 -36
- package/dist/domain/deposit_price/wire.d.ts.map +0 -1
- package/dist/domain/deposit_price/wire.js +0 -3
- package/dist/domain/deposit_price/wire.js.map +0 -1
- package/dist/program/client.d.ts +0 -96
- package/dist/program/client.d.ts.map +0 -1
- package/dist/program/client.js +0 -372
- package/dist/program/client.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/program/orders.ts"],"names":[],"mappings":"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","sourcesContent":["import { PublicKey, Keypair } from \"@solana/web3.js\";\nimport { sign } from \"tweetnacl\";\nimport type {\n DepositSource,\n SubmitOrderRequest,\n TimeInForce,\n TriggerType,\n} from \"../shared\";\nimport {\n SignedOrder,\n Order,\n OrderSide,\n BidOrderParams,\n AskOrderParams,\n} from \"./types\";\nimport { ORDER_SIZE } from \"./constants\";\nimport {\n keccak256,\n toU64Le,\n toI64Le,\n toU8,\n toU32Le,\n fromLeBytes,\n fromI64Le,\n deriveConditionId,\n} from \"./utils\";\n\nfunction bigintToSafeNumber(value: bigint, field: string): number {\n const max = BigInt(Number.MAX_SAFE_INTEGER);\n if (value > max || value < -max) {\n throw new Error(`${field} exceeds Number.MAX_SAFE_INTEGER`);\n }\n return Number(value);\n}\n\n\n// ============================================================================\n// ORDER HASHING\n// ============================================================================\n\n/**\n * Hash an order using keccak256\n * Layout (161 bytes - order without signature):\n * nonce (8) || maker (32) || market (32) || baseMint (32) || quoteMint (32) ||\n * side (1) || amountIn (8) || amountOut (8) || expiration (8)\n *\n * @returns 32-byte keccak256 hash\n */\nexport function hashOrder(order: SignedOrder): Buffer {\n const data = Buffer.concat([\n toU64Le(BigInt(order.nonce)),\n order.maker.toBuffer(),\n order.market.toBuffer(),\n order.baseMint.toBuffer(),\n order.quoteMint.toBuffer(),\n toU8(order.side),\n toU64Le(order.amountIn),\n toU64Le(order.amountOut),\n toI64Le(order.expiration),\n ]);\n\n return keccak256(data);\n}\n\n/**\n * Get the hex-encoded hash of an order\n */\nexport function hashOrderHex(order: SignedOrder): string {\n return hashOrder(order).toString(\"hex\");\n}\n\n/**\n * Get the message to sign for an order (the order hash)\n */\nexport function getOrderMessage(order: SignedOrder): Buffer {\n return hashOrder(order);\n}\n\n// ============================================================================\n// ORDER SIGNING\n// ============================================================================\n\n/**\n * Sign an order with a Keypair.\n * Signs the hex-encoded keccak hash (64-char ASCII string) for cross-compatibility with Rust.\n * Returns 64-byte Ed25519 signature.\n */\nexport function signOrder(order: SignedOrder, signer: Keypair): Buffer {\n const hash = hashOrder(order);\n const hexString = hash.toString(\"hex\");\n const messageBytes = Buffer.from(hexString, \"ascii\");\n const signature = sign.detached(messageBytes, signer.secretKey);\n return Buffer.from(signature);\n}\n\n/**\n * Sign an order and return a new order with the signature attached\n */\nexport function signOrderFull(\n order: Omit<SignedOrder, \"signature\">,\n signer: Keypair\n): SignedOrder {\n const orderWithEmptySig: SignedOrder = {\n ...order,\n signature: Buffer.alloc(64),\n };\n const signature = signOrder(orderWithEmptySig, signer);\n return {\n ...order,\n signature,\n };\n}\n\n/**\n * Verify an order's signature.\n * Verifies against the hex-encoded keccak hash.\n */\nexport function verifyOrderSignature(order: SignedOrder): boolean {\n const hash = hashOrder(order);\n const hexString = hash.toString(\"hex\");\n const messageBytes = Buffer.from(hexString, \"ascii\");\n return sign.detached.verify(\n messageBytes,\n order.signature,\n order.maker.toBytes()\n );\n}\n\n// ============================================================================\n// SIGNED ORDER SERIALIZATION (225 bytes)\n// ============================================================================\n\n/**\n * Serialize a signed order to bytes (225 bytes)\n *\n * Layout:\n * [0..8] nonce (u64)\n * [8..40] maker (Pubkey)\n * [40..72] market (Pubkey)\n * [72..104] baseMint (Pubkey)\n * [104..136] quoteMint (Pubkey)\n * [136] side (u8)\n * [137..145] amountIn (u64)\n * [145..153] amountOut (u64)\n * [153..161] expiration (i64)\n * [161..225] signature (64 bytes)\n */\nexport function serializeSignedOrder(order: SignedOrder): Buffer {\n const buffer = Buffer.alloc(ORDER_SIZE.SIGNED_ORDER);\n let offset = 0;\n\n toU64Le(BigInt(order.nonce)).copy(buffer, offset);\n offset += 8;\n\n order.maker.toBuffer().copy(buffer, offset);\n offset += 32;\n\n order.market.toBuffer().copy(buffer, offset);\n offset += 32;\n\n order.baseMint.toBuffer().copy(buffer, offset);\n offset += 32;\n\n order.quoteMint.toBuffer().copy(buffer, offset);\n offset += 32;\n\n buffer[offset] = order.side;\n offset += 1;\n\n toU64Le(order.amountIn).copy(buffer, offset);\n offset += 8;\n\n toU64Le(order.amountOut).copy(buffer, offset);\n offset += 8;\n\n toI64Le(order.expiration).copy(buffer, offset);\n offset += 8;\n\n order.signature.copy(buffer, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize a signed order from bytes\n */\nexport function deserializeSignedOrder(data: Buffer): SignedOrder {\n if (data.length < ORDER_SIZE.SIGNED_ORDER) {\n throw new Error(\n `Invalid signed order length: ${data.length}, expected ${ORDER_SIZE.SIGNED_ORDER}`\n );\n }\n\n let offset = 0;\n\n const nonceU64 = fromLeBytes(data.subarray(offset, offset + 8));\n if (nonceU64 > 0xFFFFFFFFn) {\n throw new Error(`Nonce exceeds u32 range: ${nonceU64}`);\n }\n const nonce = Number(nonceU64);\n offset += 8;\n\n const maker = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const market = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const baseMint = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const quoteMint = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const side = data[offset] as OrderSide;\n offset += 1;\n\n const amountIn = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const amountOut = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const expiration = fromI64Le(data.subarray(offset, offset + 8));\n offset += 8;\n\n const signature = Buffer.from(data.subarray(offset, offset + 64));\n\n return {\n nonce,\n maker,\n market,\n baseMint,\n quoteMint,\n side,\n amountIn,\n amountOut,\n expiration,\n signature,\n };\n}\n\n// ============================================================================\n// ORDER SERIALIZATION (29 bytes)\n// ============================================================================\n\n/**\n * Serialize a compact order to bytes (29 bytes)\n *\n * Layout:\n * [0..4] nonce (u32)\n * [4] side (u8)\n * [5..13] amountIn (u64)\n * [13..21] amountOut (u64)\n * [21..29] expiration (i64)\n */\nexport function serializeOrder(order: Order): Buffer {\n const buffer = Buffer.alloc(ORDER_SIZE.ORDER);\n let offset = 0;\n\n toU32Le(order.nonce).copy(buffer, offset);\n offset += 4;\n\n buffer[offset] = order.side;\n offset += 1;\n\n toU64Le(order.amountIn).copy(buffer, offset);\n offset += 8;\n\n toU64Le(order.amountOut).copy(buffer, offset);\n offset += 8;\n\n toI64Le(order.expiration).copy(buffer, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize a compact order from bytes\n */\nexport function deserializeOrder(data: Buffer): Order {\n if (data.length < ORDER_SIZE.ORDER) {\n throw new Error(\n `Invalid order length: ${data.length}, expected ${ORDER_SIZE.ORDER}`\n );\n }\n\n let offset = 0;\n\n const nonce = data.readUInt32LE(offset);\n offset += 4;\n\n const side = data[offset] as OrderSide;\n offset += 1;\n\n const amountIn = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const amountOut = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const expiration = fromI64Le(data.subarray(offset, offset + 8));\n\n return {\n nonce,\n side,\n amountIn,\n amountOut,\n expiration,\n };\n}\n\n/**\n * Convert a SignedOrder to a compact Order (drop maker)\n */\nexport function signedOrderToOrder(order: SignedOrder): Order {\n return {\n nonce: order.nonce,\n side: order.side,\n amountIn: order.amountIn,\n amountOut: order.amountOut,\n expiration: order.expiration,\n };\n}\n\n// ============================================================================\n// ORDER CREATION HELPERS\n// ============================================================================\n\n/**\n * Create a BID order (buyer wants base tokens, pays with quote tokens)\n */\nexport function createBidOrder(\n params: BidOrderParams\n): Omit<SignedOrder, \"signature\"> {\n return {\n nonce: params.nonce,\n maker: params.maker,\n market: params.market,\n baseMint: params.baseMint,\n quoteMint: params.quoteMint,\n side: OrderSide.BID,\n amountIn: params.amountIn,\n amountOut: params.amountOut,\n expiration: params.expiration ?? 0n,\n };\n}\n\n/**\n * Create an ASK order (seller offers base tokens, receives quote tokens)\n */\nexport function createAskOrder(\n params: AskOrderParams\n): Omit<SignedOrder, \"signature\"> {\n return {\n nonce: params.nonce,\n maker: params.maker,\n market: params.market,\n baseMint: params.baseMint,\n quoteMint: params.quoteMint,\n side: OrderSide.ASK,\n amountIn: params.amountIn,\n amountOut: params.amountOut,\n expiration: params.expiration ?? 0n,\n };\n}\n\n/**\n * Create and sign a BID order in one step\n */\nexport function createSignedBidOrder(\n params: BidOrderParams,\n signer: Keypair\n): SignedOrder {\n const order = createBidOrder(params);\n return signOrderFull(order, signer);\n}\n\n/**\n * Create and sign an ASK order in one step\n */\nexport function createSignedAskOrder(\n params: AskOrderParams,\n signer: Keypair\n): SignedOrder {\n const order = createAskOrder(params);\n return signOrderFull(order, signer);\n}\n\n// ============================================================================\n// ORDER VALIDATION\n// ============================================================================\n\n/**\n * Check if an order has expired\n */\nexport function isOrderExpired(\n order: SignedOrder | Order,\n currentTime?: bigint\n): boolean {\n if (order.expiration === 0n) {\n return false;\n }\n const now = currentTime ?? BigInt(Math.floor(Date.now() / 1000));\n return order.expiration < now;\n}\n\n/**\n * Validate order crossing (orders are compatible for matching)\n */\nexport function ordersCanCross(\n buyOrder: SignedOrder,\n sellOrder: SignedOrder\n): boolean {\n if (buyOrder.side !== OrderSide.BID || sellOrder.side !== OrderSide.ASK) {\n return false;\n }\n return (\n buyOrder.amountIn * sellOrder.amountIn >=\n buyOrder.amountOut * sellOrder.amountOut\n );\n}\n\n/**\n * Calculate the fill amounts for a trade\n */\nexport function calculateTakerFill(\n makerOrder: SignedOrder,\n makerFillAmount: bigint\n): bigint {\n return (makerFillAmount * makerOrder.amountOut) / makerOrder.amountIn;\n}\n\n// ============================================================================\n// SIGNED ORDER HELPERS\n// ============================================================================\n\n/**\n * Get signature as hex string (128 chars)\n */\nexport function signatureHex(order: SignedOrder): string {\n return order.signature.toString(\"hex\");\n}\n\n/**\n * Check if a signed order has a non-zero signature\n */\nexport function isSigned(order: SignedOrder): boolean {\n return !order.signature.every((b) => b === 0);\n}\n\n/**\n * Derive orderbook ID from base and quote token addresses.\n * Delegates to the canonical implementation in shared/types.\n */\nexport { deriveOrderbookId } from \"../shared/types\";\n\n// ============================================================================\n// CANCEL ORDER SIGNING\n// ============================================================================\n\n/**\n * Build the message bytes for cancelling an order.\n * The message is the order hash hex string as UTF-8 bytes (same protocol as order signing).\n */\nexport function cancelOrderMessage(orderHash: string): Uint8Array {\n return Buffer.from(orderHash, \"ascii\");\n}\n\n/**\n * Build the message bytes for cancelling a trigger order.\n * The message is the trigger order ID as UTF-8 bytes.\n */\nexport function cancelTriggerOrderMessage(triggerOrderId: string): Uint8Array {\n return Buffer.from(triggerOrderId, \"ascii\");\n}\n\n/**\n * Sign a cancel order request.\n * Returns the signature as a 128-char hex string.\n */\nexport function signCancelOrder(orderHash: string, signer: Keypair): string {\n const message = cancelOrderMessage(orderHash);\n const signature = sign.detached(message, signer.secretKey);\n return Buffer.from(signature).toString(\"hex\");\n}\n\n/**\n * Sign a cancel trigger-order request.\n * Returns the signature as a 128-char hex string.\n */\nexport function signCancelTriggerOrder(triggerOrderId: string, signer: Keypair): string {\n const message = cancelTriggerOrderMessage(triggerOrderId);\n const signature = sign.detached(message, signer.secretKey);\n return Buffer.from(signature).toString(\"hex\");\n}\n\n/**\n * Build the message string for cancelling all orders.\n * Format: \"cancel_all:{pubkey}:{orderbook_id}:{timestamp}:{salt}\"\n */\nexport function cancelAllMessage(\n userPubkey: string,\n orderbookId: string,\n timestamp: number,\n salt: string\n): string {\n return `cancel_all:${userPubkey}:${orderbookId}:${timestamp}:${salt}`;\n}\n\n/**\n * Generate a random salt for cancel-all replay protection.\n * Returns an RFC 4122 UUID v4 string.\n */\nexport function generateCancelAllSalt(): string {\n return globalThis.crypto.randomUUID();\n}\n\n/**\n * Sign a cancel-all orders request.\n * Returns the signature as a 128-char hex string.\n */\nexport function signCancelAll(\n userPubkey: string,\n orderbookId: string,\n timestamp: number,\n salt: string,\n signer: Keypair\n): string {\n const message = cancelAllMessage(userPubkey, orderbookId, timestamp, salt);\n const messageBytes = Buffer.from(message, \"ascii\");\n const signature = sign.detached(messageBytes, signer.secretKey);\n return Buffer.from(signature).toString(\"hex\");\n}\n\n// ============================================================================\n// SUBMIT REQUEST HELPERS\n// ============================================================================\n\n/**\n * Convert a SignedOrder to a SubmitOrderRequest-compatible object\n */\nexport interface SubmitRequestOptions {\n timeInForce?: TimeInForce;\n triggerPrice?: number;\n triggerType?: TriggerType;\n depositSource?: DepositSource;\n}\n\nexport function toSubmitRequest(\n order: SignedOrder,\n orderbookId: string,\n options: SubmitRequestOptions = {}\n): SubmitOrderRequest {\n return {\n maker: order.maker.toBase58(),\n nonce: order.nonce,\n market_pubkey: order.market.toBase58(),\n base_token: order.baseMint.toBase58(),\n quote_token: order.quoteMint.toBase58(),\n side: order.side,\n amount_in: bigintToSafeNumber(order.amountIn, \"amount_in\"),\n amount_out: bigintToSafeNumber(order.amountOut, \"amount_out\"),\n expiration: bigintToSafeNumber(order.expiration, \"expiration\"),\n signature: signatureHex(order),\n orderbook_id: orderbookId,\n tif: options.timeInForce,\n trigger_price: options.triggerPrice,\n trigger_type: options.triggerType,\n deposit_source: options.depositSource,\n };\n}\n\n// Rust-compatible snake_case aliases.\nexport const is_order_expired = isOrderExpired;\nexport const orders_can_cross = ordersCanCross;\nexport const calculate_taker_fill = calculateTakerFill;\nexport const cancel_order_message = cancelOrderMessage;\nexport const cancel_trigger_order_message = cancelTriggerOrderMessage;\nexport const cancel_all_message = cancelAllMessage;\nexport const generate_cancel_all_salt = generateCancelAllSalt;\nexport const derive_condition_id = deriveConditionId;\n"]}
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/program/orders.ts"],"names":[],"mappings":"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","sourcesContent":["import { PublicKey, Keypair } from \"@solana/web3.js\";\nimport { sign } from \"tweetnacl\";\nimport bs58 from \"bs58\";\nimport type {\n DepositSource,\n SubmitOrderRequest,\n TimeInForce,\n TriggerType,\n} from \"../shared\";\nimport {\n SignedOrder,\n Order,\n OrderSide,\n BidOrderParams,\n AskOrderParams,\n} from \"./types\";\nimport { ORDER_SIZE } from \"./constants\";\nimport {\n keccak256,\n toU64Le,\n toI64Le,\n toU8,\n toU32Le,\n fromLeBytes,\n fromI64Le,\n deriveConditionId,\n} from \"./utils\";\n\nfunction bigintToSafeNumber(value: bigint, field: string): number {\n const max = BigInt(Number.MAX_SAFE_INTEGER);\n if (value > max || value < -max) {\n throw new Error(`${field} exceeds Number.MAX_SAFE_INTEGER`);\n }\n return Number(value);\n}\n\n\n// ============================================================================\n// ORDER HASHING\n// ============================================================================\n\n/**\n * Hash an order using keccak256\n * Layout (161 bytes - order without signature):\n * nonce (8) || maker (32) || market (32) || baseMint (32) || quoteMint (32) ||\n * side (1) || amountIn (8) || amountOut (8) || expiration (8)\n *\n * @returns 32-byte keccak256 hash\n */\nexport function hashOrder(order: SignedOrder): Buffer {\n const data = Buffer.concat([\n toU64Le(BigInt(order.nonce)),\n order.maker.toBuffer(),\n order.market.toBuffer(),\n order.baseMint.toBuffer(),\n order.quoteMint.toBuffer(),\n toU8(order.side),\n toU64Le(order.amountIn),\n toU64Le(order.amountOut),\n toI64Le(order.expiration),\n ]);\n\n return keccak256(data);\n}\n\n/**\n * Get the hex-encoded hash of an order\n */\nexport function hashOrderHex(order: SignedOrder): string {\n return hashOrder(order).toString(\"hex\");\n}\n\n/**\n * Get the message to sign for an order (the order hash)\n */\nexport function getOrderMessage(order: SignedOrder): Buffer {\n return hashOrder(order);\n}\n\n// ============================================================================\n// ORDER SIGNING\n// ============================================================================\n\n/**\n * Sign an order with a Keypair.\n * Signs the hex-encoded keccak hash (64-char ASCII string) for cross-compatibility with Rust.\n * Returns 64-byte Ed25519 signature.\n */\nexport function signOrder(order: SignedOrder, signer: Keypair): Buffer {\n const hash = hashOrder(order);\n const hexString = hash.toString(\"hex\");\n const messageBytes = Buffer.from(hexString, \"ascii\");\n const signature = sign.detached(messageBytes, signer.secretKey);\n return Buffer.from(signature);\n}\n\n/**\n * Sign an order and return a new order with the signature attached\n */\nexport function signOrderFull(\n order: Omit<SignedOrder, \"signature\">,\n signer: Keypair\n): SignedOrder {\n const orderWithEmptySig: SignedOrder = {\n ...order,\n signature: Buffer.alloc(64),\n };\n const signature = signOrder(orderWithEmptySig, signer);\n return {\n ...order,\n signature,\n };\n}\n\n/**\n * Verify an order's signature.\n * Verifies against the hex-encoded keccak hash.\n */\nexport function verifyOrderSignature(order: SignedOrder): boolean {\n const hash = hashOrder(order);\n const hexString = hash.toString(\"hex\");\n const messageBytes = Buffer.from(hexString, \"ascii\");\n return sign.detached.verify(\n messageBytes,\n order.signature,\n order.maker.toBytes()\n );\n}\n\n// ============================================================================\n// SIGNED ORDER SERIALIZATION (225 bytes)\n// ============================================================================\n\n/**\n * Serialize a signed order to bytes (225 bytes)\n *\n * Layout:\n * [0..8] nonce (u64)\n * [8..40] maker (Pubkey)\n * [40..72] market (Pubkey)\n * [72..104] baseMint (Pubkey)\n * [104..136] quoteMint (Pubkey)\n * [136] side (u8)\n * [137..145] amountIn (u64)\n * [145..153] amountOut (u64)\n * [153..161] expiration (i64)\n * [161..225] signature (64 bytes)\n */\nexport function serializeSignedOrder(order: SignedOrder): Buffer {\n const buffer = Buffer.alloc(ORDER_SIZE.SIGNED_ORDER);\n let offset = 0;\n\n toU64Le(BigInt(order.nonce)).copy(buffer, offset);\n offset += 8;\n\n order.maker.toBuffer().copy(buffer, offset);\n offset += 32;\n\n order.market.toBuffer().copy(buffer, offset);\n offset += 32;\n\n order.baseMint.toBuffer().copy(buffer, offset);\n offset += 32;\n\n order.quoteMint.toBuffer().copy(buffer, offset);\n offset += 32;\n\n buffer[offset] = order.side;\n offset += 1;\n\n toU64Le(order.amountIn).copy(buffer, offset);\n offset += 8;\n\n toU64Le(order.amountOut).copy(buffer, offset);\n offset += 8;\n\n toI64Le(order.expiration).copy(buffer, offset);\n offset += 8;\n\n order.signature.copy(buffer, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize a signed order from bytes\n */\nexport function deserializeSignedOrder(data: Buffer): SignedOrder {\n if (data.length < ORDER_SIZE.SIGNED_ORDER) {\n throw new Error(\n `Invalid signed order length: ${data.length}, expected ${ORDER_SIZE.SIGNED_ORDER}`\n );\n }\n\n let offset = 0;\n\n const nonceU64 = fromLeBytes(data.subarray(offset, offset + 8));\n if (nonceU64 > 0xFFFFFFFFn) {\n throw new Error(`Nonce exceeds u32 range: ${nonceU64}`);\n }\n const nonce = Number(nonceU64);\n offset += 8;\n\n const maker = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const market = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const baseMint = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const quoteMint = new PublicKey(data.subarray(offset, offset + 32));\n offset += 32;\n\n const side = data[offset] as OrderSide;\n offset += 1;\n\n const amountIn = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const amountOut = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const expiration = fromI64Le(data.subarray(offset, offset + 8));\n offset += 8;\n\n const signature = Buffer.from(data.subarray(offset, offset + 64));\n\n return {\n nonce,\n maker,\n market,\n baseMint,\n quoteMint,\n side,\n amountIn,\n amountOut,\n expiration,\n signature,\n };\n}\n\n// ============================================================================\n// ORDER SERIALIZATION (29 bytes)\n// ============================================================================\n\n/**\n * Serialize a compact order to bytes (29 bytes)\n *\n * Layout:\n * [0..4] nonce (u32)\n * [4] side (u8)\n * [5..13] amountIn (u64)\n * [13..21] amountOut (u64)\n * [21..29] expiration (i64)\n */\nexport function serializeOrder(order: Order): Buffer {\n const buffer = Buffer.alloc(ORDER_SIZE.ORDER);\n let offset = 0;\n\n toU32Le(order.nonce).copy(buffer, offset);\n offset += 4;\n\n buffer[offset] = order.side;\n offset += 1;\n\n toU64Le(order.amountIn).copy(buffer, offset);\n offset += 8;\n\n toU64Le(order.amountOut).copy(buffer, offset);\n offset += 8;\n\n toI64Le(order.expiration).copy(buffer, offset);\n\n return buffer;\n}\n\n/**\n * Deserialize a compact order from bytes\n */\nexport function deserializeOrder(data: Buffer): Order {\n if (data.length < ORDER_SIZE.ORDER) {\n throw new Error(\n `Invalid order length: ${data.length}, expected ${ORDER_SIZE.ORDER}`\n );\n }\n\n let offset = 0;\n\n const nonce = data.readUInt32LE(offset);\n offset += 4;\n\n const side = data[offset] as OrderSide;\n offset += 1;\n\n const amountIn = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const amountOut = fromLeBytes(data.subarray(offset, offset + 8));\n offset += 8;\n\n const expiration = fromI64Le(data.subarray(offset, offset + 8));\n\n return {\n nonce,\n side,\n amountIn,\n amountOut,\n expiration,\n };\n}\n\n/**\n * Convert a SignedOrder to a compact Order (drop maker)\n */\nexport function signedOrderToOrder(order: SignedOrder): Order {\n return {\n nonce: order.nonce,\n side: order.side,\n amountIn: order.amountIn,\n amountOut: order.amountOut,\n expiration: order.expiration,\n };\n}\n\n/**\n * Expand a compact Order back to a full SignedOrder using provided pubkeys and signature.\n * Rust equivalent: Order::to_signed()\n */\nexport function orderToSigned(\n order: Order,\n maker: PublicKey,\n market: PublicKey,\n baseMint: PublicKey,\n quoteMint: PublicKey,\n signature: Buffer\n): SignedOrder {\n return {\n nonce: order.nonce,\n maker,\n market,\n baseMint,\n quoteMint,\n side: order.side,\n amountIn: order.amountIn,\n amountOut: order.amountOut,\n expiration: order.expiration,\n signature,\n };\n}\n\n// ============================================================================\n// ORDER CREATION HELPERS\n// ============================================================================\n\n/**\n * Create a BID order (buyer wants base tokens, pays with quote tokens)\n */\nexport function createBidOrder(\n params: BidOrderParams\n): Omit<SignedOrder, \"signature\"> {\n return {\n nonce: params.nonce,\n maker: params.maker,\n market: params.market,\n baseMint: params.baseMint,\n quoteMint: params.quoteMint,\n side: OrderSide.BID,\n amountIn: params.amountIn,\n amountOut: params.amountOut,\n expiration: params.expiration ?? 0n,\n };\n}\n\n/**\n * Create an ASK order (seller offers base tokens, receives quote tokens)\n */\nexport function createAskOrder(\n params: AskOrderParams\n): Omit<SignedOrder, \"signature\"> {\n return {\n nonce: params.nonce,\n maker: params.maker,\n market: params.market,\n baseMint: params.baseMint,\n quoteMint: params.quoteMint,\n side: OrderSide.ASK,\n amountIn: params.amountIn,\n amountOut: params.amountOut,\n expiration: params.expiration ?? 0n,\n };\n}\n\n/**\n * Create and sign a BID order in one step\n */\nexport function createSignedBidOrder(\n params: BidOrderParams,\n signer: Keypair\n): SignedOrder {\n const order = createBidOrder(params);\n return signOrderFull(order, signer);\n}\n\n/**\n * Create and sign an ASK order in one step\n */\nexport function createSignedAskOrder(\n params: AskOrderParams,\n signer: Keypair\n): SignedOrder {\n const order = createAskOrder(params);\n return signOrderFull(order, signer);\n}\n\n// ============================================================================\n// ORDER VALIDATION\n// ============================================================================\n\n/**\n * Check if an order has expired\n */\nexport function isOrderExpired(\n order: SignedOrder | Order,\n currentTime?: bigint\n): boolean {\n if (order.expiration === 0n) {\n return false;\n }\n const now = currentTime ?? BigInt(Math.floor(Date.now() / 1000));\n return order.expiration <= now;\n}\n\n/**\n * Validate order crossing (orders are compatible for matching)\n */\nexport function ordersCanCross(\n buyOrder: SignedOrder,\n sellOrder: SignedOrder\n): boolean {\n if (buyOrder.side !== OrderSide.BID || sellOrder.side !== OrderSide.ASK) {\n return false;\n }\n\n if (\n buyOrder.amountIn === 0n ||\n buyOrder.amountOut === 0n ||\n sellOrder.amountIn === 0n ||\n sellOrder.amountOut === 0n\n ) {\n return false;\n }\n\n return (\n buyOrder.amountIn * sellOrder.amountIn >=\n buyOrder.amountOut * sellOrder.amountOut\n );\n}\n\n/**\n * Calculate the fill amounts for a trade\n */\nexport function calculateTakerFill(\n makerOrder: SignedOrder,\n makerFillAmount: bigint\n): bigint {\n if (makerOrder.amountIn === 0n) {\n throw new Error(\"Overflow: makerOrder.amountIn is zero\");\n }\n\n const result = (makerFillAmount * makerOrder.amountOut) / makerOrder.amountIn;\n\n if (result > BigInt(\"18446744073709551615\")) {\n throw new Error(\"Overflow: taker fill exceeds u64 max\");\n }\n\n return result;\n}\n\n// ============================================================================\n// SIGNED ORDER HELPERS\n// ============================================================================\n\n/**\n * Get signature as hex string (128 chars)\n */\nexport function signatureHex(order: SignedOrder): string {\n return order.signature.toString(\"hex\");\n}\n\n/**\n * Check if a signed order has a non-zero signature\n */\nexport function isSigned(order: SignedOrder): boolean {\n return !order.signature.every((b) => b === 0);\n}\n\n/**\n * Apply an external base58-encoded signature to an unsigned order.\n * Rust equivalent: OrderPayload::apply_signature()\n */\nexport function applySignature(\n order: Omit<SignedOrder, \"signature\">,\n signatureBs58: string\n): SignedOrder {\n const sigBytes = bs58.decode(signatureBs58);\n if (sigBytes.length !== 64) {\n throw new Error(`Invalid signature length: ${sigBytes.length}, expected 64`);\n }\n return { ...order, signature: Buffer.from(sigBytes) };\n}\n\n/**\n * Derive orderbook ID from base and quote token addresses.\n * Delegates to the canonical implementation in shared/types.\n */\nexport { deriveOrderbookId } from \"../shared/types\";\n\n// ============================================================================\n// CANCEL ORDER SIGNING\n// ============================================================================\n\n/**\n * Build the message bytes for cancelling an order.\n * The message is the order hash hex string as UTF-8 bytes (same protocol as order signing).\n */\nexport function cancelOrderMessage(orderHash: string): Uint8Array {\n return Buffer.from(orderHash, \"ascii\");\n}\n\n/**\n * Build the message bytes for cancelling a trigger order.\n * The message is the trigger order ID as UTF-8 bytes.\n */\nexport function cancelTriggerOrderMessage(triggerOrderId: string): Uint8Array {\n return Buffer.from(triggerOrderId, \"ascii\");\n}\n\n/**\n * Sign a cancel order request.\n * Returns the signature as a 128-char hex string.\n */\nexport function signCancelOrder(orderHash: string, signer: Keypair): string {\n const message = cancelOrderMessage(orderHash);\n const signature = sign.detached(message, signer.secretKey);\n return Buffer.from(signature).toString(\"hex\");\n}\n\n/**\n * Sign a cancel trigger-order request.\n * Returns the signature as a 128-char hex string.\n */\nexport function signCancelTriggerOrder(triggerOrderId: string, signer: Keypair): string {\n const message = cancelTriggerOrderMessage(triggerOrderId);\n const signature = sign.detached(message, signer.secretKey);\n return Buffer.from(signature).toString(\"hex\");\n}\n\n/**\n * Build the message string for cancelling all orders.\n * Format: \"cancel_all:{pubkey}:{orderbook_id}:{timestamp}:{salt}\"\n */\nexport function cancelAllMessage(\n userPubkey: string,\n orderbookId: string,\n timestamp: number,\n salt: string\n): string {\n return `cancel_all:${userPubkey}:${orderbookId}:${timestamp}:${salt}`;\n}\n\n/**\n * Generate a random salt for cancel-all replay protection.\n * Returns an RFC 4122 UUID v4 string.\n */\nexport function generateCancelAllSalt(): string {\n return globalThis.crypto.randomUUID();\n}\n\n/**\n * Sign a cancel-all orders request.\n * Returns the signature as a 128-char hex string.\n */\nexport function signCancelAll(\n userPubkey: string,\n orderbookId: string,\n timestamp: number,\n salt: string,\n signer: Keypair\n): string {\n const message = cancelAllMessage(userPubkey, orderbookId, timestamp, salt);\n const messageBytes = Buffer.from(message, \"ascii\");\n const signature = sign.detached(messageBytes, signer.secretKey);\n return Buffer.from(signature).toString(\"hex\");\n}\n\n// ============================================================================\n// SUBMIT REQUEST HELPERS\n// ============================================================================\n\n/**\n * Convert a SignedOrder to a SubmitOrderRequest-compatible object\n */\nexport interface SubmitRequestOptions {\n timeInForce?: TimeInForce;\n triggerPrice?: number;\n triggerType?: TriggerType;\n depositSource?: DepositSource;\n}\n\nexport function toSubmitRequest(\n order: SignedOrder,\n orderbookId: string,\n options: SubmitRequestOptions = {}\n): SubmitOrderRequest {\n return {\n maker: order.maker.toBase58(),\n nonce: order.nonce,\n market_pubkey: order.market.toBase58(),\n base_token: order.baseMint.toBase58(),\n quote_token: order.quoteMint.toBase58(),\n side: order.side,\n amount_in: bigintToSafeNumber(order.amountIn, \"amount_in\"),\n amount_out: bigintToSafeNumber(order.amountOut, \"amount_out\"),\n expiration: bigintToSafeNumber(order.expiration, \"expiration\"),\n signature: signatureHex(order),\n orderbook_id: orderbookId,\n tif: options.timeInForce,\n trigger_price: options.triggerPrice,\n trigger_type: options.triggerType,\n deposit_source: options.depositSource,\n };\n}\n\n// Rust-compatible snake_case aliases.\nexport const is_order_expired = isOrderExpired;\nexport const orders_can_cross = ordersCanCross;\nexport const calculate_taker_fill = calculateTakerFill;\nexport const cancel_order_message = cancelOrderMessage;\nexport const cancel_trigger_order_message = cancelTriggerOrderMessage;\nexport const cancel_all_message = cancelAllMessage;\nexport const generate_cancel_all_salt = generateCancelAllSalt;\nexport const derive_condition_id = deriveConditionId;\nexport const apply_signature = applySignature;\nexport const order_to_signed = orderToSigned;\n"]}
|
package/dist/rpc.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Connection, PublicKey } from "@solana/web3.js";
|
|
2
|
+
import type { ClientContext } from "./context";
|
|
3
|
+
import type { Exchange, GlobalDepositToken } from "./program/types";
|
|
4
|
+
export declare class Rpc {
|
|
5
|
+
private readonly client;
|
|
6
|
+
constructor(client: ClientContext);
|
|
7
|
+
/** Get the underlying Connection, or throw if not configured. */
|
|
8
|
+
inner(): Connection;
|
|
9
|
+
getExchangePda(): PublicKey;
|
|
10
|
+
getGlobalDepositTokenPda(mint: PublicKey): PublicKey;
|
|
11
|
+
getUserGlobalDepositPda(user: PublicKey, mint: PublicKey): PublicKey;
|
|
12
|
+
getLatestBlockhash(): Promise<{
|
|
13
|
+
blockhash: string;
|
|
14
|
+
lastValidBlockHeight: number;
|
|
15
|
+
}>;
|
|
16
|
+
getExchange(): Promise<Exchange>;
|
|
17
|
+
getGlobalDepositToken(mint: PublicKey): Promise<GlobalDepositToken>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAW/C,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,qBAAa,GAAG;IACF,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAElD,iEAAiE;IACjE,KAAK,IAAI,UAAU;IAMnB,cAAc,IAAI,SAAS;IAI3B,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS;IAIpD,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS;IAM9D,kBAAkB,IAAI,OAAO,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IAKI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAUhC,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAW1E"}
|
package/dist/rpc.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Rpc = void 0;
|
|
4
|
+
const context_1 = require("./context");
|
|
5
|
+
const pda_1 = require("./program/pda");
|
|
6
|
+
const accounts_1 = require("./program/accounts");
|
|
7
|
+
class Rpc {
|
|
8
|
+
client;
|
|
9
|
+
constructor(client) {
|
|
10
|
+
this.client = client;
|
|
11
|
+
}
|
|
12
|
+
/** Get the underlying Connection, or throw if not configured. */
|
|
13
|
+
inner() {
|
|
14
|
+
return (0, context_1.requireConnection)(this.client);
|
|
15
|
+
}
|
|
16
|
+
// ── PDA helpers (sync, no Connection needed) ──────────────────────────
|
|
17
|
+
getExchangePda() {
|
|
18
|
+
return (0, pda_1.getExchangePda)(this.client.programId)[0];
|
|
19
|
+
}
|
|
20
|
+
getGlobalDepositTokenPda(mint) {
|
|
21
|
+
return (0, pda_1.getGlobalDepositTokenPda)(mint, this.client.programId)[0];
|
|
22
|
+
}
|
|
23
|
+
getUserGlobalDepositPda(user, mint) {
|
|
24
|
+
return (0, pda_1.getUserGlobalDepositPda)(user, mint, this.client.programId)[0];
|
|
25
|
+
}
|
|
26
|
+
// ── Account fetchers (async, require Connection) ──────────────────────
|
|
27
|
+
async getLatestBlockhash() {
|
|
28
|
+
const connection = (0, context_1.requireConnection)(this.client);
|
|
29
|
+
return connection.getLatestBlockhash();
|
|
30
|
+
}
|
|
31
|
+
async getExchange() {
|
|
32
|
+
const connection = (0, context_1.requireConnection)(this.client);
|
|
33
|
+
const pda = this.getExchangePda();
|
|
34
|
+
const accountInfo = await connection.getAccountInfo(pda);
|
|
35
|
+
if (!accountInfo) {
|
|
36
|
+
throw new Error("Exchange account not found");
|
|
37
|
+
}
|
|
38
|
+
return (0, accounts_1.deserializeExchange)(accountInfo.data);
|
|
39
|
+
}
|
|
40
|
+
async getGlobalDepositToken(mint) {
|
|
41
|
+
const connection = (0, context_1.requireConnection)(this.client);
|
|
42
|
+
const pda = this.getGlobalDepositTokenPda(mint);
|
|
43
|
+
const accountInfo = await connection.getAccountInfo(pda);
|
|
44
|
+
if (!accountInfo) {
|
|
45
|
+
throw new Error(`GlobalDepositToken not found for mint ${mint.toBase58()}`);
|
|
46
|
+
}
|
|
47
|
+
return (0, accounts_1.deserializeGlobalDepositToken)(accountInfo.data);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.Rpc = Rpc;
|
|
51
|
+
//# sourceMappingURL=rpc.js.map
|
package/dist/rpc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":";;;AAEA,uCAA8C;AAC9C,uCAIuB;AACvB,iDAG4B;AAG5B,MAAa,GAAG;IACe;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,iEAAiE;IACjE,KAAK;QACH,OAAO,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,yEAAyE;IAEzE,cAAc;QACZ,OAAO,IAAA,oBAAc,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,wBAAwB,CAAC,IAAe;QACtC,OAAO,IAAA,8BAAwB,EAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,uBAAuB,CAAC,IAAe,EAAE,IAAe;QACtD,OAAO,IAAA,6BAAuB,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,yEAAyE;IAEzE,KAAK,CAAC,kBAAkB;QAItB,MAAM,UAAU,GAAG,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC,kBAAkB,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,UAAU,GAAG,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAA,8BAAmB,EAAC,WAAW,CAAC,IAAc,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,IAAe;QACzC,MAAM,UAAU,GAAG,IAAA,2BAAiB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yCAAyC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAC3D,CAAC;QACJ,CAAC;QACD,OAAO,IAAA,wCAA6B,EAAC,WAAW,CAAC,IAAc,CAAC,CAAC;IACnE,CAAC;CACF;AArDD,kBAqDC","sourcesContent":["import type { Connection, PublicKey } from \"@solana/web3.js\";\nimport type { ClientContext } from \"./context\";\nimport { requireConnection } from \"./context\";\nimport {\n getExchangePda,\n getGlobalDepositTokenPda,\n getUserGlobalDepositPda,\n} from \"./program/pda\";\nimport {\n deserializeExchange,\n deserializeGlobalDepositToken,\n} from \"./program/accounts\";\nimport type { Exchange, GlobalDepositToken } from \"./program/types\";\n\nexport class Rpc {\n constructor(private readonly client: ClientContext) {}\n\n /** Get the underlying Connection, or throw if not configured. */\n inner(): Connection {\n return requireConnection(this.client);\n }\n\n // ── PDA helpers (sync, no Connection needed) ──────────────────────────\n\n getExchangePda(): PublicKey {\n return getExchangePda(this.client.programId)[0];\n }\n\n getGlobalDepositTokenPda(mint: PublicKey): PublicKey {\n return getGlobalDepositTokenPda(mint, this.client.programId)[0];\n }\n\n getUserGlobalDepositPda(user: PublicKey, mint: PublicKey): PublicKey {\n return getUserGlobalDepositPda(user, mint, this.client.programId)[0];\n }\n\n // ── Account fetchers (async, require Connection) ──────────────────────\n\n async getLatestBlockhash(): Promise<{\n blockhash: string;\n lastValidBlockHeight: number;\n }> {\n const connection = requireConnection(this.client);\n return connection.getLatestBlockhash();\n }\n\n async getExchange(): Promise<Exchange> {\n const connection = requireConnection(this.client);\n const pda = this.getExchangePda();\n const accountInfo = await connection.getAccountInfo(pda);\n if (!accountInfo) {\n throw new Error(\"Exchange account not found\");\n }\n return deserializeExchange(accountInfo.data as Buffer);\n }\n\n async getGlobalDepositToken(mint: PublicKey): Promise<GlobalDepositToken> {\n const connection = requireConnection(this.client);\n const pda = this.getGlobalDepositTokenPda(mint);\n const accountInfo = await connection.getAccountInfo(pda);\n if (!accountInfo) {\n throw new Error(\n `GlobalDepositToken not found for mint ${mint.toBase58()}`\n );\n }\n return deserializeGlobalDepositToken(accountInfo.data as Buffer);\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Decimal from "decimal.js";
|
|
2
2
|
export declare function display(value: Decimal): string;
|
|
3
|
-
export declare function abbrNumber(value: Decimal, digits?: number): string;
|
|
3
|
+
export declare function abbrNumber(value: Decimal, digits?: number, showSign?: boolean): string;
|
|
4
4
|
export declare function toBaseUnits(value: Decimal, decimals: number): bigint | null;
|
|
5
5
|
//# sourceMappingURL=decimal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../../src/shared/fmt/decimal.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAGjC,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAsB9C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../../src/shared/fmt/decimal.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAGjC,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAsB9C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,EAAE,QAAQ,UAAO,GAAG,MAAM,CAkB9E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3E"}
|
|
@@ -28,8 +28,8 @@ function display(value) {
|
|
|
28
28
|
}
|
|
29
29
|
return (0, num_1.displayFormattedString)(value.toSignificantDigits(8).toString());
|
|
30
30
|
}
|
|
31
|
-
function abbrNumber(value, digits = 2) {
|
|
32
|
-
const sign = value.isNegative() ? "-" : "";
|
|
31
|
+
function abbrNumber(value, digits = 2, showSign = true) {
|
|
32
|
+
const sign = showSign && value.isNegative() ? "-" : "";
|
|
33
33
|
const abs = value.abs();
|
|
34
34
|
const units = [
|
|
35
35
|
[new decimal_js_1.default("1000000000000"), "T"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimal.js","sourceRoot":"","sources":["../../../src/shared/fmt/decimal.ts"],"names":[],"mappings":";;;;;AAGA,0BAsBC;AAED,gCAkBC;AAED,kCAMC;AArDD,4DAAiC;AACjC,+BAA+C;AAE/C,SAAgB,OAAO,CAAC,KAAc;IACpC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IACxB,IAAI,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,IAAA,4BAAsB,EAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,IAAA,4BAAsB,EAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5D,OAAO,GAAG,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,IAAA,4BAAsB,EAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAgB,UAAU,CAAC,KAAc,EAAE,MAAM,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"decimal.js","sourceRoot":"","sources":["../../../src/shared/fmt/decimal.ts"],"names":[],"mappings":"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","sourcesContent":["import Decimal from \"decimal.js\";\nimport { displayFormattedString } from \"./num\";\n\nexport function display(value: Decimal): string {\n if (value.isZero()) {\n return \"0\";\n }\n\n const abs = value.abs();\n if (abs.greaterThanOrEqualTo(100)) {\n return displayFormattedString(value.toDecimalPlaces(0).toString());\n }\n if (abs.greaterThanOrEqualTo(1)) {\n return displayFormattedString(value.toDecimalPlaces(2).toString());\n }\n\n const asString = abs.toFixed(20).replace(/0+$/, \"\");\n const match = /^0\\.(0+)(\\d+)/.exec(asString);\n if (match && match[1].length > 5) {\n const sign = value.isNegative() ? \"-\" : \"\";\n const significant = match[2].slice(0, 4).replace(/0+$/, \"\");\n return `${sign}0.0(${match[1].length})${significant || \"0\"}`;\n }\n\n return displayFormattedString(value.toSignificantDigits(8).toString());\n}\n\nexport function abbrNumber(value: Decimal, digits = 2, showSign = true): string {\n const sign = showSign && value.isNegative() ? \"-\" : \"\";\n const abs = value.abs();\n\n const units: Array<[Decimal, string]> = [\n [new Decimal(\"1000000000000\"), \"T\"],\n [new Decimal(\"1000000000\"), \"B\"],\n [new Decimal(\"1000000\"), \"M\"],\n [new Decimal(\"1000\"), \"K\"],\n ];\n\n for (const [threshold, suffix] of units) {\n if (abs.greaterThanOrEqualTo(threshold)) {\n return `${sign}${abs.div(threshold).toDecimalPlaces(digits).toString()}${suffix}`;\n }\n }\n\n return `${sign}${abs.toDecimalPlaces(digits).toString()}`;\n}\n\nexport function toBaseUnits(value: Decimal, decimals: number): bigint | null {\n const scaled = value.mul(new Decimal(10).pow(decimals));\n if (!scaled.isInteger() || scaled.isNegative()) {\n return null;\n }\n return BigInt(scaled.toFixed(0));\n}\n"]}
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { asOrderBookId, asPubkeyStr, DepositSource, deriveOrderbookId, resolutionSeconds, sideLabel, OrderUpdateType, Resolution, Side, TimeInForce, TriggerResultStatus, TriggerStatus, TriggerType, TriggerUpdateType, type Branded, type OrderBookId, type PubkeyStr, type SubmitOrderRequest, } from "./types";
|
|
1
|
+
export { asOrderBookId, asPubkeyStr, DepositSource, deriveOrderbookId, parseSide, resolutionSeconds, sideLabel, OrderUpdateType, Resolution, Side, TimeInForce, TriggerResultStatus, TriggerStatus, TriggerType, TriggerUpdateType, type Branded, type OrderBookId, type PubkeyStr, type SubmitOrderRequest, } from "./types";
|
|
2
2
|
export { formatDecimal, isZero, parseDecimal } from "./price";
|
|
3
3
|
export { alignPriceToTick, scalePriceSize, scalePriceSizeLegacy, ScalingError, type LegacyScaledAmounts, type OrderbookDecimals, type ScaledAmounts, } from "./scaling";
|
|
4
4
|
export { scalePriceSizeLegacy as scalePriceSizeV1 } from "./scaling";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,UAAU,EACV,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,kBAAkB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,oBAAoB,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,UAAU,EACV,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,kBAAkB,GACxB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,oBAAoB,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/shared/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.scalePriceSizeV1 = exports.ScalingError = exports.scalePriceSizeLegacy = exports.scalePriceSize = exports.alignPriceToTick = exports.parseDecimal = exports.isZero = exports.formatDecimal = exports.TriggerUpdateType = exports.TriggerType = exports.TriggerStatus = exports.TriggerResultStatus = exports.TimeInForce = exports.Side = exports.Resolution = exports.OrderUpdateType = exports.sideLabel = exports.resolutionSeconds = exports.deriveOrderbookId = exports.DepositSource = exports.asPubkeyStr = exports.asOrderBookId = void 0;
|
|
3
|
+
exports.scalePriceSizeV1 = exports.ScalingError = exports.scalePriceSizeLegacy = exports.scalePriceSize = exports.alignPriceToTick = exports.parseDecimal = exports.isZero = exports.formatDecimal = exports.TriggerUpdateType = exports.TriggerType = exports.TriggerStatus = exports.TriggerResultStatus = exports.TimeInForce = exports.Side = exports.Resolution = exports.OrderUpdateType = exports.sideLabel = exports.resolutionSeconds = exports.parseSide = exports.deriveOrderbookId = exports.DepositSource = exports.asPubkeyStr = exports.asOrderBookId = void 0;
|
|
4
4
|
var types_1 = require("./types");
|
|
5
5
|
Object.defineProperty(exports, "asOrderBookId", { enumerable: true, get: function () { return types_1.asOrderBookId; } });
|
|
6
6
|
Object.defineProperty(exports, "asPubkeyStr", { enumerable: true, get: function () { return types_1.asPubkeyStr; } });
|
|
7
7
|
Object.defineProperty(exports, "DepositSource", { enumerable: true, get: function () { return types_1.DepositSource; } });
|
|
8
8
|
Object.defineProperty(exports, "deriveOrderbookId", { enumerable: true, get: function () { return types_1.deriveOrderbookId; } });
|
|
9
|
+
Object.defineProperty(exports, "parseSide", { enumerable: true, get: function () { return types_1.parseSide; } });
|
|
9
10
|
Object.defineProperty(exports, "resolutionSeconds", { enumerable: true, get: function () { return types_1.resolutionSeconds; } });
|
|
10
11
|
Object.defineProperty(exports, "sideLabel", { enumerable: true, get: function () { return types_1.sideLabel; } });
|
|
11
12
|
Object.defineProperty(exports, "OrderUpdateType", { enumerable: true, get: function () { return types_1.OrderUpdateType; } });
|
package/dist/shared/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":";;;AAAA,iCAoBiB;AAnBf,sGAAA,aAAa,OAAA;AACb,oGAAA,WAAW,OAAA;AACX,sGAAA,aAAa,OAAA;AACb,0GAAA,iBAAiB,OAAA;AACjB,kGAAA,SAAS,OAAA;AACT,0GAAA,iBAAiB,OAAA;AACjB,kGAAA,SAAS,OAAA;AACT,wGAAA,eAAe,OAAA;AACf,mGAAA,UAAU,OAAA;AACV,6FAAA,IAAI,OAAA;AACJ,oGAAA,WAAW,OAAA;AACX,4GAAA,mBAAmB,OAAA;AACnB,sGAAA,aAAa,OAAA;AACb,oGAAA,WAAW,OAAA;AACX,0GAAA,iBAAiB,OAAA;AAOnB,iCAA8D;AAArD,sGAAA,aAAa,OAAA;AAAE,+FAAA,MAAM,OAAA;AAAE,qGAAA,YAAY,OAAA;AAE5C,qCAQmB;AAPjB,2GAAA,gBAAgB,OAAA;AAChB,yGAAA,cAAc,OAAA;AACd,+GAAA,oBAAoB,OAAA;AACpB,uGAAA,YAAY,OAAA;AAMd,oCAAoC;AACpC,qCAAqE;AAA5D,2GAAA,oBAAoB,OAAoB","sourcesContent":["export {\n asOrderBookId,\n asPubkeyStr,\n DepositSource,\n deriveOrderbookId,\n parseSide,\n resolutionSeconds,\n sideLabel,\n OrderUpdateType,\n Resolution,\n Side,\n TimeInForce,\n TriggerResultStatus,\n TriggerStatus,\n TriggerType,\n TriggerUpdateType,\n type Branded,\n type OrderBookId,\n type PubkeyStr,\n type SubmitOrderRequest,\n} from \"./types\";\n\nexport { formatDecimal, isZero, parseDecimal } from \"./price\";\n\nexport {\n alignPriceToTick,\n scalePriceSize,\n scalePriceSizeLegacy,\n ScalingError,\n type LegacyScaledAmounts,\n type OrderbookDecimals,\n type ScaledAmounts,\n} from \"./scaling\";\n\n// Backward-compatible name from v1.\nexport { scalePriceSizeLegacy as scalePriceSizeV1 } from \"./scaling\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaling.d.ts","sourceRoot":"","sources":["../../src/shared/scaling.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;IAK3B,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAIpD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAInD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAI9C,MAAM,CAAC,UAAU,IAAI,YAAY;IAIjC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAIpD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;CAGnE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAWrF;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GAAG,OAAO,EAC5B,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,iBAAiB,GAC1B,aAAa,
|
|
1
|
+
{"version":3,"file":"scaling.d.ts","sourceRoot":"","sources":["../../src/shared/scaling.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;IAK3B,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAIpD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAInD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAI9C,MAAM,CAAC,UAAU,IAAI,YAAY;IAIjC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAIpD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;CAGnE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAWrF;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,GAAG,OAAO,EAC5B,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,iBAAiB,GAC1B,aAAa,CA+Cf;AA8BD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,iBAAiB,GAC1B,mBAAmB,CAMrB"}
|
package/dist/shared/scaling.js
CHANGED
|
@@ -57,10 +57,14 @@ function scalePriceSize(priceInput, sizeInput, side, decimals) {
|
|
|
57
57
|
}
|
|
58
58
|
const baseMultiplier = new decimal_js_1.default(10).pow(decimals.baseDecimals);
|
|
59
59
|
const quoteMultiplier = new decimal_js_1.default(10).pow(decimals.quoteDecimals);
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
// Truncate size to base_decimals — digits beyond the token's precision
|
|
61
|
+
// are unrepresentable on-chain and are always f64 noise
|
|
62
|
+
const truncatedSize = size.toDecimalPlaces(decimals.baseDecimals, decimal_js_1.default.ROUND_DOWN);
|
|
63
|
+
const baseLamports = truncatedSize.mul(baseMultiplier);
|
|
64
|
+
// Truncate quote_lamports to discard sub-lamport dust (price * size can
|
|
65
|
+
// produce fractions beyond the token's representable precision).
|
|
66
|
+
const quoteLamports = price.mul(truncatedSize).mul(quoteMultiplier).trunc();
|
|
62
67
|
assertWhole(baseLamports, "base_lamports");
|
|
63
|
-
assertWhole(quoteLamports, "quote_lamports");
|
|
64
68
|
const base = toU64(baseLamports, "base_lamports");
|
|
65
69
|
const quote = toU64(quoteLamports, "quote_lamports");
|
|
66
70
|
if (base === 0n || quote === 0n) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaling.js","sourceRoot":"","sources":["../../src/shared/scaling.ts"],"names":[],"mappings":";;;;;;AAoDA,4CAWC;AAED,
|
|
1
|
+
{"version":3,"file":"scaling.js","sourceRoot":"","sources":["../../src/shared/scaling.ts"],"names":[],"mappings":"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","sourcesContent":["import Decimal from \"decimal.js\";\nimport { OrderSide } from \"../program/types\";\n\nexport interface OrderbookDecimals {\n orderbookId: string;\n baseDecimals: number;\n quoteDecimals: number;\n priceDecimals: number;\n tickSize?: bigint;\n}\n\nexport interface ScaledAmounts {\n amountIn: bigint;\n amountOut: bigint;\n // Backward-compatible aliases used by v1 builder code.\n makerAmount: bigint;\n takerAmount: bigint;\n}\n\nconst U64_MAX = (1n << 64n) - 1n;\n\nexport class ScalingError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ScalingError\";\n }\n\n static nonPositivePrice(value: string): ScalingError {\n return new ScalingError(`Price must be positive, got ${value}`);\n }\n\n static nonPositiveSize(value: string): ScalingError {\n return new ScalingError(`Size must be positive, got ${value}`);\n }\n\n static overflow(context: string): ScalingError {\n return new ScalingError(`Overflow: ${context}`);\n }\n\n static zeroAmount(): ScalingError {\n return new ScalingError(\"Computed amount is zero\");\n }\n\n static fractionalAmount(value: string): ScalingError {\n return new ScalingError(`Fractional lamports not allowed: ${value}`);\n }\n\n static invalidDecimal(input: string, reason: string): ScalingError {\n return new ScalingError(`Invalid decimal '${input}': ${reason}`);\n }\n}\n\nexport function alignPriceToTick(price: Decimal, decimals: OrderbookDecimals): Decimal {\n const tickSize = decimals.tickSize ?? 0n;\n if (tickSize <= 1n) {\n return price;\n }\n\n const quoteMultiplier = new Decimal(10).pow(decimals.quoteDecimals);\n const tick = new Decimal(tickSize.toString());\n const lamports = price.mul(quoteMultiplier).trunc();\n const aligned = lamports.div(tick).trunc().mul(tick);\n return aligned.div(quoteMultiplier);\n}\n\nexport function scalePriceSize(\n priceInput: string | Decimal,\n sizeInput: string | Decimal,\n side: OrderSide,\n decimals: OrderbookDecimals\n): ScaledAmounts {\n const price = normalizeDecimal(priceInput, \"price\");\n const size = normalizeDecimal(sizeInput, \"size\");\n\n if (price.lte(0)) {\n throw ScalingError.nonPositivePrice(price.toString());\n }\n if (size.lte(0)) {\n throw ScalingError.nonPositiveSize(size.toString());\n }\n\n const baseMultiplier = new Decimal(10).pow(decimals.baseDecimals);\n const quoteMultiplier = new Decimal(10).pow(decimals.quoteDecimals);\n\n // Truncate size to base_decimals — digits beyond the token's precision\n // are unrepresentable on-chain and are always f64 noise\n const truncatedSize = size.toDecimalPlaces(decimals.baseDecimals, Decimal.ROUND_DOWN);\n\n const baseLamports = truncatedSize.mul(baseMultiplier);\n // Truncate quote_lamports to discard sub-lamport dust (price * size can\n // produce fractions beyond the token's representable precision).\n const quoteLamports = price.mul(truncatedSize).mul(quoteMultiplier).trunc();\n\n assertWhole(baseLamports, \"base_lamports\");\n\n const base = toU64(baseLamports, \"base_lamports\");\n const quote = toU64(quoteLamports, \"quote_lamports\");\n\n if (base === 0n || quote === 0n) {\n throw ScalingError.zeroAmount();\n }\n\n if (side === OrderSide.BID) {\n return {\n amountIn: quote,\n amountOut: base,\n makerAmount: quote,\n takerAmount: base,\n };\n }\n\n return {\n amountIn: base,\n amountOut: quote,\n makerAmount: base,\n takerAmount: quote,\n };\n}\n\nfunction normalizeDecimal(value: string | Decimal, field: string): Decimal {\n if (value instanceof Decimal) {\n return value;\n }\n\n try {\n return new Decimal(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw ScalingError.invalidDecimal(value, reason || field);\n }\n}\n\nfunction assertWhole(value: Decimal, label: string): void {\n if (!value.isInteger()) {\n throw ScalingError.fractionalAmount(`${label} = ${value.toString()}`);\n }\n}\n\nfunction toU64(value: Decimal, label: string): bigint {\n const bigint = BigInt(value.toFixed(0));\n if (bigint < 0n || bigint > U64_MAX) {\n throw ScalingError.overflow(`${label} ${value.toString()} does not fit in u64`);\n }\n return bigint;\n}\n\n// Legacy aliases kept for existing integrations.\nexport interface LegacyScaledAmounts {\n makerAmount: bigint;\n takerAmount: bigint;\n}\n\nexport function scalePriceSizeLegacy(\n price: string,\n size: string,\n side: OrderSide,\n decimals: OrderbookDecimals\n): LegacyScaledAmounts {\n const scaled = scalePriceSize(price, size, side, decimals);\n return {\n makerAmount: scaled.amountIn,\n takerAmount: scaled.amountOut,\n };\n}\n"]}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAErD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAExD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEpD;AAED,oBAAY,IAAI;IACd,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAEpD;AAED,oBAAY,WAAW;IACrB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,oBAAY,WAAW;IACrB,UAAU,OAAO;IACjB,QAAQ,OAAO;CAChB;AAED,oBAAY,aAAa;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,oBAAY,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,YAAY,iBAAiB;CAC9B;AAED,oBAAY,iBAAiB;IAC3B,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,oBAAY,mBAAmB;IAC7B,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,QAAQ,aAAa;CACtB;AAED,oBAAY,aAAa;IACvB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,oBAAY,UAAU;IACpB,OAAO,OAAO;IACd,OAAO,OAAO;IACd,QAAQ,QAAQ;IAChB,KAAK,OAAO;IACZ,KAAK,OAAO;IACZ,IAAI,OAAO;CACZ;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAehE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAEpF;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAErD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAExD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEpD;AAED,oBAAY,IAAI;IACd,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAEpD;AAED,oBAAY,WAAW;IACrB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,GAAG,QAAQ;CACZ;AAED,oBAAY,WAAW;IACrB,UAAU,OAAO;IACjB,QAAQ,OAAO;CAChB;AAED,oBAAY,aAAa;IACvB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,oBAAY,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,YAAY,iBAAiB;CAC9B;AAED,oBAAY,iBAAiB;IAC3B,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,OAAO,YAAY;CACpB;AAED,oBAAY,mBAAmB;IAC7B,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,QAAQ,aAAa;CACtB;AAED,oBAAY,aAAa;IACvB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,oBAAY,UAAU;IACpB,OAAO,OAAO;IACd,OAAO,OAAO;IACd,QAAQ,QAAQ;IAChB,KAAK,OAAO;IACZ,KAAK,OAAO;IACZ,IAAI,OAAO;CACZ;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAehE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAEpF;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC"}
|
package/dist/shared/types.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Resolution = exports.DepositSource = exports.TriggerResultStatus = exports.TriggerUpdateType = exports.OrderUpdateType = exports.TriggerStatus = exports.TriggerType = exports.TimeInForce = exports.Side = void 0;
|
|
4
4
|
exports.asOrderBookId = asOrderBookId;
|
|
5
5
|
exports.asPubkeyStr = asPubkeyStr;
|
|
6
|
+
exports.parseSide = parseSide;
|
|
6
7
|
exports.sideLabel = sideLabel;
|
|
7
8
|
exports.resolutionSeconds = resolutionSeconds;
|
|
8
9
|
exports.deriveOrderbookId = deriveOrderbookId;
|
|
@@ -17,6 +18,13 @@ var Side;
|
|
|
17
18
|
Side["Bid"] = "bid";
|
|
18
19
|
Side["Ask"] = "ask";
|
|
19
20
|
})(Side || (exports.Side = Side = {}));
|
|
21
|
+
function parseSide(value) {
|
|
22
|
+
if (value === "bid" || value === "buy")
|
|
23
|
+
return Side.Bid;
|
|
24
|
+
if (value === "ask" || value === "sell")
|
|
25
|
+
return Side.Ask;
|
|
26
|
+
throw new Error(`Invalid side: ${value}`);
|
|
27
|
+
}
|
|
20
28
|
function sideLabel(side) {
|
|
21
29
|
return side === Side.Bid ? "Buy" : "Sell";
|
|
22
30
|
}
|
|
@@ -81,7 +89,7 @@ function resolutionSeconds(resolution) {
|
|
|
81
89
|
case Resolution.Hour1:
|
|
82
90
|
return 3600;
|
|
83
91
|
case Resolution.Hour4:
|
|
84
|
-
return
|
|
92
|
+
return 14400;
|
|
85
93
|
case Resolution.Day1:
|
|
86
94
|
return 86400;
|
|
87
95
|
}
|
package/dist/shared/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":";;;AAKA,sCAEC;AAED,kCAEC;AAOD,8BAEC;AAoDD,8CAeC;AAED,8CAEC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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","sourcesContent":["export type Branded<T, Brand extends string> = T & { readonly __brand: Brand };\n\nexport type OrderBookId = Branded<string, \"OrderBookId\">;\nexport type PubkeyStr = Branded<string, \"PubkeyStr\">;\n\nexport function asOrderBookId(value: string): OrderBookId {\n return value as OrderBookId;\n}\n\nexport function asPubkeyStr(value: string): PubkeyStr {\n return value as PubkeyStr;\n}\n\nexport enum Side {\n Bid = \"bid\",\n Ask = \"ask\",\n}\n\nexport function parseSide(value: string): Side {\n if (value === \"bid\" || value === \"buy\") return Side.Bid;\n if (value === \"ask\" || value === \"sell\") return Side.Ask;\n throw new Error(`Invalid side: ${value}`);\n}\n\nexport function sideLabel(side: Side): \"Buy\" | \"Sell\" {\n return side === Side.Bid ? \"Buy\" : \"Sell\";\n}\n\nexport enum TimeInForce {\n Gtc = \"GTC\",\n Ioc = \"IOC\",\n Fok = \"FOK\",\n Alo = \"ALO\",\n}\n\nexport enum TriggerType {\n TakeProfit = \"TP\",\n StopLoss = \"SL\",\n}\n\nexport enum TriggerStatus {\n Triggered = \"triggered\",\n Failed = \"failed\",\n Expired = \"expired\",\n}\n\nexport enum OrderUpdateType {\n Placement = \"PLACEMENT\",\n Update = \"UPDATE\",\n Cancellation = \"CANCELLATION\",\n}\n\nexport enum TriggerUpdateType {\n Triggered = \"TRIGGERED\",\n Failed = \"FAILED\",\n Expired = \"EXPIRED\",\n}\n\nexport enum TriggerResultStatus {\n Filled = \"filled\",\n Accepted = \"accepted\",\n Rejected = \"rejected\",\n}\n\nexport enum DepositSource {\n Global = \"global\",\n Market = \"market\",\n}\n\nexport enum Resolution {\n Minute1 = \"1m\",\n Minute5 = \"5m\",\n Minute15 = \"15m\",\n Hour1 = \"1h\",\n Hour4 = \"4h\",\n Day1 = \"1d\",\n}\n\nexport function resolutionSeconds(resolution: Resolution): number {\n switch (resolution) {\n case Resolution.Minute1:\n return 60;\n case Resolution.Minute5:\n return 300;\n case Resolution.Minute15:\n return 900;\n case Resolution.Hour1:\n return 3600;\n case Resolution.Hour4:\n return 14400;\n case Resolution.Day1:\n return 86400;\n }\n}\n\nexport function deriveOrderbookId(baseToken: string, quoteToken: string): OrderBookId {\n return `${baseToken.slice(0, 8)}_${quoteToken.slice(0, 8)}` as OrderBookId;\n}\n\nexport interface SubmitOrderRequest {\n maker: string;\n nonce: number;\n market_pubkey: string;\n base_token: string;\n quote_token: string;\n side: number;\n /** u64 amount — validated to fit in Number.MAX_SAFE_INTEGER at construction time */\n amount_in: number;\n /** u64 amount — validated to fit in Number.MAX_SAFE_INTEGER at construction time */\n amount_out: number;\n expiration: number;\n signature: string;\n orderbook_id: string;\n tif?: TimeInForce;\n trigger_price?: number;\n trigger_type?: TriggerType;\n deposit_source?: DepositSource;\n}\n"]}
|
|
@@ -30,6 +30,8 @@ export declare class WsClient implements IWsClient {
|
|
|
30
30
|
unsubscribe(params: UnsubscribeParams): void;
|
|
31
31
|
isConnected(): boolean;
|
|
32
32
|
readyState(): ReadyState;
|
|
33
|
+
restartConnection(): Promise<void>;
|
|
34
|
+
clearAuthedSubscriptions(): void;
|
|
33
35
|
on(callback: (event: WsEvent) => void): () => void;
|
|
34
36
|
private emit;
|
|
35
37
|
private connectInternal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.browser.d.ts","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAGL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IAEpD;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAInF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;
|
|
1
|
+
{"version":3,"file":"client.browser.d.ts","sourceRoot":"","sources":["../../src/ws/client.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAGL,UAAU,EAEV,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAC,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAC,CAAgC;IAClD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoB;IAEpD;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAInF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIxC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAI5C,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,UAAU;IAiBlB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBxC,wBAAwB,IAAI,IAAI;IAMhC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IASlD,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,eAAe;IA2DvB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -79,6 +79,28 @@ class WsClient {
|
|
|
79
79
|
return index_1.ReadyState.Closed;
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
+
async restartConnection() {
|
|
83
|
+
if (this.socket && this.readyState() === index_1.ReadyState.Connecting) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (this.socket) {
|
|
87
|
+
this.stopHeartbeat();
|
|
88
|
+
const socket = this.socket;
|
|
89
|
+
this.socket = undefined;
|
|
90
|
+
this.userInitiatedClose = true;
|
|
91
|
+
await new Promise((resolve) => {
|
|
92
|
+
socket.addEventListener("close", () => resolve(), { once: true });
|
|
93
|
+
socket.close(1000, "Restart connection");
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
this.reconnectAttempts = 0;
|
|
97
|
+
await this.connectInternal();
|
|
98
|
+
}
|
|
99
|
+
clearAuthedSubscriptions() {
|
|
100
|
+
const next = this.activeSubscriptions.filter((params) => params.type !== "user");
|
|
101
|
+
this.activeSubscriptions.length = 0;
|
|
102
|
+
this.activeSubscriptions.push(...next);
|
|
103
|
+
}
|
|
82
104
|
on(callback) {
|
|
83
105
|
this.callbacks.push(callback);
|
|
84
106
|
return () => {
|
|
@@ -100,9 +122,11 @@ class WsClient {
|
|
|
100
122
|
// Browser WebSocket automatically includes cookies for same-origin connections.
|
|
101
123
|
const socket = new WebSocket(this.config.url);
|
|
102
124
|
this.socket = socket;
|
|
103
|
-
|
|
125
|
+
let timeoutId;
|
|
126
|
+
const connectionPromise = new Promise((resolve, reject) => {
|
|
104
127
|
const onOpen = () => {
|
|
105
128
|
cleanup();
|
|
129
|
+
clearTimeout(timeoutId);
|
|
106
130
|
this.reconnectAttempts = 0;
|
|
107
131
|
this.startHeartbeat();
|
|
108
132
|
this.flushPendingMessages();
|
|
@@ -112,6 +136,7 @@ class WsClient {
|
|
|
112
136
|
};
|
|
113
137
|
const onError = (event) => {
|
|
114
138
|
cleanup();
|
|
139
|
+
clearTimeout(timeoutId);
|
|
115
140
|
reject(new Error(`WebSocket connection error: ${event.message ?? "unknown"}`));
|
|
116
141
|
};
|
|
117
142
|
const cleanup = () => {
|
|
@@ -134,6 +159,13 @@ class WsClient {
|
|
|
134
159
|
}
|
|
135
160
|
});
|
|
136
161
|
});
|
|
162
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
163
|
+
timeoutId = setTimeout(() => {
|
|
164
|
+
socket.close();
|
|
165
|
+
reject(new Error("WebSocket connection timeout (30s)"));
|
|
166
|
+
}, 30_000);
|
|
167
|
+
});
|
|
168
|
+
return Promise.race([connectionPromise, timeoutPromise]);
|
|
137
169
|
}
|
|
138
170
|
handleIncoming(raw) {
|
|
139
171
|
let message;
|
|
@@ -148,6 +180,7 @@ class WsClient {
|
|
|
148
180
|
return;
|
|
149
181
|
}
|
|
150
182
|
if (message.type === "pong") {
|
|
183
|
+
this.reconnectAttempts = 0;
|
|
151
184
|
this.resetPongTimeout();
|
|
152
185
|
}
|
|
153
186
|
this.emit({ type: "Message", message });
|
|
@@ -156,6 +189,9 @@ class WsClient {
|
|
|
156
189
|
if (!this.config.reconnect) {
|
|
157
190
|
return;
|
|
158
191
|
}
|
|
192
|
+
if (code === 1000) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
159
195
|
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
160
196
|
this.emit({ type: "MaxReconnectReached" });
|
|
161
197
|
return;
|
|
@@ -174,11 +210,12 @@ class WsClient {
|
|
|
174
210
|
}, backoffMs);
|
|
175
211
|
}
|
|
176
212
|
backoffDelayMs(attempt, isRateLimited) {
|
|
177
|
-
const exponent = Math.max(0, attempt - 1);
|
|
178
|
-
const
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
|
|
213
|
+
const exponent = Math.min(Math.max(0, attempt - 1), 10);
|
|
214
|
+
const base = this.config.baseReconnectDelayMs * 2 ** exponent;
|
|
215
|
+
const jitterMax = isRateLimited ? 1000 : 500;
|
|
216
|
+
const jitter = Math.floor(Math.random() * (jitterMax + 1));
|
|
217
|
+
const cap = isRateLimited ? 300_000 : 60_000;
|
|
218
|
+
return Math.min(base + jitter, cap);
|
|
182
219
|
}
|
|
183
220
|
startHeartbeat() {
|
|
184
221
|
this.stopHeartbeat();
|