@polymarket/clob-client-v2 1.0.3-canary.0 → 1.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/dist/index.cjs CHANGED
@@ -141,6 +141,28 @@ var ApiError = class extends Error {
141
141
  }
142
142
  };
143
143
 
144
+ // src/fees/index.ts
145
+ var MIN_FEE_SLIPPAGE_PERCENTAGE = 1;
146
+ var MAX_FEE_SLIPPAGE_PERCENTAGE = 100;
147
+ function validateFeeSlippage(feeSlippage) {
148
+ if (!Number.isFinite(feeSlippage) || feeSlippage < 0 || feeSlippage > MAX_FEE_SLIPPAGE_PERCENTAGE || feeSlippage > 0 && feeSlippage < MIN_FEE_SLIPPAGE_PERCENTAGE) {
149
+ throw new Error("feeSlippage must be 0 or a percentage between 1 and 100");
150
+ }
151
+ }
152
+ function adjustBuyAmountForFees(amount, price, userUSDCBalance, feeRate, feeExponent, builderTakerFeeRate, feeSlippage = 0) {
153
+ validateFeeSlippage(feeSlippage);
154
+ const platformFeeRate = feeRate * (price * (1 - price)) ** feeExponent;
155
+ const effectivePlatformFeeRate = platformFeeRate * (1 + feeSlippage / 100);
156
+ const feeBaseAmount = Math.min(amount, userUSDCBalance);
157
+ const platformFee = feeBaseAmount / price * effectivePlatformFeeRate;
158
+ const builderFee = feeBaseAmount * builderTakerFeeRate;
159
+ const totalCost = amount + platformFee + builderFee;
160
+ if (userUSDCBalance <= totalCost) {
161
+ return Math.max(userUSDCBalance - platformFee - builderFee, 0);
162
+ }
163
+ return amount;
164
+ }
165
+
144
166
  // src/signing/constants.ts
145
167
  var MSG_TO_SIGN = "This message attests that I control the given wallet";
146
168
 
@@ -1372,15 +1394,6 @@ var OrderBuilder = class {
1372
1394
  };
1373
1395
 
1374
1396
  // src/client.ts
