@limitless-exchange/sdk 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -6
- package/dist/index.d.mts +252 -155
- package/dist/index.d.ts +252 -155
- package/dist/index.js +273 -209
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +273 -208
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -41,7 +41,6 @@ __export(index_exports, {
|
|
|
41
41
|
DEFAULT_WS_URL: () => DEFAULT_WS_URL,
|
|
42
42
|
HttpClient: () => HttpClient,
|
|
43
43
|
MarketFetcher: () => MarketFetcher,
|
|
44
|
-
MarketType: () => MarketType,
|
|
45
44
|
MessageSigner: () => MessageSigner,
|
|
46
45
|
NoOpLogger: () => NoOpLogger,
|
|
47
46
|
OrderBuilder: () => OrderBuilder,
|
|
@@ -115,16 +114,11 @@ var Side = /* @__PURE__ */ ((Side2) => {
|
|
|
115
114
|
Side2[Side2["SELL"] = 1] = "SELL";
|
|
116
115
|
return Side2;
|
|
117
116
|
})(Side || {});
|
|
118
|
-
var OrderType = /* @__PURE__ */ ((
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return
|
|
117
|
+
var OrderType = /* @__PURE__ */ ((OrderType2) => {
|
|
118
|
+
OrderType2["FOK"] = "FOK";
|
|
119
|
+
OrderType2["GTC"] = "GTC";
|
|
120
|
+
return OrderType2;
|
|
122
121
|
})(OrderType || {});
|
|
123
|
-
var MarketType = /* @__PURE__ */ ((MarketType3) => {
|
|
124
|
-
MarketType3["CLOB"] = "CLOB";
|
|
125
|
-
MarketType3["NEGRISK"] = "NEGRISK";
|
|
126
|
-
return MarketType3;
|
|
127
|
-
})(MarketType || {});
|
|
128
122
|
var SignatureType = /* @__PURE__ */ ((SignatureType2) => {
|
|
129
123
|
SignatureType2[SignatureType2["EOA"] = 0] = "EOA";
|
|
130
124
|
SignatureType2[SignatureType2["POLY_PROXY"] = 1] = "POLY_PROXY";
|
|
@@ -517,24 +511,31 @@ var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
|
517
511
|
var CONTRACT_ADDRESSES = {
|
|
518
512
|
// Base mainnet (chainId: 8453)
|
|
519
513
|
8453: {
|
|
520
|
-
|
|
521
|
-
|
|
514
|
+
USDC: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
515
|
+
// Native USDC on Base
|
|
516
|
+
CTF: "0xC9c98965297Bc527861c898329Ee280632B76e18"
|
|
517
|
+
// Conditional Token Framework
|
|
522
518
|
},
|
|
523
519
|
// Base Sepolia testnet (chainId: 84532)
|
|
524
520
|
84532: {
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
NEGRISK: "0x..."
|
|
521
|
+
USDC: "0x...",
|
|
522
|
+
CTF: "0x..."
|
|
528
523
|
}
|
|
529
524
|
};
|
|
530
|
-
function getContractAddress(
|
|
525
|
+
function getContractAddress(contractType, chainId = DEFAULT_CHAIN_ID) {
|
|
531
526
|
const addresses = CONTRACT_ADDRESSES[chainId];
|
|
532
527
|
if (!addresses) {
|
|
533
528
|
throw new Error(
|
|
534
529
|
`No contract addresses configured for chainId ${chainId}. Supported chains: ${Object.keys(CONTRACT_ADDRESSES).join(", ")}`
|
|
535
530
|
);
|
|
536
531
|
}
|
|
537
|
-
|
|
532
|
+
const address = addresses[contractType];
|
|
533
|
+
if (!address || address === "0x...") {
|
|
534
|
+
throw new Error(
|
|
535
|
+
`Contract address for ${contractType} not available on chainId ${chainId}. Please configure the address in constants.ts or use environment variables.`
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
return address;
|
|
538
539
|
}
|
|
539
540
|
|
|
540
541
|
// src/api/http.ts
|
|
@@ -960,8 +961,7 @@ var OrderBuilder = class {
|
|
|
960
961
|
* const fokOrder = builder.buildOrder({
|
|
961
962
|
* tokenId: '123456',
|
|
962
963
|
* makerAmount: 50, // 50 USDC to spend
|
|
963
|
-
* side: Side.BUY
|
|
964
|
-
* marketType: MarketType.CLOB
|
|
964
|
+
* side: Side.BUY
|
|
965
965
|
* });
|
|
966
966
|
*
|
|
967
967
|
* // GTC order (price + size)
|
|
@@ -969,8 +969,7 @@ var OrderBuilder = class {
|
|
|
969
969
|
* tokenId: '123456',
|
|
970
970
|
* price: 0.38,
|
|
971
971
|
* size: 22.123, // Will be rounded to tick-aligned: 22.123 shares
|
|
972
|
-
* side: Side.BUY
|
|
973
|
-
* marketType: MarketType.CLOB
|
|
972
|
+
* side: Side.BUY
|
|
974
973
|
* });
|
|
975
974
|
* ```
|
|
976
975
|
*/
|
|
@@ -1245,8 +1244,7 @@ var OrderSigner = class {
|
|
|
1245
1244
|
* ```typescript
|
|
1246
1245
|
* const signature = await signer.signOrder(unsignedOrder, {
|
|
1247
1246
|
* chainId: 8453,
|
|
1248
|
-
* contractAddress: '0x...'
|
|
1249
|
-
* marketType: MarketType.CLOB
|
|
1247
|
+
* contractAddress: '0x...'
|
|
1250
1248
|
* });
|
|
1251
1249
|
* ```
|
|
1252
1250
|
*/
|
|
@@ -1254,7 +1252,7 @@ var OrderSigner = class {
|
|
|
1254
1252
|
this.logger.debug("Signing order with EIP-712", {
|
|
1255
1253
|
tokenId: order.tokenId,
|
|
1256
1254
|
side: order.side,
|
|
1257
|
-
|
|
1255
|
+
verifyingContract: config.contractAddress
|
|
1258
1256
|
});
|
|
1259
1257
|
const walletAddress = await this.wallet.getAddress();
|
|
1260
1258
|
if (walletAddress.toLowerCase() !== order.signer.toLowerCase()) {
|
|
@@ -1479,14 +1477,221 @@ function validateSignedOrder(order) {
|
|
|
1479
1477
|
}
|
|
1480
1478
|
}
|
|
1481
1479
|
|
|
1480
|
+
// src/markets/fetcher.ts
|
|
1481
|
+
var MarketFetcher = class {
|
|
1482
|
+
/**
|
|
1483
|
+
* Creates a new market fetcher instance.
|
|
1484
|
+
*
|
|
1485
|
+
* @param httpClient - HTTP client for API requests
|
|
1486
|
+
* @param logger - Optional logger for debugging (default: no logging)
|
|
1487
|
+
*
|
|
1488
|
+
* @example
|
|
1489
|
+
* ```typescript
|
|
1490
|
+
* const fetcher = new MarketFetcher(httpClient);
|
|
1491
|
+
* ```
|
|
1492
|
+
*/
|
|
1493
|
+
constructor(httpClient, logger) {
|
|
1494
|
+
this.httpClient = httpClient;
|
|
1495
|
+
this.logger = logger || new NoOpLogger();
|
|
1496
|
+
this.venueCache = /* @__PURE__ */ new Map();
|
|
1497
|
+
}
|
|
1498
|
+
/**
|
|
1499
|
+
* Gets active markets with query parameters and pagination support.
|
|
1500
|
+
*
|
|
1501
|
+
* @param params - Query parameters for filtering and pagination
|
|
1502
|
+
* @returns Promise resolving to active markets response
|
|
1503
|
+
* @throws Error if API request fails
|
|
1504
|
+
*
|
|
1505
|
+
* @example
|
|
1506
|
+
* ```typescript
|
|
1507
|
+
* // Get 8 markets sorted by LP rewards
|
|
1508
|
+
* const response = await fetcher.getActiveMarkets({
|
|
1509
|
+
* limit: 8,
|
|
1510
|
+
* sortBy: 'lp_rewards'
|
|
1511
|
+
* });
|
|
1512
|
+
* console.log(`Found ${response.data.length} of ${response.totalMarketsCount} markets`);
|
|
1513
|
+
*
|
|
1514
|
+
* // Get page 2
|
|
1515
|
+
* const page2 = await fetcher.getActiveMarkets({
|
|
1516
|
+
* limit: 8,
|
|
1517
|
+
* page: 2,
|
|
1518
|
+
* sortBy: 'ending_soon'
|
|
1519
|
+
* });
|
|
1520
|
+
* ```
|
|
1521
|
+
*/
|
|
1522
|
+
async getActiveMarkets(params) {
|
|
1523
|
+
const queryParams = new URLSearchParams();
|
|
1524
|
+
if (params?.limit !== void 0) {
|
|
1525
|
+
queryParams.append("limit", params.limit.toString());
|
|
1526
|
+
}
|
|
1527
|
+
if (params?.page !== void 0) {
|
|
1528
|
+
queryParams.append("page", params.page.toString());
|
|
1529
|
+
}
|
|
1530
|
+
if (params?.sortBy) {
|
|
1531
|
+
queryParams.append("sortBy", params.sortBy);
|
|
1532
|
+
}
|
|
1533
|
+
const queryString = queryParams.toString();
|
|
1534
|
+
const endpoint = `/markets/active${queryString ? `?${queryString}` : ""}`;
|
|
1535
|
+
this.logger.debug("Fetching active markets", { params });
|
|
1536
|
+
try {
|
|
1537
|
+
const response = await this.httpClient.get(endpoint);
|
|
1538
|
+
this.logger.info("Active markets fetched successfully", {
|
|
1539
|
+
count: response.data.length,
|
|
1540
|
+
total: response.totalMarketsCount,
|
|
1541
|
+
sortBy: params?.sortBy,
|
|
1542
|
+
page: params?.page
|
|
1543
|
+
});
|
|
1544
|
+
return response;
|
|
1545
|
+
} catch (error) {
|
|
1546
|
+
this.logger.error("Failed to fetch active markets", error, { params });
|
|
1547
|
+
throw error;
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
/**
|
|
1551
|
+
* Gets a single market by slug.
|
|
1552
|
+
*
|
|
1553
|
+
* @remarks
|
|
1554
|
+
* Automatically caches venue information for efficient order signing.
|
|
1555
|
+
* Always call this method before creating orders to ensure venue data
|
|
1556
|
+
* is available and avoid additional API requests.
|
|
1557
|
+
*
|
|
1558
|
+
* @param slug - Market slug identifier
|
|
1559
|
+
* @returns Promise resolving to market details
|
|
1560
|
+
* @throws Error if API request fails or market not found
|
|
1561
|
+
*
|
|
1562
|
+
* @example
|
|
1563
|
+
* ```typescript
|
|
1564
|
+
* const market = await fetcher.getMarket('bitcoin-price-2024');
|
|
1565
|
+
* console.log(`Market: ${market.title}`);
|
|
1566
|
+
*
|
|
1567
|
+
* // Venue is now cached for order signing
|
|
1568
|
+
* await orderClient.createOrder({
|
|
1569
|
+
* marketSlug: 'bitcoin-price-2024',
|
|
1570
|
+
* ...
|
|
1571
|
+
* });
|
|
1572
|
+
* ```
|
|
1573
|
+
*/
|
|
1574
|
+
async getMarket(slug) {
|
|
1575
|
+
this.logger.debug("Fetching market", { slug });
|
|
1576
|
+
try {
|
|
1577
|
+
const market = await this.httpClient.get(`/markets/${slug}`);
|
|
1578
|
+
if (market.venue) {
|
|
1579
|
+
this.venueCache.set(slug, market.venue);
|
|
1580
|
+
this.logger.debug("Venue cached for order signing", {
|
|
1581
|
+
slug,
|
|
1582
|
+
exchange: market.venue.exchange,
|
|
1583
|
+
adapter: market.venue.adapter,
|
|
1584
|
+
cacheSize: this.venueCache.size
|
|
1585
|
+
});
|
|
1586
|
+
} else {
|
|
1587
|
+
this.logger.warn("Market has no venue data", { slug });
|
|
1588
|
+
}
|
|
1589
|
+
this.logger.info("Market fetched successfully", {
|
|
1590
|
+
slug,
|
|
1591
|
+
title: market.title
|
|
1592
|
+
});
|
|
1593
|
+
return market;
|
|
1594
|
+
} catch (error) {
|
|
1595
|
+
this.logger.error("Failed to fetch market", error, { slug });
|
|
1596
|
+
throw error;
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
/**
|
|
1600
|
+
* Gets cached venue information for a market.
|
|
1601
|
+
*
|
|
1602
|
+
* @remarks
|
|
1603
|
+
* Returns venue data previously cached by getMarket() call.
|
|
1604
|
+
* Used internally by OrderClient for efficient order signing.
|
|
1605
|
+
*
|
|
1606
|
+
* @param slug - Market slug identifier
|
|
1607
|
+
* @returns Cached venue information, or undefined if not in cache
|
|
1608
|
+
*
|
|
1609
|
+
* @example
|
|
1610
|
+
* ```typescript
|
|
1611
|
+
* const venue = fetcher.getVenue('bitcoin-price-2024');
|
|
1612
|
+
* if (venue) {
|
|
1613
|
+
* console.log(`Exchange: ${venue.exchange}`);
|
|
1614
|
+
* }
|
|
1615
|
+
* ```
|
|
1616
|
+
*/
|
|
1617
|
+
getVenue(slug) {
|
|
1618
|
+
const venue = this.venueCache.get(slug);
|
|
1619
|
+
if (venue) {
|
|
1620
|
+
this.logger.debug("Venue cache hit", {
|
|
1621
|
+
slug,
|
|
1622
|
+
exchange: venue.exchange
|
|
1623
|
+
});
|
|
1624
|
+
} else {
|
|
1625
|
+
this.logger.debug("Venue cache miss", { slug });
|
|
1626
|
+
}
|
|
1627
|
+
return venue;
|
|
1628
|
+
}
|
|
1629
|
+
/**
|
|
1630
|
+
* Gets the orderbook for a CLOB market.
|
|
1631
|
+
*
|
|
1632
|
+
* @param slug - Market slug identifier
|
|
1633
|
+
* @returns Promise resolving to orderbook data
|
|
1634
|
+
* @throws Error if API request fails
|
|
1635
|
+
*
|
|
1636
|
+
* @example
|
|
1637
|
+
* ```typescript
|
|
1638
|
+
* const orderbook = await fetcher.getOrderBook('bitcoin-price-2024');
|
|
1639
|
+
* console.log(`Bids: ${orderbook.bids.length}, Asks: ${orderbook.asks.length}`);
|
|
1640
|
+
* ```
|
|
1641
|
+
*/
|
|
1642
|
+
async getOrderBook(slug) {
|
|
1643
|
+
this.logger.debug("Fetching orderbook", { slug });
|
|
1644
|
+
try {
|
|
1645
|
+
const orderbook = await this.httpClient.get(
|
|
1646
|
+
`/markets/${slug}/orderbook`
|
|
1647
|
+
);
|
|
1648
|
+
this.logger.info("Orderbook fetched successfully", {
|
|
1649
|
+
slug,
|
|
1650
|
+
bids: orderbook.bids.length,
|
|
1651
|
+
asks: orderbook.asks.length,
|
|
1652
|
+
tokenId: orderbook.tokenId
|
|
1653
|
+
});
|
|
1654
|
+
return orderbook;
|
|
1655
|
+
} catch (error) {
|
|
1656
|
+
this.logger.error("Failed to fetch orderbook", error, { slug });
|
|
1657
|
+
throw error;
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
/**
|
|
1661
|
+
* Gets the current price for a token.
|
|
1662
|
+
*
|
|
1663
|
+
* @param tokenId - Token ID
|
|
1664
|
+
* @returns Promise resolving to price information
|
|
1665
|
+
* @throws Error if API request fails
|
|
1666
|
+
*
|
|
1667
|
+
* @example
|
|
1668
|
+
* ```typescript
|
|
1669
|
+
* const price = await fetcher.getPrice('123456');
|
|
1670
|
+
* console.log(`Current price: ${price.price}`);
|
|
1671
|
+
* ```
|
|
1672
|
+
*/
|
|
1673
|
+
async getPrice(tokenId) {
|
|
1674
|
+
this.logger.debug("Fetching price", { tokenId });
|
|
1675
|
+
try {
|
|
1676
|
+
const price = await this.httpClient.get(`/prices/${tokenId}`);
|
|
1677
|
+
this.logger.info("Price fetched successfully", {
|
|
1678
|
+
tokenId,
|
|
1679
|
+
price: price.price
|
|
1680
|
+
});
|
|
1681
|
+
return price;
|
|
1682
|
+
} catch (error) {
|
|
1683
|
+
this.logger.error("Failed to fetch price", error, { tokenId });
|
|
1684
|
+
throw error;
|
|
1685
|
+
}
|
|
1686
|
+
}
|
|
1687
|
+
};
|
|
1688
|
+
|
|
1482
1689
|
// src/orders/client.ts
|
|
1483
1690
|
var OrderClient = class {
|
|
1484
1691
|
/**
|
|
1485
1692
|
* Creates a new order client instance.
|
|
1486
1693
|
*
|
|
1487
1694
|
* @param config - Order client configuration
|
|
1488
|
-
*
|
|
1489
|
-
* @throws Error if neither marketType nor signingConfig is provided
|
|
1490
1695
|
*/
|
|
1491
1696
|
constructor(config) {
|
|
1492
1697
|
this.httpClient = config.httpClient;
|
|
@@ -1495,32 +1700,18 @@ var OrderClient = class {
|
|
|
1495
1700
|
const feeRateBps = config.userData.feeRateBps;
|
|
1496
1701
|
this.orderBuilder = new OrderBuilder(config.wallet.address, feeRateBps, 1e-3);
|
|
1497
1702
|
this.orderSigner = new OrderSigner(config.wallet, this.logger);
|
|
1703
|
+
this.marketFetcher = config.marketFetcher || new MarketFetcher(config.httpClient, this.logger);
|
|
1498
1704
|
if (config.signingConfig) {
|
|
1499
1705
|
this.signingConfig = config.signingConfig;
|
|
1500
|
-
} else if (config.marketType) {
|
|
1501
|
-
const chainId = parseInt(process.env.CHAIN_ID || "8453");
|
|
1502
|
-
const contractAddress = config.marketType === "NEGRISK" /* NEGRISK */ ? process.env.NEGRISK_CONTRACT_ADDRESS || getContractAddress("NEGRISK", chainId) : process.env.CLOB_CONTRACT_ADDRESS || getContractAddress("CLOB", chainId);
|
|
1503
|
-
this.signingConfig = {
|
|
1504
|
-
chainId,
|
|
1505
|
-
contractAddress,
|
|
1506
|
-
marketType: config.marketType
|
|
1507
|
-
};
|
|
1508
|
-
this.logger.info("Auto-configured signing", {
|
|
1509
|
-
chainId,
|
|
1510
|
-
contractAddress,
|
|
1511
|
-
marketType: config.marketType
|
|
1512
|
-
});
|
|
1513
1706
|
} else {
|
|
1514
1707
|
const chainId = parseInt(process.env.CHAIN_ID || "8453");
|
|
1515
|
-
const contractAddress =
|
|
1708
|
+
const contractAddress = ZERO_ADDRESS;
|
|
1516
1709
|
this.signingConfig = {
|
|
1517
|
-
chainId,
|
|
1518
|
-
contractAddress,
|
|
1519
|
-
marketType: "CLOB" /* CLOB */
|
|
1520
|
-
};
|
|
1521
|
-
this.logger.debug("Using default CLOB configuration", {
|
|
1522
1710
|
chainId,
|
|
1523
1711
|
contractAddress
|
|
1712
|
+
};
|
|
1713
|
+
this.logger.info("Auto-configured signing (contract address from venue)", {
|
|
1714
|
+
chainId
|
|
1524
1715
|
});
|
|
1525
1716
|
}
|
|
1526
1717
|
}
|
|
@@ -1529,24 +1720,31 @@ var OrderClient = class {
|
|
|
1529
1720
|
*
|
|
1530
1721
|
* @remarks
|
|
1531
1722
|
* This method handles the complete order creation flow:
|
|
1532
|
-
* 1.
|
|
1533
|
-
* 2.
|
|
1534
|
-
* 3.
|
|
1723
|
+
* 1. Resolve venue address (from cache or API)
|
|
1724
|
+
* 2. Build unsigned order
|
|
1725
|
+
* 3. Sign with EIP-712 using venue.exchange as verifyingContract
|
|
1726
|
+
* 4. Submit to API
|
|
1727
|
+
*
|
|
1728
|
+
* Performance best practice: Always call marketFetcher.getMarket(marketSlug)
|
|
1729
|
+
* before createOrder() to cache venue data and avoid additional API requests.
|
|
1535
1730
|
*
|
|
1536
1731
|
* @param params - Order parameters
|
|
1537
1732
|
* @returns Promise resolving to order response
|
|
1538
1733
|
*
|
|
1539
|
-
* @throws Error if order creation fails
|
|
1734
|
+
* @throws Error if order creation fails or venue not found
|
|
1540
1735
|
*
|
|
1541
1736
|
* @example
|
|
1542
1737
|
* ```typescript
|
|
1738
|
+
* // Best practice: fetch market first to cache venue
|
|
1739
|
+
* const market = await marketFetcher.getMarket('bitcoin-2024');
|
|
1740
|
+
*
|
|
1543
1741
|
* const order = await orderClient.createOrder({
|
|
1544
|
-
* tokenId:
|
|
1742
|
+
* tokenId: market.tokens.yes,
|
|
1545
1743
|
* price: 0.65,
|
|
1546
1744
|
* size: 100,
|
|
1547
1745
|
* side: Side.BUY,
|
|
1548
1746
|
* orderType: OrderType.GTC,
|
|
1549
|
-
* marketSlug: '
|
|
1747
|
+
* marketSlug: 'bitcoin-2024'
|
|
1550
1748
|
* });
|
|
1551
1749
|
*
|
|
1552
1750
|
* console.log(`Order created: ${order.order.id}`);
|
|
@@ -1558,6 +1756,29 @@ var OrderClient = class {
|
|
|
1558
1756
|
orderType: params.orderType,
|
|
1559
1757
|
marketSlug: params.marketSlug
|
|
1560
1758
|
});
|
|
1759
|
+
let venue = this.marketFetcher.getVenue(params.marketSlug);
|
|
1760
|
+
if (!venue) {
|
|
1761
|
+
this.logger.warn(
|
|
1762
|
+
"Venue not cached, fetching market details. For better performance, call marketFetcher.getMarket() before createOrder().",
|
|
1763
|
+
{ marketSlug: params.marketSlug }
|
|
1764
|
+
);
|
|
1765
|
+
const market = await this.marketFetcher.getMarket(params.marketSlug);
|
|
1766
|
+
if (!market.venue) {
|
|
1767
|
+
throw new Error(
|
|
1768
|
+
`Market ${params.marketSlug} does not have venue information. Venue data is required for order signing.`
|
|
1769
|
+
);
|
|
1770
|
+
}
|
|
1771
|
+
venue = market.venue;
|
|
1772
|
+
}
|
|
1773
|
+
const dynamicSigningConfig = {
|
|
1774
|
+
...this.signingConfig,
|
|
1775
|
+
contractAddress: venue.exchange
|
|
1776
|
+
};
|
|
1777
|
+
this.logger.debug("Using venue for order signing", {
|
|
1778
|
+
marketSlug: params.marketSlug,
|
|
1779
|
+
exchange: venue.exchange,
|
|
1780
|
+
adapter: venue.adapter
|
|
1781
|
+
});
|
|
1561
1782
|
const unsignedOrder = this.orderBuilder.buildOrder(params);
|
|
1562
1783
|
this.logger.debug("Built unsigned order", {
|
|
1563
1784
|
salt: unsignedOrder.salt,
|
|
@@ -1566,7 +1787,7 @@ var OrderClient = class {
|
|
|
1566
1787
|
});
|
|
1567
1788
|
const signature = await this.orderSigner.signOrder(
|
|
1568
1789
|
unsignedOrder,
|
|
1569
|
-
|
|
1790
|
+
dynamicSigningConfig
|
|
1570
1791
|
);
|
|
1571
1792
|
const payload = {
|
|
1572
1793
|
order: {
|
|
@@ -1749,162 +1970,6 @@ var OrderClient = class {
|
|
|
1749
1970
|
}
|
|
1750
1971
|
};
|
|
1751
1972
|
|
|
1752
|
-
// src/markets/fetcher.ts
|
|
1753
|
-
var MarketFetcher = class {
|
|
1754
|
-
/**
|
|
1755
|
-
* Creates a new market fetcher instance.
|
|
1756
|
-
*
|
|
1757
|
-
* @param httpClient - HTTP client for API requests
|
|
1758
|
-
* @param logger - Optional logger for debugging (default: no logging)
|
|
1759
|
-
*
|
|
1760
|
-
* @example
|
|
1761
|
-
* ```typescript
|
|
1762
|
-
* const fetcher = new MarketFetcher(httpClient);
|
|
1763
|
-
* ```
|
|
1764
|
-
*/
|
|
1765
|
-
constructor(httpClient, logger) {
|
|
1766
|
-
this.httpClient = httpClient;
|
|
1767
|
-
this.logger = logger || new NoOpLogger();
|
|
1768
|
-
}
|
|
1769
|
-
/**
|
|
1770
|
-
* Gets active markets with query parameters and pagination support.
|
|
1771
|
-
*
|
|
1772
|
-
* @param params - Query parameters for filtering and pagination
|
|
1773
|
-
* @returns Promise resolving to active markets response
|
|
1774
|
-
* @throws Error if API request fails
|
|
1775
|
-
*
|
|
1776
|
-
* @example
|
|
1777
|
-
* ```typescript
|
|
1778
|
-
* // Get 8 markets sorted by LP rewards
|
|
1779
|
-
* const response = await fetcher.getActiveMarkets({
|
|
1780
|
-
* limit: 8,
|
|
1781
|
-
* sortBy: 'lp_rewards'
|
|
1782
|
-
* });
|
|
1783
|
-
* console.log(`Found ${response.data.length} of ${response.totalMarketsCount} markets`);
|
|
1784
|
-
*
|
|
1785
|
-
* // Get page 2
|
|
1786
|
-
* const page2 = await fetcher.getActiveMarkets({
|
|
1787
|
-
* limit: 8,
|
|
1788
|
-
* page: 2,
|
|
1789
|
-
* sortBy: 'ending_soon'
|
|
1790
|
-
* });
|
|
1791
|
-
* ```
|
|
1792
|
-
*/
|
|
1793
|
-
async getActiveMarkets(params) {
|
|
1794
|
-
const queryParams = new URLSearchParams();
|
|
1795
|
-
if (params?.limit !== void 0) {
|
|
1796
|
-
queryParams.append("limit", params.limit.toString());
|
|
1797
|
-
}
|
|
1798
|
-
if (params?.page !== void 0) {
|
|
1799
|
-
queryParams.append("page", params.page.toString());
|
|
1800
|
-
}
|
|
1801
|
-
if (params?.sortBy) {
|
|
1802
|
-
queryParams.append("sortBy", params.sortBy);
|
|
1803
|
-
}
|
|
1804
|
-
const queryString = queryParams.toString();
|
|
1805
|
-
const endpoint = `/markets/active${queryString ? `?${queryString}` : ""}`;
|
|
1806
|
-
this.logger.debug("Fetching active markets", { params });
|
|
1807
|
-
try {
|
|
1808
|
-
const response = await this.httpClient.get(endpoint);
|
|
1809
|
-
this.logger.info("Active markets fetched successfully", {
|
|
1810
|
-
count: response.data.length,
|
|
1811
|
-
total: response.totalMarketsCount,
|
|
1812
|
-
sortBy: params?.sortBy,
|
|
1813
|
-
page: params?.page
|
|
1814
|
-
});
|
|
1815
|
-
return response;
|
|
1816
|
-
} catch (error) {
|
|
1817
|
-
this.logger.error("Failed to fetch active markets", error, { params });
|
|
1818
|
-
throw error;
|
|
1819
|
-
}
|
|
1820
|
-
}
|
|
1821
|
-
/**
|
|
1822
|
-
* Gets a single market by slug.
|
|
1823
|
-
*
|
|
1824
|
-
* @param slug - Market slug identifier
|
|
1825
|
-
* @returns Promise resolving to market details
|
|
1826
|
-
* @throws Error if API request fails or market not found
|
|
1827
|
-
*
|
|
1828
|
-
* @example
|
|
1829
|
-
* ```typescript
|
|
1830
|
-
* const market = await fetcher.getMarket('bitcoin-price-2024');
|
|
1831
|
-
* console.log(`Market: ${market.title}`);
|
|
1832
|
-
* ```
|
|
1833
|
-
*/
|
|
1834
|
-
async getMarket(slug) {
|
|
1835
|
-
this.logger.debug("Fetching market", { slug });
|
|
1836
|
-
try {
|
|
1837
|
-
const market = await this.httpClient.get(`/markets/${slug}`);
|
|
1838
|
-
this.logger.info("Market fetched successfully", {
|
|
1839
|
-
slug,
|
|
1840
|
-
title: market.title
|
|
1841
|
-
});
|
|
1842
|
-
return market;
|
|
1843
|
-
} catch (error) {
|
|
1844
|
-
this.logger.error("Failed to fetch market", error, { slug });
|
|
1845
|
-
throw error;
|
|
1846
|
-
}
|
|
1847
|
-
}
|
|
1848
|
-
/**
|
|
1849
|
-
* Gets the orderbook for a CLOB market.
|
|
1850
|
-
*
|
|
1851
|
-
* @param slug - Market slug identifier
|
|
1852
|
-
* @returns Promise resolving to orderbook data
|
|
1853
|
-
* @throws Error if API request fails
|
|
1854
|
-
*
|
|
1855
|
-
* @example
|
|
1856
|
-
* ```typescript
|
|
1857
|
-
* const orderbook = await fetcher.getOrderBook('bitcoin-price-2024');
|
|
1858
|
-
* console.log(`Bids: ${orderbook.bids.length}, Asks: ${orderbook.asks.length}`);
|
|
1859
|
-
* ```
|
|
1860
|
-
*/
|
|
1861
|
-
async getOrderBook(slug) {
|
|
1862
|
-
this.logger.debug("Fetching orderbook", { slug });
|
|
1863
|
-
try {
|
|
1864
|
-
const orderbook = await this.httpClient.get(
|
|
1865
|
-
`/markets/${slug}/orderbook`
|
|
1866
|
-
);
|
|
1867
|
-
this.logger.info("Orderbook fetched successfully", {
|
|
1868
|
-
slug,
|
|
1869
|
-
bids: orderbook.bids.length,
|
|
1870
|
-
asks: orderbook.asks.length,
|
|
1871
|
-
tokenId: orderbook.tokenId
|
|
1872
|
-
});
|
|
1873
|
-
return orderbook;
|
|
1874
|
-
} catch (error) {
|
|
1875
|
-
this.logger.error("Failed to fetch orderbook", error, { slug });
|
|
1876
|
-
throw error;
|
|
1877
|
-
}
|
|
1878
|
-
}
|
|
1879
|
-
/**
|
|
1880
|
-
* Gets the current price for a token.
|
|
1881
|
-
*
|
|
1882
|
-
* @param tokenId - Token ID
|
|
1883
|
-
* @returns Promise resolving to price information
|
|
1884
|
-
* @throws Error if API request fails
|
|
1885
|
-
*
|
|
1886
|
-
* @example
|
|
1887
|
-
* ```typescript
|
|
1888
|
-
* const price = await fetcher.getPrice('123456');
|
|
1889
|
-
* console.log(`Current price: ${price.price}`);
|
|
1890
|
-
* ```
|
|
1891
|
-
*/
|
|
1892
|
-
async getPrice(tokenId) {
|
|
1893
|
-
this.logger.debug("Fetching price", { tokenId });
|
|
1894
|
-
try {
|
|
1895
|
-
const price = await this.httpClient.get(`/prices/${tokenId}`);
|
|
1896
|
-
this.logger.info("Price fetched successfully", {
|
|
1897
|
-
tokenId,
|
|
1898
|
-
price: price.price
|
|
1899
|
-
});
|
|
1900
|
-
return price;
|
|
1901
|
-
} catch (error) {
|
|
1902
|
-
this.logger.error("Failed to fetch price", error, { tokenId });
|
|
1903
|
-
throw error;
|
|
1904
|
-
}
|
|
1905
|
-
}
|
|
1906
|
-
};
|
|
1907
|
-
|
|
1908
1973
|
// src/portfolio/fetcher.ts
|
|
1909
1974
|
var PortfolioFetcher = class {
|
|
1910
1975
|
/**
|
|
@@ -2555,7 +2620,6 @@ var WebSocketClient = class {
|
|
|
2555
2620
|
DEFAULT_WS_URL,
|
|
2556
2621
|
HttpClient,
|
|
2557
2622
|
MarketFetcher,
|
|
2558
|
-
MarketType,
|
|
2559
2623
|
MessageSigner,
|
|
2560
2624
|
NoOpLogger,
|
|
2561
2625
|
OrderBuilder,
|