1375
- function adjustBuyAmountForFees(amount, price, userUSDCBalance, feeRate, feeExponent, builderTakerFeeRate) {
1376
- const platformFeeRate = feeRate * (price * (1 - price)) ** feeExponent;
1377
- const platformFee = amount / price * platformFeeRate;
1378
- const totalCost = amount + platformFee + amount * builderTakerFeeRate;
1379
- if (userUSDCBalance <= totalCost) {
1380
- return userUSDCBalance / (1 + platformFeeRate / price + builderTakerFeeRate);
1381
- }
1382
- return amount;
1383
- }
1384
1397
  var ClobClient = class {
1385
1398
  host;
1386
1399
  chainId;
@@ -1403,6 +1416,7 @@ var ClobClient = class {
1403
1416
  cachedVersion;
1404
1417
  retryOnError;
1405
1418
  throwOnError;
1419
+ feeSlippage;
1406
1420
  constructor({
1407
1421
  host,
1408
1422
  chain,
@@ -1414,7 +1428,8 @@ var ClobClient = class {
1414
1428
  builderConfig,
1415
1429
  getSigner,
1416
1430
  retryOnError,
1417
- throwOnError
1431
+ throwOnError,
1432
+ feeSlippage
1418
1433
  }) {
1419
1434
  this.host = host.endsWith("/") ? host.slice(0, -1) : host;
1420
1435
  this.chainId = chain;
@@ -1441,6 +1456,8 @@ var ClobClient = class {
1441
1456
  this.tokenConditionMap = {};
1442
1457
  this.retryOnError = retryOnError;
1443
1458
  this.throwOnError = throwOnError;
1459
+ this.feeSlippage = feeSlippage ?? 0;
1460
+ validateFeeSlippage(this.feeSlippage);
1444
1461
  this.useServerTime = useServerTime;
1445
1462
  if (builderConfig !== void 0) {
1446
1463
  this.builderConfig = builderConfig;
@@ -1938,8 +1955,19 @@ var ClobClient = class {
1938
1955
  `invalid price (${orderToSign.price}), min: ${parseFloat(tickSize)} - max: ${1 - parseFloat(tickSize)}`
1939
1956
  );
1940
1957
  }
1941
- const negRisk = options?.negRisk ?? await this.getNegRisk(tokenID);
1958
+ orderToSign.price = roundNormal(orderToSign.price, ROUNDING_CONFIG[tickSize].price);
1942
1959
  const version = await this.resolveVersion();
1960
+ if (version === 2 && orderToSign.side === "BUY" /* BUY */ && "userUSDCBalance" in orderToSign && orderToSign.userUSDCBalance !== void 0) {
1961
+ const adjustedAmount = await this.adjustBuyAmountForBalance(
1962
+ tokenID,
1963
+ orderToSign.size * orderToSign.price,
1964
+ orderToSign.price,
1965
+ orderToSign.userUSDCBalance,
1966
+ orderToSign.builderCode
1967
+ );
1968
+ orderToSign.size = adjustedAmount / orderToSign.price;
1969
+ }
1970
+ const negRisk = options?.negRisk ?? await this.getNegRisk(tokenID);
1943
1971
  if (version === 1) {
1944
1972
  const userFeeRateBps = "feeRateBps" in orderToSign ? orderToSign.feeRateBps : void 0;
1945
1973
  const feeRateBps = await this._resolveFeeRateBps(tokenID, userFeeRateBps);
@@ -1979,15 +2007,12 @@ var ClobClient = class {
1979
2007
  await this.ensureBuilderFeeRateCached(orderToSign.builderCode);
1980
2008
  if (orderToSign.side === "BUY" /* BUY */ && "userUSDCBalance" in orderToSign && orderToSign.userUSDCBalance !== void 0) {
1981
2009
  const price = orderToSign.price;
1982
- const { userUSDCBalance } = orderToSign;
1983
- const builderTakerFeeRate = this.isBuilderOrder(orderToSign.builderCode) ? this.builderFeeRates[orderToSign.builderCode ?? ""]?.taker ?? 0 : 0;
1984
- orderToSign.amount = adjustBuyAmountForFees(
2010
+ orderToSign.amount = await this.adjustBuyAmountForBalance(
2011
+ tokenID,
1985
2012
  orderToSign.amount,
1986
2013
  price,
1987
- userUSDCBalance,
1988
- this.feeInfos[tokenID].rate,
1989
- this.feeInfos[tokenID].exponent,
1990
- builderTakerFeeRate
2014
+ orderToSign.userUSDCBalance,
2015
+ orderToSign.builderCode
1991
2016
  );
1992
2017
  }
1993
2018
  const negRisk = options?.negRisk ?? await this.getNegRisk(tokenID);
@@ -2447,6 +2472,24 @@ var ClobClient = class {
2447
2472
  isBuilderOrder(builderCode) {
2448
2473
  return builderCode !== void 0 && builderCode !== bytes32Zero;
2449
2474
  }
2475
+ async getBuilderTakerFeeRate(builderCode) {
2476
+ if (!this.isBuilderOrder(builderCode)) return 0;
2477
+ await this.ensureBuilderFeeRateCached(builderCode);
2478
+ return this.builderFeeRates[builderCode ?? ""]?.taker ?? 0;
2479
+ }
2480
+ async adjustBuyAmountForBalance(tokenID, amount, price, userUSDCBalance, builderCode) {
2481
+ await this._ensureMarketInfoCached(tokenID);
2482
+ const builderTakerFeeRate = await this.getBuilderTakerFeeRate(builderCode);
2483
+ return adjustBuyAmountForFees(
2484
+ amount,
2485
+ price,
2486
+ userUSDCBalance,
2487
+ this.feeInfos[tokenID].rate,
2488
+ this.feeInfos[tokenID].exponent,
2489
+ builderTakerFeeRate,
2490
+ this.feeSlippage
2491
+ );
2492
+ }
2450
2493
  async _ensureMarketInfoCached(tokenID) {
2451
2494
  if (tokenID in this.feeInfos) return;
2452
2495
  if (!(tokenID in this.tokenConditionMap)) {